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