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