2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2022 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.models.acm.persistence.provider;
23 import java.util.HashMap;
24 import java.util.List;
26 import javax.ws.rs.core.Response;
27 import javax.ws.rs.core.Response.Status;
28 import lombok.RequiredArgsConstructor;
29 import org.onap.policy.clamp.models.acm.persistence.repository.ToscaServiceTemplateRepository;
30 import org.onap.policy.models.base.PfConceptKey;
31 import org.onap.policy.models.base.PfModelException;
32 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
33 import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
34 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
35 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
36 import org.springframework.stereotype.Service;
37 import org.springframework.transaction.annotation.Transactional;
41 @RequiredArgsConstructor
42 public class ServiceTemplateProvider {
44 private final ToscaServiceTemplateRepository serviceTemplateRepository;
47 * Create service template.
49 * @param serviceTemplate the service template to be created
50 * @return the created service template
51 * @throws PfModelException on errors creating the service template
53 public ToscaServiceTemplate createServiceTemplate(final ToscaServiceTemplate serviceTemplate)
54 throws PfModelException {
56 var result = serviceTemplateRepository.save(ProviderUtils.getJpaAndValidate(serviceTemplate,
57 JpaToscaServiceTemplate::new, "toscaServiceTemplate"));
58 return result.toAuthorative();
59 } catch (IllegalArgumentException e) {
60 throw new PfModelException(Status.BAD_REQUEST, "Error in save serviceTemplate", e);
65 * Delete service template.
67 * @param name the name of the service template to delete.
68 * @param version the version of the service template to delete.
69 * @return the TOSCA service template that was deleted
70 * @throws PfModelException on errors deleting policy types
72 public ToscaServiceTemplate deleteServiceTemplate(final String name, final String version) throws PfModelException {
73 var serviceTemplateKey = new PfConceptKey(name, version);
74 var jpaDelete = serviceTemplateRepository.findById(serviceTemplateKey);
75 if (jpaDelete.isEmpty()) {
76 String errorMessage = "delete of serviceTemplate \"" + serviceTemplateKey.getId()
77 + "\" failed, serviceTemplate does not exist";
78 throw new PfModelException(Response.Status.BAD_REQUEST, errorMessage);
80 serviceTemplateRepository.deleteById(serviceTemplateKey);
81 return jpaDelete.get().toAuthorative();
85 * Get the requested automation composition definitions.
87 * @param name the name of the definition to get, null for all definitions
88 * @param version the version of the definition to get, null for all definitions
89 * @return the automation composition definitions
90 * @throws PfModelException on errors getting automation composition definitions
92 @Transactional(readOnly = true)
93 public ToscaServiceTemplate getToscaServiceTemplate(String name, String version) throws PfModelException {
94 var serviceTemplateKey = new PfConceptKey(name, version);
95 var jpaServiceTemplates = serviceTemplateRepository.findById(serviceTemplateKey);
96 if (jpaServiceTemplates.isEmpty()) {
97 throw new PfModelException(Status.NOT_FOUND, "Automation composition definitions not found");
99 return jpaServiceTemplates.get().toAuthorative();
103 * Get service templates.
105 * @return the topology templates found
106 * @throws PfModelException on errors getting service templates
108 @Transactional(readOnly = true)
109 public List<ToscaServiceTemplate> getAllServiceTemplates() throws PfModelException {
110 var jpaList = serviceTemplateRepository.findAll();
111 return ProviderUtils.asEntityList(jpaList);
115 * Get service templates.
117 * @param name the name of the topology template to get, set to null to get all service templates
118 * @param version the version of the service template to get, set to null to get all service templates
119 * @return the topology templates found
120 * @throws PfModelException on errors getting service templates
122 @Transactional(readOnly = true)
123 public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version)
124 throws PfModelException {
125 var jpaList = serviceTemplateRepository.getFiltered(JpaToscaServiceTemplate.class, name, version);
126 return ProviderUtils.asEntityList(jpaList);
130 * Get the initial node types with common or instance properties.
132 * @param fullNodeTypes map of all the node types in the specified template
133 * @param common boolean to indicate whether common or instance properties are required
134 * @return node types map that only has common properties
136 private Map<String, ToscaNodeType> getInitialNodeTypesMap(Map<String, ToscaNodeType> fullNodeTypes,
139 var tempNodeTypesMap = new HashMap<String, ToscaNodeType>();
141 fullNodeTypes.forEach((key, nodeType) -> {
142 var tempToscaNodeType = new ToscaNodeType();
143 tempToscaNodeType.setName(key);
145 var resultantPropertyMap = findCommonOrInstancePropsInNodeTypes(nodeType, common);
147 if (!resultantPropertyMap.isEmpty()) {
148 tempToscaNodeType.setProperties(resultantPropertyMap);
149 tempNodeTypesMap.put(key, tempToscaNodeType);
152 return tempNodeTypesMap;
155 private Map<String, ToscaProperty> findCommonOrInstancePropsInNodeTypes(ToscaNodeType nodeType, boolean common) {
157 var tempCommonPropertyMap = new HashMap<String, ToscaProperty>();
158 var tempInstancePropertyMap = new HashMap<String, ToscaProperty>();
160 nodeType.getProperties().forEach((propKey, prop) -> {
162 if (prop.getMetadata() != null) {
163 prop.getMetadata().forEach((k, v) -> {
164 if (k.equals("common") && v.equals("true") && common) {
165 tempCommonPropertyMap.put(propKey, prop);
166 } else if (k.equals("common") && v.equals("false") && !common) {
167 tempInstancePropertyMap.put(propKey, prop);
172 tempInstancePropertyMap.put(propKey, prop);
176 if (tempCommonPropertyMap.isEmpty() && !common) {
177 return tempInstancePropertyMap;
179 return tempCommonPropertyMap;
184 * Get the node types derived from those that have common properties.
186 * @param initialNodeTypes map of all the node types in the specified template
187 * @param filteredNodeTypes map of all the node types that have common or instance properties
188 * @return all node types that have common properties including their children
189 * @throws PfModelException on errors getting node type with common properties
191 private Map<String, ToscaNodeType> getFinalNodeTypesMap(Map<String, ToscaNodeType> initialNodeTypes,
192 Map<String, ToscaNodeType> filteredNodeTypes) {
193 for (var i = 0; i < initialNodeTypes.size(); i++) {
194 initialNodeTypes.forEach((key, nodeType) -> {
195 var tempToscaNodeType = new ToscaNodeType();
196 tempToscaNodeType.setName(key);
198 if (filteredNodeTypes.get(nodeType.getDerivedFrom()) != null) {
199 tempToscaNodeType.setName(key);
201 var finalProps = new HashMap<String, ToscaProperty>(
202 filteredNodeTypes.get(nodeType.getDerivedFrom()).getProperties());
204 tempToscaNodeType.setProperties(finalProps);
208 filteredNodeTypes.putIfAbsent(key, tempToscaNodeType);
212 return filteredNodeTypes;
216 * Get the requested node types with common or instance properties.
218 * @param common boolean indicating common or instance properties
219 * @param serviceTemplate the ToscaServiceTemplate
220 * @return the node types with common or instance properties
221 * @throws PfModelException on errors getting node type properties
223 public Map<String, ToscaNodeType> getCommonOrInstancePropertiesFromNodeTypes(boolean common,
224 ToscaServiceTemplate serviceTemplate) throws PfModelException {
225 var tempNodeTypesMap = this.getInitialNodeTypesMap(serviceTemplate.getNodeTypes(), common);
227 return this.getFinalNodeTypesMap(serviceTemplate.getNodeTypes(), tempNodeTypesMap);