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