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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.controlloop.runtime.commissioning;
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;
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;
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.models.controlloop.persistence.provider.ParticipantProvider;
37 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
38 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
39 import org.onap.policy.common.utils.coder.Coder;
40 import org.onap.policy.common.utils.coder.StandardCoder;
41 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
42 import org.onap.policy.common.utils.resources.ResourceUtils;
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;
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 private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
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;
69 void close() throws Exception {
70 if (modelsProvider != null) {
71 modelsProvider.close();
73 if (clProvider != null) {
76 if (participantProvider != null) {
77 participantProvider.close();
82 * Test the fetching of control loop definitions (ToscaServiceTemplates).
87 void testGetControlLoopDefinitions() throws Exception {
88 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
90 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
91 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
92 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
94 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
95 null, participantProvider);
96 ToscaServiceTemplate serviceTemplate = yamlTranslator
97 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
99 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
100 assertThat(listOfTemplates).isEmpty();
102 provider.createControlLoopDefinitions(serviceTemplate);
103 listOfTemplates = provider.getControlLoopDefinitions(null, null);
104 assertThat(listOfTemplates).hasSize(2);
107 listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
108 assertThat(listOfTemplates).hasSize(1);
109 for (ToscaNodeTemplate template : listOfTemplates) {
110 // Other CL elements contain PMSD instead of PMSH in their name
111 assertThat(template.getName()).doesNotContain("PMSD");
115 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
116 assertThat(listOfTemplates).isEmpty();
121 * Test the creation of control loop definitions (ToscaServiceTemplates).
123 * @throws Exception .
126 void testCreateControlLoopDefinitions() throws Exception {
127 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
129 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
130 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
131 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
133 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
134 null, participantProvider);
135 // Test Service template is null
136 assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
137 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
138 assertThat(listOfTemplates).isEmpty();
140 ToscaServiceTemplate serviceTemplate = yamlTranslator
141 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
143 // Response should return the number of node templates present in the service template
144 List<ToscaConceptIdentifier> affectedDefinitions =
145 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
146 assertThat(affectedDefinitions).hasSize(13);
147 listOfTemplates = provider.getControlLoopDefinitions(null, null);
148 assertThat(listOfTemplates).hasSize(2);
152 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
153 * tested in the testGetToscaServiceTemplateReduced() test.
157 void testGetToscaServiceTemplate() throws Exception {
158 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
160 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
161 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
162 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
164 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
165 null, participantProvider);
166 ToscaServiceTemplate serviceTemplate = yamlTranslator
167 .fromYaml(ResourceUtils
168 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
170 provider.createControlLoopDefinitions(serviceTemplate);
172 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
173 assertThat(returnedServiceTemplate).isNotNull();
175 Map<String, ToscaNodeTemplate> nodeTemplates = returnedServiceTemplate
176 .getToscaTopologyTemplate().getNodeTemplates();
178 assertThat(nodeTemplates).hasSize(8);
182 * Test the fetching of a reduced ToscaServiceTemplate with only some of the objects from the full template.
183 * The reduced template does not contain: DataTypesAsMap or PolicyTypesAsMap.
187 void testGetToscaServiceTemplateReduced() throws Exception {
188 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
190 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
191 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
192 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
194 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
195 null, participantProvider);
196 ToscaServiceTemplate serviceTemplate = yamlTranslator
197 .fromYaml(ResourceUtils
198 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
200 provider.createControlLoopDefinitions(serviceTemplate);
202 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
203 assertThat(returnedServiceTemplate).isNotNull();
204 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
206 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
210 * Tests the different schemas being returned from the schema endpoint. As schemas of the different
211 * sections of the Tosca Service Templates can be returned by the API, this test must cover all of the
212 * different sections.
216 void testGetToscaServiceTemplateSchema() throws Exception {
218 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
220 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
221 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
222 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
224 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
225 null, participantProvider);
226 ToscaServiceTemplate serviceTemplate = yamlTranslator
227 .fromYaml(ResourceUtils
228 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
230 provider.createControlLoopDefinitions(serviceTemplate);
232 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
234 Map<String, Class> sections = Map.of(
235 "all", ToscaServiceTemplate.class,
236 "data_types", ToscaDataType.class,
237 "capability_types", ToscaCapabilityType.class,
238 "node_types", ToscaNodeType.class,
239 "relationship_types", ToscaRelationshipType.class,
240 "policy_types", ToscaPolicyType.class,
241 "topology_template", ToscaTopologyTemplate.class,
242 "node_templates", List.class);
244 for (Map.Entry<String, Class> entry : sections.entrySet()) {
245 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
246 assertThat(returnedServiceTemplateSchema).isNotNull();
248 var visitor = new SchemaFactoryWrapper();
250 if (entry.getKey().equals("node_templates")) {
251 mapper.acceptJsonFormatVisitor(
252 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class),
255 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
258 var jsonSchema = visitor.finalSchema();
259 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
260 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
265 * Test the deletion of control loop definitions (ToscaServiceTemplate).
267 * @throws Exception .
270 void testDeleteControlLoopDefinitions() throws Exception {
271 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
273 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
274 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
275 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
277 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
278 null, participantProvider);
279 ToscaServiceTemplate serviceTemplate = yamlTranslator
280 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
282 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
283 assertThat(listOfTemplates).isEmpty();
285 provider.createControlLoopDefinitions(serviceTemplate);
286 listOfTemplates = provider.getControlLoopDefinitions(null, null);
287 assertThat(listOfTemplates).hasSize(2);
289 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
290 listOfTemplates = provider.getControlLoopDefinitions(null, null);
291 assertThat(listOfTemplates).isEmpty();
295 * Test the fetching of control loop element definitions.
297 * @throws Exception .
300 void testGetControlLoopElementDefinitions() throws Exception {
301 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
303 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
304 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
305 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
307 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
308 null, participantProvider);
309 ToscaServiceTemplate serviceTemplate = yamlTranslator
310 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
312 provider.getControlLoopDefinitions(null, null);
314 provider.createControlLoopDefinitions(serviceTemplate);
315 List<ToscaNodeTemplate> controlLoopDefinitionList =
316 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
318 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
319 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
321 // 4 PMSH control loop elements definitions.
322 assertThat(controlLoopElementNodeTemplates).hasSize(4);
324 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
325 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
326 assertTrue(checkNodeType(template, derivedTypes));
330 private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
331 String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
332 for (ToscaNodeType derivedType : derivedNodeTypes) {
333 if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
340 private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
341 String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
342 List<ToscaNodeType> nodeTypes = new ArrayList<>();
343 for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
344 if (nodeType.getDerivedFrom().equals(type)) {
345 nodeTypes.add(nodeType);