6a6d20fe75bc38799faf566e1e7ae185e89aa41a
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider;
22
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import javax.ws.rs.core.Response.Status;
27 import lombok.RequiredArgsConstructor;
28 import org.onap.policy.models.base.PfModelException;
29 import org.onap.policy.models.provider.PolicyModelsProvider;
30 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
31 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
32 import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
33 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
34 import org.springframework.stereotype.Component;
35
36 @Component
37 @RequiredArgsConstructor
38 public class ServiceTemplateProvider {
39
40     private final PolicyModelsProvider modelsProvider;
41
42     /**
43      * Create service template.
44      *
45      * @param serviceTemplate the service template to be created
46      * @return the created service template
47      * @throws PfModelException on errors creating the service template
48      */
49     public ToscaServiceTemplate createServiceTemplate(final ToscaServiceTemplate serviceTemplate)
50             throws PfModelException {
51         return modelsProvider.createServiceTemplate(serviceTemplate);
52     }
53
54     /**
55      * Delete service template.
56      *
57      * @param name the name of the service template to delete.
58      * @param version the version of the service template to delete.
59      * @return the TOSCA service template that was deleted
60      * @throws PfModelException on errors deleting policy types
61      */
62     public ToscaServiceTemplate deleteServiceTemplate(final String name, final String version) throws PfModelException {
63         return modelsProvider.deleteServiceTemplate(name, version);
64     }
65
66     /**
67      * Get the requested control loop definitions.
68      *
69      * @param name the name of the definition to get, null for all definitions
70      * @param version the version of the definition to get, null for all definitions
71      * @return the control loop definitions
72      * @throws PfModelException on errors getting control loop definitions
73      */
74     public ToscaServiceTemplate getToscaServiceTemplate(String name, String version) throws PfModelException {
75         var serviceTemplates = modelsProvider.getServiceTemplateList(name, version);
76         if (serviceTemplates.isEmpty()) {
77             throw new PfModelException(Status.NOT_FOUND, "Control Loop definitions not found");
78         }
79         return serviceTemplates.get(0);
80     }
81
82     /**
83      * Get service templates.
84      *
85      * @param name the name of the topology template to get, set to null to get all service templates
86      * @param version the version of the service template to get, set to null to get all service templates
87      * @return the topology templates found
88      * @throws PfModelException on errors getting service templates
89      */
90     public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version)
91             throws PfModelException {
92         return modelsProvider.getServiceTemplateList(name, version);
93     }
94
95     /**
96      * Get the initial node types with common or instance properties.
97      *
98      * @param fullNodeTypes map of all the node types in the specified template
99      * @param common boolean to indicate whether common or instance properties are required
100      * @return node types map that only has common properties
101      * @throws PfModelException on errors getting node type with common properties
102      */
103     private Map<String, ToscaNodeType> getInitialNodeTypesMap(Map<String, ToscaNodeType> fullNodeTypes,
104             boolean common) {
105
106         var tempNodeTypesMap = new HashMap<String, ToscaNodeType>();
107
108         fullNodeTypes.forEach((key, nodeType) -> {
109             var tempToscaNodeType = new ToscaNodeType();
110             tempToscaNodeType.setName(key);
111
112             var resultantPropertyMap = findCommonOrInstancePropsInNodeTypes(nodeType, common);
113
114             if (!resultantPropertyMap.isEmpty()) {
115                 tempToscaNodeType.setProperties(resultantPropertyMap);
116                 tempNodeTypesMap.put(key, tempToscaNodeType);
117             }
118         });
119         return tempNodeTypesMap;
120     }
121
122     private Map<String, ToscaProperty> findCommonOrInstancePropsInNodeTypes(ToscaNodeType nodeType, boolean common) {
123
124         var tempCommonPropertyMap = new HashMap<String, ToscaProperty>();
125         var tempInstancePropertyMap = new HashMap<String, ToscaProperty>();
126
127         nodeType.getProperties().forEach((propKey, prop) -> {
128
129             if (prop.getMetadata() != null) {
130                 prop.getMetadata().forEach((k, v) -> {
131                     if (k.equals("common") && v.equals("true") && common) {
132                         tempCommonPropertyMap.put(propKey, prop);
133                     } else if (k.equals("common") && v.equals("false") && !common) {
134                         tempInstancePropertyMap.put(propKey, prop);
135                     }
136
137                 });
138             } else {
139                 tempInstancePropertyMap.put(propKey, prop);
140             }
141         });
142
143         if (tempCommonPropertyMap.isEmpty() && !common) {
144             return tempInstancePropertyMap;
145         } else {
146             return tempCommonPropertyMap;
147         }
148     }
149
150     /**
151      * Get the node types derived from those that have common properties.
152      *
153      * @param initialNodeTypes map of all the node types in the specified template
154      * @param filteredNodeTypes map of all the node types that have common or instance properties
155      * @return all node types that have common properties including their children
156      * @throws PfModelException on errors getting node type with common properties
157      */
158     private Map<String, ToscaNodeType> getFinalNodeTypesMap(Map<String, ToscaNodeType> initialNodeTypes,
159             Map<String, ToscaNodeType> filteredNodeTypes) {
160         for (var i = 0; i < initialNodeTypes.size(); i++) {
161             initialNodeTypes.forEach((key, nodeType) -> {
162                 var tempToscaNodeType = new ToscaNodeType();
163                 tempToscaNodeType.setName(key);
164
165                 if (filteredNodeTypes.get(nodeType.getDerivedFrom()) != null) {
166                     tempToscaNodeType.setName(key);
167
168                     var finalProps = new HashMap<String, ToscaProperty>(
169                             filteredNodeTypes.get(nodeType.getDerivedFrom()).getProperties());
170
171                     tempToscaNodeType.setProperties(finalProps);
172                 } else {
173                     return;
174                 }
175                 filteredNodeTypes.putIfAbsent(key, tempToscaNodeType);
176
177             });
178         }
179         return filteredNodeTypes;
180     }
181
182     /**
183      * Get the requested node types with common or instance properties.
184      *
185      * @param common boolean indicating common or instance properties
186      * @param serviceTemplate the ToscaServiceTemplate
187      * @return the node types with common or instance properties
188      * @throws PfModelException on errors getting node type properties
189      */
190     public Map<String, ToscaNodeType> getCommonOrInstancePropertiesFromNodeTypes(boolean common,
191             ToscaServiceTemplate serviceTemplate) throws PfModelException {
192         var tempNodeTypesMap = this.getInitialNodeTypesMap(serviceTemplate.getNodeTypes(), common);
193
194         return this.getFinalNodeTypesMap(serviceTemplate.getNodeTypes(), tempNodeTypesMap);
195
196     }
197
198     /**
199      * Get node templates with appropriate common or instance properties added.
200      *
201      * @param initialNodeTemplates map of all the node templates in the specified template
202      * @param nodeTypeProps map of all the node types that have common or instance properties including children
203      * @return all node templates with appropriate common or instance properties added
204      * @throws PfModelException on errors getting map of node templates with common or instance properties added
205      */
206     public Map<String, ToscaNodeTemplate> getDerivedCommonOrInstanceNodeTemplates(
207             Map<String, ToscaNodeTemplate> initialNodeTemplates, Map<String, ToscaNodeType> nodeTypeProps) {
208
209         var finalNodeTemplatesMap = new HashMap<String, ToscaNodeTemplate>();
210
211         initialNodeTemplates.forEach((templateKey, template) -> {
212             if (nodeTypeProps.containsKey(template.getType())) {
213                 var finalMergedProps = new HashMap<String, Object>();
214
215                 nodeTypeProps.get(template.getType()).getProperties().forEach(finalMergedProps::putIfAbsent);
216
217                 template.setProperties(finalMergedProps);
218
219                 finalNodeTemplatesMap.put(templateKey, template);
220             } else {
221                 return;
222             }
223         });
224         return finalNodeTemplatesMap;
225     }
226 }