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