5c49b852326bda1fe40fbb2627a4a0e5175e6260
[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.runtime.commissioning;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26
27 import com.fasterxml.jackson.databind.ObjectMapper;
28 import com.fasterxml.jackson.databind.PropertyNamingStrategies;
29 import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
30 import java.util.ArrayList;
31 import java.util.List;
32 import java.util.Map;
33 import org.junit.jupiter.api.AfterEach;
34 import org.junit.jupiter.api.Test;
35 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
36 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
37 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
38 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
39 import org.onap.policy.common.utils.coder.Coder;
40 import org.onap.policy.common.utils.coder.StandardCoder;
41 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
42 import org.onap.policy.common.utils.resources.ResourceUtils;
43 import org.onap.policy.models.provider.PolicyModelsProvider;
44 import org.onap.policy.models.tosca.authorative.concepts.ToscaCapabilityType;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaRelationshipType;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
53
54 class CommissioningProviderTest {
55     private static final String TOSCA_SERVICE_TEMPLATE_YAML =
56             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
57     private static final String COMMON_TOSCA_SERVICE_TEMPLATE_YAML =
58         "src/test/resources/rest/servicetemplates/full-tosca-with-common-properties.yaml";
59     private static final String TEMPLATE_IS_NULL = ".*serviceTemplate is marked non-null but is null";
60     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
61
62     private PolicyModelsProvider modelsProvider = null;
63     private ControlLoopProvider clProvider = null;
64     private static final Coder CODER = new StandardCoder();
65     private final ObjectMapper mapper = new ObjectMapper();
66     private ParticipantProvider participantProvider;
67
68     @AfterEach
69     void close() throws Exception {
70         if (modelsProvider != null) {
71             modelsProvider.close();
72         }
73         if (clProvider != null) {
74             clProvider.close();
75         }
76         if (participantProvider != null) {
77             participantProvider.close();
78         }
79     }
80
81     /**
82      * Test the fetching of control loop definitions (ToscaServiceTemplates).
83      *
84      * @throws Exception .
85      */
86     @Test
87     void testGetControlLoopDefinitions() throws Exception {
88         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
89         modelsProvider =
90                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
91         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
92         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
93
94         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
95             null, participantProvider);
96         ToscaServiceTemplate serviceTemplate = yamlTranslator
97                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
98
99         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
100         assertThat(listOfTemplates).isEmpty();
101
102         provider.createControlLoopDefinitions(serviceTemplate);
103         listOfTemplates = provider.getControlLoopDefinitions(null, null);
104         assertThat(listOfTemplates).hasSize(2);
105
106         // Test Filtering
107         listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
108         assertThat(listOfTemplates).hasSize(1);
109         for (ToscaNodeTemplate template : listOfTemplates) {
110             // Other CL elements contain PMSD instead of PMSH in their name
111             assertThat(template.getName()).doesNotContain("PMSD");
112         }
113
114         // Test Wrong Name
115         listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
116         assertThat(listOfTemplates).isEmpty();
117
118     }
119
120     /**
121      * Test the creation of control loop definitions (ToscaServiceTemplates).
122      *
123      * @throws Exception .
124      */
125     @Test
126     void testCreateControlLoopDefinitions() throws Exception {
127         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
128         modelsProvider =
129                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
130         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
131         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
132
133         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
134             null, participantProvider);
135         // Test Service template is null
136         assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
137         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
138         assertThat(listOfTemplates).isEmpty();
139
140         ToscaServiceTemplate serviceTemplate = yamlTranslator
141                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
142
143         // Response should return the number of node templates present in the service template
144         List<ToscaConceptIdentifier> affectedDefinitions =
145                 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
146         assertThat(affectedDefinitions).hasSize(13);
147         listOfTemplates = provider.getControlLoopDefinitions(null, null);
148         assertThat(listOfTemplates).hasSize(2);
149     }
150
151     /**
152      * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
153      * tested in the testGetToscaServiceTemplateReduced() test.
154      *
155      */
156     @Test
157     void testGetToscaServiceTemplate() throws Exception {
158         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
159         modelsProvider =
160             CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
161         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
162         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
163
164         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
165             null, participantProvider);
166         ToscaServiceTemplate serviceTemplate = yamlTranslator
167             .fromYaml(ResourceUtils
168                 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
169
170         provider.createControlLoopDefinitions(serviceTemplate);
171
172         ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
173         assertThat(returnedServiceTemplate).isNotNull();
174
175         Map<String, ToscaNodeTemplate> nodeTemplates = returnedServiceTemplate
176             .getToscaTopologyTemplate().getNodeTemplates();
177
178         assertThat(nodeTemplates).hasSize(8);
179     }
180
181     /**
182      * Test the fetching of a reduced ToscaServiceTemplate with only some of the objects from the full template.
183      * The reduced template does not contain: DataTypesAsMap or PolicyTypesAsMap.
184      *
185      */
186     @Test
187     void testGetToscaServiceTemplateReduced() throws Exception {
188         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
189         modelsProvider =
190             CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
191         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
192         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
193
194         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
195             null, participantProvider);
196         ToscaServiceTemplate serviceTemplate = yamlTranslator
197             .fromYaml(ResourceUtils
198                 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
199
200         provider.createControlLoopDefinitions(serviceTemplate);
201
202         String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
203         assertThat(returnedServiceTemplate).isNotNull();
204         ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
205
206         assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
207     }
208
209     /**
210      * Tests the different schemas being returned from the schema endpoint. As schemas of the different
211      * sections of the Tosca Service Templates can be returned by the API, this test must cover all of the
212      * different sections.
213      *
214      */
215     @Test
216     void testGetToscaServiceTemplateSchema() throws Exception {
217
218         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
219         modelsProvider =
220             CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
221         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
222         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
223
224         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
225             null, participantProvider);
226         ToscaServiceTemplate serviceTemplate = yamlTranslator
227             .fromYaml(ResourceUtils
228                 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
229
230         provider.createControlLoopDefinitions(serviceTemplate);
231
232         mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
233
234         Map<String, Class> sections = Map.of(
235             "all", ToscaServiceTemplate.class,
236             "data_types", ToscaDataType.class,
237             "capability_types", ToscaCapabilityType.class,
238             "node_types", ToscaNodeType.class,
239             "relationship_types", ToscaRelationshipType.class,
240             "policy_types", ToscaPolicyType.class,
241             "topology_template", ToscaTopologyTemplate.class,
242             "node_templates", List.class);
243
244         for (Map.Entry<String, Class> entry : sections.entrySet()) {
245             String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
246             assertThat(returnedServiceTemplateSchema).isNotNull();
247
248             var visitor = new SchemaFactoryWrapper();
249
250             if (entry.getKey().equals("node_templates")) {
251                 mapper.acceptJsonFormatVisitor(
252                     mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class),
253                     visitor);
254             } else {
255                 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
256             }
257
258             var jsonSchema = visitor.finalSchema();
259             String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
260             assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
261         }
262     }
263
264     /**
265      * Test the deletion of control loop definitions (ToscaServiceTemplate).
266      *
267      * @throws Exception .
268      */
269     @Test
270     void testDeleteControlLoopDefinitions() throws Exception {
271         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
272         modelsProvider =
273                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
274         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
275         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
276
277         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
278             null, participantProvider);
279         ToscaServiceTemplate serviceTemplate = yamlTranslator
280                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
281
282         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
283         assertThat(listOfTemplates).isEmpty();
284
285         provider.createControlLoopDefinitions(serviceTemplate);
286         listOfTemplates = provider.getControlLoopDefinitions(null, null);
287         assertThat(listOfTemplates).hasSize(2);
288
289         provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
290         listOfTemplates = provider.getControlLoopDefinitions(null, null);
291         assertThat(listOfTemplates).isEmpty();
292     }
293
294     /**
295      * Test the fetching of control loop element definitions.
296      *
297      * @throws Exception .
298      */
299     @Test
300     void testGetControlLoopElementDefinitions() throws Exception {
301         ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
302         modelsProvider =
303                 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
304         clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
305         participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
306
307         CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
308             null, participantProvider);
309         ToscaServiceTemplate serviceTemplate = yamlTranslator
310                 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
311
312         provider.getControlLoopDefinitions(null, null);
313
314         provider.createControlLoopDefinitions(serviceTemplate);
315         List<ToscaNodeTemplate> controlLoopDefinitionList =
316                 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
317
318         List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
319                 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
320
321         // 4 PMSH control loop elements definitions.
322         assertThat(controlLoopElementNodeTemplates).hasSize(4);
323
324         List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
325         for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
326             assertTrue(checkNodeType(template, derivedTypes));
327         }
328     }
329
330     private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
331         String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
332         for (ToscaNodeType derivedType : derivedNodeTypes) {
333             if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
334                 return true;
335             }
336         }
337         return false;
338     }
339
340     private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
341         String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
342         List<ToscaNodeType> nodeTypes = new ArrayList<>();
343         for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
344             if (nodeType.getDerivedFrom().equals(type)) {
345                 nodeTypes.add(nodeType);
346             }
347         }
348         return nodeTypes;
349     }
350 }