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