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;
27 import static org.mockito.Mockito.mock;
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;
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;
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";
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();
69 void close() throws Exception {
70 if (modelsProvider != null) {
71 modelsProvider.close();
73 if (clProvider != null) {
79 * Test the fetching of control loop definitions (ToscaServiceTemplates).
84 void testGetControlLoopDefinitions() throws Exception {
85 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
87 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
88 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
89 var participantProvider = mock(ParticipantProvider.class);
91 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
92 clProvider, null, participantProvider);
93 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
95 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
96 assertThat(listOfTemplates).isEmpty();
98 provider.createControlLoopDefinitions(serviceTemplate);
99 listOfTemplates = provider.getControlLoopDefinitions(null, null);
100 assertThat(listOfTemplates).hasSize(2);
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");
111 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
112 assertThat(listOfTemplates).isEmpty();
117 * Test the creation of control loop definitions (ToscaServiceTemplates).
119 * @throws Exception .
122 void testCreateControlLoopDefinitions() throws Exception {
123 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
125 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
126 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
127 var participantProvider = mock(ParticipantProvider.class);
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();
136 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
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);
147 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
148 * tested in the testGetToscaServiceTemplateReduced() test.
152 void testGetToscaServiceTemplate() throws Exception {
153 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
155 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
156 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
157 var participantProvider = mock(ParticipantProvider.class);
159 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
160 clProvider, null, participantProvider);
161 ToscaServiceTemplate serviceTemplate =
162 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
164 provider.createControlLoopDefinitions(serviceTemplate);
166 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
167 assertThat(returnedServiceTemplate).isNotNull();
169 Map<String, ToscaNodeTemplate> nodeTemplates =
170 returnedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
172 assertThat(nodeTemplates).hasSize(8);
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.
181 void testGetToscaServiceTemplateReduced() throws Exception {
182 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
184 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
185 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
186 var participantProvider = mock(ParticipantProvider.class);
188 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
189 clProvider, null, participantProvider);
190 ToscaServiceTemplate serviceTemplate =
191 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
193 provider.createControlLoopDefinitions(serviceTemplate);
195 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
196 assertThat(returnedServiceTemplate).isNotNull();
197 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
199 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
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.
209 void testGetToscaServiceTemplateSchema() throws Exception {
211 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
213 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
214 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
215 var participantProvider = mock(ParticipantProvider.class);
217 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
218 clProvider, null, participantProvider);
219 ToscaServiceTemplate serviceTemplate =
220 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
222 provider.createControlLoopDefinitions(serviceTemplate);
224 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
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);
231 for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
232 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
233 assertThat(returnedServiceTemplateSchema).isNotNull();
235 var visitor = new SchemaFactoryWrapper();
237 if (entry.getKey().equals("node_templates")) {
238 mapper.acceptJsonFormatVisitor(
239 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class), visitor);
241 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
244 var jsonSchema = visitor.finalSchema();
245 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
246 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
251 * Test the deletion of control loop definitions (ToscaServiceTemplate).
253 * @throws Exception .
256 void testDeleteControlLoopDefinitions() throws Exception {
257 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
259 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
260 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
261 var participantProvider = mock(ParticipantProvider.class);
263 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
264 clProvider, null, participantProvider);
265 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
267 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
268 assertThat(listOfTemplates).isEmpty();
270 provider.createControlLoopDefinitions(serviceTemplate);
271 listOfTemplates = provider.getControlLoopDefinitions(null, null);
272 assertThat(listOfTemplates).hasSize(2);
274 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
275 listOfTemplates = provider.getControlLoopDefinitions(null, null);
276 assertThat(listOfTemplates).isEmpty();
280 * Test the fetching of control loop element definitions.
282 * @throws Exception .
285 void testGetControlLoopElementDefinitions() throws Exception {
286 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
288 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
289 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
290 var participantProvider = mock(ParticipantProvider.class);
292 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
293 clProvider, null, participantProvider);
294 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
296 provider.getControlLoopDefinitions(null, null);
298 provider.createControlLoopDefinitions(serviceTemplate);
299 List<ToscaNodeTemplate> controlLoopDefinitionList =
300 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
302 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
303 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
305 // 4 PMSH control loop elements definitions.
306 assertThat(controlLoopElementNodeTemplates).hasSize(4);
308 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
309 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
310 assertTrue(checkNodeType(template, derivedTypes));
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)) {
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);