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.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;
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";
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(new ServiceTemplateProvider(modelsProvider),
95 clProvider, null, participantProvider);
96 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
98 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
99 assertThat(listOfTemplates).isEmpty();
101 provider.createControlLoopDefinitions(serviceTemplate);
102 listOfTemplates = provider.getControlLoopDefinitions(null, null);
103 assertThat(listOfTemplates).hasSize(2);
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");
114 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
115 assertThat(listOfTemplates).isEmpty();
120 * Test the creation of control loop definitions (ToscaServiceTemplates).
122 * @throws Exception .
125 void testCreateControlLoopDefinitions() throws Exception {
126 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
128 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
129 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
130 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
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();
139 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
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);
150 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
151 * tested in the testGetToscaServiceTemplateReduced() test.
155 void testGetToscaServiceTemplate() throws Exception {
156 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
158 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
159 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
160 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
162 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
163 clProvider, null, participantProvider);
164 ToscaServiceTemplate serviceTemplate =
165 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
167 provider.createControlLoopDefinitions(serviceTemplate);
169 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
170 assertThat(returnedServiceTemplate).isNotNull();
172 Map<String, ToscaNodeTemplate> nodeTemplates =
173 returnedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
175 assertThat(nodeTemplates).hasSize(8);
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.
184 void testGetToscaServiceTemplateReduced() throws Exception {
185 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
187 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
188 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
189 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
191 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
192 clProvider, null, participantProvider);
193 ToscaServiceTemplate serviceTemplate =
194 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
196 provider.createControlLoopDefinitions(serviceTemplate);
198 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
199 assertThat(returnedServiceTemplate).isNotNull();
200 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
202 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
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.
212 void testGetToscaServiceTemplateSchema() throws Exception {
214 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
216 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
217 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
218 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
220 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
221 clProvider, null, participantProvider);
222 ToscaServiceTemplate serviceTemplate =
223 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
225 provider.createControlLoopDefinitions(serviceTemplate);
227 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
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);
234 for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
235 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
236 assertThat(returnedServiceTemplateSchema).isNotNull();
238 var visitor = new SchemaFactoryWrapper();
240 if (entry.getKey().equals("node_templates")) {
241 mapper.acceptJsonFormatVisitor(
242 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class), visitor);
244 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
247 var jsonSchema = visitor.finalSchema();
248 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
249 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
254 * Test the deletion of control loop definitions (ToscaServiceTemplate).
256 * @throws Exception .
259 void testDeleteControlLoopDefinitions() throws Exception {
260 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
262 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
263 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
264 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
266 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
267 clProvider, null, participantProvider);
268 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
270 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
271 assertThat(listOfTemplates).isEmpty();
273 provider.createControlLoopDefinitions(serviceTemplate);
274 listOfTemplates = provider.getControlLoopDefinitions(null, null);
275 assertThat(listOfTemplates).hasSize(2);
277 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
278 listOfTemplates = provider.getControlLoopDefinitions(null, null);
279 assertThat(listOfTemplates).isEmpty();
283 * Test the fetching of control loop element definitions.
285 * @throws Exception .
288 void testGetControlLoopElementDefinitions() throws Exception {
289 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
291 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
292 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
293 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
295 CommissioningProvider provider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider),
296 clProvider, null, participantProvider);
297 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
299 provider.getControlLoopDefinitions(null, null);
301 provider.createControlLoopDefinitions(serviceTemplate);
302 List<ToscaNodeTemplate> controlLoopDefinitionList =
303 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
305 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
306 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
308 // 4 PMSH control loop elements definitions.
309 assertThat(controlLoopElementNodeTemplates).hasSize(4);
311 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
312 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
313 assertTrue(checkNodeType(template, derivedTypes));
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)) {
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);