aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java')
-rw-r--r--main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java175
1 files changed, 175 insertions, 0 deletions
diff --git a/main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java b/main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java
new file mode 100644
index 00000000..cebee1b5
--- /dev/null
+++ b/main/src/main/java/org/onap/policy/pap/main/service/ToscaServiceTemplateService.java
@@ -0,0 +1,175 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2022 Bell Canada. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.main.service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import javax.ws.rs.core.Response;
+import lombok.RequiredArgsConstructor;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.provider.SimpleToscaProvider;
+import org.onap.policy.models.tosca.utils.ToscaUtils;
+import org.onap.policy.pap.main.repository.ToscaServiceTemplateRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional(readOnly = true)
+@RequiredArgsConstructor
+public class ToscaServiceTemplateService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ToscaServiceTemplateService.class);
+
+ private final ToscaServiceTemplateRepository serviceTemplateRepository;
+
+ /**
+ * Get policies.
+ *
+ * @param name the name of the policy to get, null to get all policies
+ * @param version the version of the policy to get, null to get all versions of a policy
+ * @return the policies found
+ * @throws PfModelException on errors getting policies
+ */
+ public List<ToscaPolicy> getPolicyList(final String name, final String version) throws PfModelException {
+
+ LOGGER.debug("->getPolicyList: name={}, version={}", name, version);
+
+ List<ToscaPolicy> policyList;
+
+ try {
+ List<Map<String, ToscaPolicy>> policies = getToscaServiceTemplate(name, version, "policy").toAuthorative()
+ .getToscaTopologyTemplate().getPolicies();
+ policyList = policies.stream().flatMap(policy -> policy.values().stream()).collect(Collectors.toList());
+ } catch (PfModelRuntimeException pfme) {
+ return handlePfModelRuntimeException(pfme);
+ } catch (Exception exc) {
+ String errorMsg = "Failed to fetch policy with name " + name + " and version " + version + ".";
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMsg, exc);
+ }
+
+ LOGGER.debug("<-getPolicyList: name={}, version={}, policyList={}", name, version, policyList);
+ return policyList;
+ }
+
+ /**
+ * Get policy types.
+ *
+ * @param name the name of the policy type to get, set to null to get all policy types
+ * @param version the version of the policy type to get, set to null to get all versions
+ * @return the policy types found
+ * @throws PfModelException on errors getting policy types
+ */
+ public List<ToscaPolicyType> getPolicyTypeList(final String name, final String version) throws PfModelException {
+
+ LOGGER.debug("->getPolicyTypeList: name={}, version={}", name, version);
+
+ List<ToscaPolicyType> policyTypeList;
+
+ try {
+ policyTypeList = new ArrayList<>(
+ getToscaServiceTemplate(name, version, "policyType").toAuthorative().getPolicyTypes().values());
+ } catch (PfModelRuntimeException pfme) {
+ return handlePfModelRuntimeException(pfme);
+ } catch (Exception exc) {
+ String errorMsg = "Failed to fetch policy type with name " + name + " and version " + version + ".";
+ throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMsg, exc);
+ }
+
+ LOGGER.debug("<-getPolicyTypeList: name={}, version={}, policyTypeList={}", name, version, policyTypeList);
+ return policyTypeList;
+ }
+
+ private JpaToscaServiceTemplate getToscaServiceTemplate(final String name, final String version, final String type)
+ throws PfModelException {
+
+ Optional<JpaToscaServiceTemplate> serviceTemplate = serviceTemplateRepository
+ .findById(new PfConceptKey(JpaToscaServiceTemplate.DEFAULT_NAME, JpaToscaServiceTemplate.DEFAULT_VERSION));
+ if (serviceTemplate.isEmpty()) {
+ throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "service template not found in database");
+ }
+
+ LOGGER.debug("<-getServiceTemplate: serviceTemplate={}", serviceTemplate.get());
+ JpaToscaServiceTemplate dbServiceTemplate = serviceTemplate.get();
+
+ JpaToscaServiceTemplate returnServiceTemplate;
+ if (type.equals("policy")) {
+ returnServiceTemplate = getToscaPolicies(name, version, dbServiceTemplate);
+ } else {
+ returnServiceTemplate = getToscaPolicyTypes(name, version, dbServiceTemplate);
+ }
+ return returnServiceTemplate;
+ }
+
+ private JpaToscaServiceTemplate getToscaPolicies(final String name, final String version,
+ JpaToscaServiceTemplate dbServiceTemplate) throws PfModelException {
+ if (!ToscaUtils.doPoliciesExist(dbServiceTemplate)) {
+ throw new PfModelRuntimeException(Response.Status.NOT_FOUND,
+ "policies for " + name + ":" + version + " do not exist");
+ }
+
+ JpaToscaServiceTemplate returnServiceTemplate =
+ new SimpleToscaProvider().getCascadedPolicies(dbServiceTemplate, name, version);
+
+ LOGGER.debug("<-getPolicies: name={}, version={}, serviceTemplate={}", name, version, returnServiceTemplate);
+ return returnServiceTemplate;
+ }
+
+ private JpaToscaServiceTemplate getToscaPolicyTypes(final String name, final String version,
+ JpaToscaServiceTemplate dbServiceTemplate) throws PfModelException {
+ if (!ToscaUtils.doPolicyTypesExist(dbServiceTemplate)) {
+ throw new PfModelRuntimeException(Response.Status.NOT_FOUND,
+ "policy types for " + name + ":" + version + " do not exist");
+ }
+
+ JpaToscaServiceTemplate returnServiceTemplate =
+ new SimpleToscaProvider().getCascadedPolicyTypes(dbServiceTemplate, name, version);
+
+ LOGGER.debug("<-getPolicyTypes: name={}, version={}, serviceTemplate={}", name, version, returnServiceTemplate);
+ return returnServiceTemplate;
+ }
+
+ /**
+ * Handle a PfModelRuntimeException on a list call.
+ *
+ * @param pfme the model exception
+ * @return an empty list on 404
+ */
+ private <T extends ToscaEntity> List<T> handlePfModelRuntimeException(final PfModelRuntimeException pfme) {
+ if (Response.Status.NOT_FOUND.equals(pfme.getErrorResponse().getResponseCode())) {
+ LOGGER.trace("request did not find any results", pfme);
+ return Collections.emptyList();
+ } else {
+ throw pfme;
+ }
+ }
+}