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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.controlloop.runtime.commissioning;
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;
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;
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;
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";
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;
68 void close() throws Exception {
69 if (modelsProvider != null) {
70 modelsProvider.close();
72 if (clProvider != null) {
75 if (participantProvider != null) {
76 participantProvider.close();
81 * Test the fetching of control loop definitions (ToscaServiceTemplates).
86 void testGetControlLoopDefinitions() throws Exception {
87 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
89 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
90 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
91 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
93 CommissioningProvider provider =
94 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
95 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
97 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
98 assertThat(listOfTemplates).isEmpty();
100 provider.createControlLoopDefinitions(serviceTemplate);
101 listOfTemplates = provider.getControlLoopDefinitions(null, null);
102 assertThat(listOfTemplates).hasSize(2);
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");
113 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
114 assertThat(listOfTemplates).isEmpty();
119 * Test the creation of control loop definitions (ToscaServiceTemplates).
121 * @throws Exception .
124 void testCreateControlLoopDefinitions() throws Exception {
125 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
127 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
128 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
129 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
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();
138 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
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);
149 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
150 * tested in the testGetToscaServiceTemplateReduced() test.
154 void testGetToscaServiceTemplate() throws Exception {
155 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
157 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
158 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
159 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
161 CommissioningProvider provider =
162 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
163 ToscaServiceTemplate serviceTemplate =
164 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
166 provider.createControlLoopDefinitions(serviceTemplate);
168 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
169 assertThat(returnedServiceTemplate).isNotNull();
171 Map<String, ToscaNodeTemplate> nodeTemplates =
172 returnedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
174 assertThat(nodeTemplates).hasSize(8);
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.
183 void testGetToscaServiceTemplateReduced() throws Exception {
184 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
186 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
187 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
188 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
190 CommissioningProvider provider =
191 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
192 ToscaServiceTemplate serviceTemplate =
193 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
195 provider.createControlLoopDefinitions(serviceTemplate);
197 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
198 assertThat(returnedServiceTemplate).isNotNull();
199 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
201 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
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.
211 void testGetToscaServiceTemplateSchema() throws Exception {
213 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
215 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
216 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
217 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
219 CommissioningProvider provider =
220 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
221 ToscaServiceTemplate serviceTemplate =
222 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
224 provider.createControlLoopDefinitions(serviceTemplate);
226 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
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);
233 for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
234 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
235 assertThat(returnedServiceTemplateSchema).isNotNull();
237 var visitor = new SchemaFactoryWrapper();
239 if (entry.getKey().equals("node_templates")) {
240 mapper.acceptJsonFormatVisitor(
241 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class), visitor);
243 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
246 var jsonSchema = visitor.finalSchema();
247 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
248 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
253 * Test the deletion of control loop definitions (ToscaServiceTemplate).
255 * @throws Exception .
258 void testDeleteControlLoopDefinitions() throws Exception {
259 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
261 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
262 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
263 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
265 CommissioningProvider provider =
266 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
267 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
269 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
270 assertThat(listOfTemplates).isEmpty();
272 provider.createControlLoopDefinitions(serviceTemplate);
273 listOfTemplates = provider.getControlLoopDefinitions(null, null);
274 assertThat(listOfTemplates).hasSize(2);
276 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
277 listOfTemplates = provider.getControlLoopDefinitions(null, null);
278 assertThat(listOfTemplates).isEmpty();
282 * Test the fetching of control loop element definitions.
284 * @throws Exception .
287 void testGetControlLoopElementDefinitions() throws Exception {
288 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
290 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
291 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
292 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
294 CommissioningProvider provider =
295 new CommissioningProvider(modelsProvider, clProvider, null, participantProvider);
296 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
298 provider.getControlLoopDefinitions(null, null);
300 provider.createControlLoopDefinitions(serviceTemplate);
301 List<ToscaNodeTemplate> controlLoopDefinitionList =
302 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
304 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
305 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
307 // 4 PMSH control loop elements definitions.
308 assertThat(controlLoopElementNodeTemplates).hasSize(4);
310 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
311 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
312 assertTrue(checkNodeType(template, derivedTypes));
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)) {
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);