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.main.parameters.ClRuntimeParameterGroup;
39 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
40 import org.onap.policy.common.utils.coder.Coder;
41 import org.onap.policy.common.utils.coder.StandardCoder;
42 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
43 import org.onap.policy.common.utils.resources.ResourceUtils;
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";
61 private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
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();
67 private ParticipantProvider participantProvider;
70 void close() throws Exception {
71 if (modelsProvider != null) {
72 modelsProvider.close();
74 if (clProvider != null) {
77 if (participantProvider != null) {
78 participantProvider.close();
83 * Test the fetching of control loop definitions (ToscaServiceTemplates).
88 void testGetControlLoopDefinitions() throws Exception {
89 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
91 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
92 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
93 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
95 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
96 null, participantProvider);
97 ToscaServiceTemplate serviceTemplate = yamlTranslator
98 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
100 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
101 assertThat(listOfTemplates).isEmpty();
103 provider.createControlLoopDefinitions(serviceTemplate);
104 listOfTemplates = provider.getControlLoopDefinitions(null, null);
105 assertThat(listOfTemplates).hasSize(2);
108 listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
109 assertThat(listOfTemplates).hasSize(1);
110 for (ToscaNodeTemplate template : listOfTemplates) {
111 // Other CL elements contain PMSD instead of PMSH in their name
112 assertThat(template.getName()).doesNotContain("PMSD");
116 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
117 assertThat(listOfTemplates).isEmpty();
122 * Test the creation of control loop definitions (ToscaServiceTemplates).
124 * @throws Exception .
127 void testCreateControlLoopDefinitions() throws Exception {
128 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
130 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
131 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
132 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
134 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
135 null, participantProvider);
136 // Test Service template is null
137 assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
138 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
139 assertThat(listOfTemplates).isEmpty();
141 ToscaServiceTemplate serviceTemplate = yamlTranslator
142 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
144 // Response should return the number of node templates present in the service template
145 List<ToscaConceptIdentifier> affectedDefinitions =
146 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
147 assertThat(affectedDefinitions).hasSize(13);
148 listOfTemplates = provider.getControlLoopDefinitions(null, null);
149 assertThat(listOfTemplates).hasSize(2);
153 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
154 * tested in the testGetToscaServiceTemplateReduced() test.
158 void testGetToscaServiceTemplate() throws Exception {
159 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
161 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
162 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
163 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
165 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
166 null, participantProvider);
167 ToscaServiceTemplate serviceTemplate = yamlTranslator
168 .fromYaml(ResourceUtils
169 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
171 provider.createControlLoopDefinitions(serviceTemplate);
173 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
174 assertThat(returnedServiceTemplate).isNotNull();
176 Map<String, ToscaNodeTemplate> nodeTemplates = returnedServiceTemplate
177 .getToscaTopologyTemplate().getNodeTemplates();
179 assertThat(nodeTemplates).hasSize(8);
183 * Test the fetching of a reduced ToscaServiceTemplate with only some of the objects from the full template.
184 * The reduced template does not contain: DataTypesAsMap or PolicyTypesAsMap.
188 void testGetToscaServiceTemplateReduced() throws Exception {
189 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
191 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
192 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
193 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
195 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
196 null, participantProvider);
197 ToscaServiceTemplate serviceTemplate = yamlTranslator
198 .fromYaml(ResourceUtils
199 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
201 provider.createControlLoopDefinitions(serviceTemplate);
203 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
204 assertThat(returnedServiceTemplate).isNotNull();
205 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
207 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
211 * Tests the different schemas being returned from the schema endpoint. As schemas of the different
212 * sections of the Tosca Service Templates can be returned by the API, this test must cover all of the
213 * different sections.
217 void testGetToscaServiceTemplateSchema() throws Exception {
219 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
221 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
222 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
223 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
225 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
226 null, participantProvider);
227 ToscaServiceTemplate serviceTemplate = yamlTranslator
228 .fromYaml(ResourceUtils
229 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
231 provider.createControlLoopDefinitions(serviceTemplate);
233 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
235 Map<String, Class<?>> sections = Map.of(
236 "all", ToscaServiceTemplate.class,
237 "data_types", ToscaDataType.class,
238 "capability_types", ToscaCapabilityType.class,
239 "node_types", ToscaNodeType.class,
240 "relationship_types", ToscaRelationshipType.class,
241 "policy_types", ToscaPolicyType.class,
242 "topology_template", ToscaTopologyTemplate.class,
243 "node_templates", List.class);
245 for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
246 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
247 assertThat(returnedServiceTemplateSchema).isNotNull();
249 var visitor = new SchemaFactoryWrapper();
251 if (entry.getKey().equals("node_templates")) {
252 mapper.acceptJsonFormatVisitor(
253 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class),
256 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
259 var jsonSchema = visitor.finalSchema();
260 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
261 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
266 * Test the deletion of control loop definitions (ToscaServiceTemplate).
268 * @throws Exception .
271 void testDeleteControlLoopDefinitions() throws Exception {
272 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("deleteCLDefinitions");
274 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
275 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
276 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
278 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
279 null, participantProvider);
280 ToscaServiceTemplate serviceTemplate = yamlTranslator
281 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
283 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
284 assertThat(listOfTemplates).isEmpty();
286 provider.createControlLoopDefinitions(serviceTemplate);
287 listOfTemplates = provider.getControlLoopDefinitions(null, null);
288 assertThat(listOfTemplates).hasSize(2);
290 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
291 listOfTemplates = provider.getControlLoopDefinitions(null, null);
292 assertThat(listOfTemplates).isEmpty();
296 * Test the fetching of control loop element definitions.
298 * @throws Exception .
301 void testGetControlLoopElementDefinitions() throws Exception {
302 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
304 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
305 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
306 participantProvider = new ParticipantProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
308 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider,
309 null, participantProvider);
310 ToscaServiceTemplate serviceTemplate = yamlTranslator
311 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
313 provider.getControlLoopDefinitions(null, null);
315 provider.createControlLoopDefinitions(serviceTemplate);
316 List<ToscaNodeTemplate> controlLoopDefinitionList =
317 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
319 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
320 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
322 // 4 PMSH control loop elements definitions.
323 assertThat(controlLoopElementNodeTemplates).hasSize(4);
325 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
326 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
327 assertTrue(checkNodeType(template, derivedTypes));
331 private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
332 String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
333 for (ToscaNodeType derivedType : derivedNodeTypes) {
334 if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
341 private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
342 String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
343 List<ToscaNodeType> nodeTypes = new ArrayList<>();
344 for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
345 if (nodeType.getDerivedFrom().equals(type)) {
346 nodeTypes.add(nodeType);