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.runtime.main.parameters.ClRuntimeParameterGroup;
37 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
38 import org.onap.policy.common.utils.coder.Coder;
39 import org.onap.policy.common.utils.coder.StandardCoder;
40 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
41 import org.onap.policy.common.utils.resources.ResourceUtils;
42 import org.onap.policy.models.provider.PolicyModelsProvider;
43 import org.onap.policy.models.tosca.authorative.concepts.ToscaCapabilityType;
44 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeType;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaRelationshipType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaTopologyTemplate;
53 class CommissioningProviderTest {
54 private static final String TOSCA_SERVICE_TEMPLATE_YAML =
55 "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
56 private static final String COMMON_TOSCA_SERVICE_TEMPLATE_YAML =
57 "src/test/resources/rest/servicetemplates/full-tosca-with-common-properties.yaml";
58 private static final String TEMPLATE_IS_NULL = ".*serviceTemplate is marked non-null but is null";
59 private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
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();
68 void close() throws Exception {
69 if (modelsProvider != null) {
70 modelsProvider.close();
72 if (clProvider != null) {
78 * Test the fetching of control loop definitions (ToscaServiceTemplates).
83 void testGetControlLoopDefinitions() throws Exception {
84 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
86 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
87 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
89 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
90 ToscaServiceTemplate serviceTemplate = yamlTranslator
91 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
93 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
94 assertThat(listOfTemplates).isEmpty();
96 provider.createControlLoopDefinitions(serviceTemplate);
97 listOfTemplates = provider.getControlLoopDefinitions(null, null);
98 assertThat(listOfTemplates).hasSize(2);
101 listOfTemplates = provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
102 assertThat(listOfTemplates).hasSize(1);
103 for (ToscaNodeTemplate template : listOfTemplates) {
104 // Other CL elements contain PMSD instead of PMSH in their name
105 assertThat(template.getName()).doesNotContain("PMSD");
109 listOfTemplates = provider.getControlLoopDefinitions("WrongControlLoopName", "0.0.0");
110 assertThat(listOfTemplates).isEmpty();
115 * Test the creation of control loop definitions (ToscaServiceTemplates).
117 * @throws Exception .
120 void testCreateControlLoopDefinitions() throws Exception {
121 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("createCLDefinitions");
123 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
124 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
126 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
127 // Test Service template is null
128 assertThatThrownBy(() -> provider.createControlLoopDefinitions(null)).hasMessageMatching(TEMPLATE_IS_NULL);
129 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
130 assertThat(listOfTemplates).isEmpty();
132 ToscaServiceTemplate serviceTemplate = yamlTranslator
133 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
135 // Response should return the number of node templates present in the service template
136 List<ToscaConceptIdentifier> affectedDefinitions =
137 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
138 assertThat(affectedDefinitions).hasSize(13);
139 listOfTemplates = provider.getControlLoopDefinitions(null, null);
140 assertThat(listOfTemplates).hasSize(2);
144 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
145 * tested in the testGetToscaServiceTemplateReduced() test.
149 void testGetToscaServiceTemplate() throws Exception {
150 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
152 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
153 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
155 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
156 ToscaServiceTemplate serviceTemplate = yamlTranslator
157 .fromYaml(ResourceUtils
158 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
160 provider.createControlLoopDefinitions(serviceTemplate);
162 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
163 assertThat(returnedServiceTemplate).isNotNull();
165 Map<String, ToscaNodeTemplate> nodeTemplates = returnedServiceTemplate
166 .getToscaTopologyTemplate().getNodeTemplates();
168 assertThat(nodeTemplates).hasSize(8);
172 * Test the fetching of a reduced ToscaServiceTemplate with only some of the objects from the full template.
173 * The reduced template does not contain: DataTypesAsMap or PolicyTypesAsMap.
177 void testGetToscaServiceTemplateReduced() throws Exception {
178 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
180 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
181 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
183 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
184 ToscaServiceTemplate serviceTemplate = yamlTranslator
185 .fromYaml(ResourceUtils
186 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
188 provider.createControlLoopDefinitions(serviceTemplate);
190 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
191 assertThat(returnedServiceTemplate).isNotNull();
192 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
194 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
198 * Tests the different schemas being returned from the schema endpoint. As schemas of the different
199 * sections of the Tosca Service Templates can be returned by the API, this test must cover all of the
200 * different sections.
204 void testGetToscaServiceTemplateSchema() throws Exception {
206 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLDefinitions");
208 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
209 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
211 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
212 ToscaServiceTemplate serviceTemplate = yamlTranslator
213 .fromYaml(ResourceUtils
214 .getResourceAsString(COMMON_TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
216 provider.createControlLoopDefinitions(serviceTemplate);
218 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
220 Map<String, Class> sections = Map.of(
221 "all", ToscaServiceTemplate.class,
222 "data_types", ToscaDataType.class,
223 "capability_types", ToscaCapabilityType.class,
224 "node_types", ToscaNodeType.class,
225 "relationship_types", ToscaRelationshipType.class,
226 "policy_types", ToscaPolicyType.class,
227 "topology_template", ToscaTopologyTemplate.class,
228 "node_templates", List.class);
230 for (Map.Entry<String, Class> entry : sections.entrySet()) {
231 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
232 assertThat(returnedServiceTemplateSchema).isNotNull();
234 var visitor = new SchemaFactoryWrapper();
236 if (entry.getKey().equals("node_templates")) {
237 mapper.acceptJsonFormatVisitor(
238 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class),
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());
262 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
263 ToscaServiceTemplate serviceTemplate = yamlTranslator
264 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
266 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
267 assertThat(listOfTemplates).isEmpty();
269 provider.createControlLoopDefinitions(serviceTemplate);
270 listOfTemplates = provider.getControlLoopDefinitions(null, null);
271 assertThat(listOfTemplates).hasSize(2);
273 provider.deleteControlLoopDefinition(serviceTemplate.getName(), serviceTemplate.getVersion());
274 listOfTemplates = provider.getControlLoopDefinitions(null, null);
275 assertThat(listOfTemplates).isEmpty();
279 * Test the fetching of control loop element definitions.
281 * @throws Exception .
284 void testGetControlLoopElementDefinitions() throws Exception {
285 ClRuntimeParameterGroup clRuntimeParameterGroup = CommonTestData.geParameterGroup("getCLElDefinitions");
287 CommonTestData.getPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
288 clProvider = new ControlLoopProvider(clRuntimeParameterGroup.getDatabaseProviderParameters());
290 CommissioningProvider provider = new CommissioningProvider(modelsProvider, clProvider);
291 ToscaServiceTemplate serviceTemplate = yamlTranslator
292 .fromYaml(ResourceUtils.getResourceAsString(TOSCA_SERVICE_TEMPLATE_YAML), ToscaServiceTemplate.class);
294 provider.getControlLoopDefinitions(null, null);
296 provider.createControlLoopDefinitions(serviceTemplate);
297 List<ToscaNodeTemplate> controlLoopDefinitionList =
298 provider.getControlLoopDefinitions("org.onap.domain.pmsh.PMSHControlLoopDefinition", "1.2.3");
300 List<ToscaNodeTemplate> controlLoopElementNodeTemplates =
301 provider.getControlLoopElementDefinitions(controlLoopDefinitionList.get(0));
303 // 4 PMSH control loop elements definitions.
304 assertThat(controlLoopElementNodeTemplates).hasSize(4);
306 List<ToscaNodeType> derivedTypes = getDerivedNodeTypes(serviceTemplate);
307 for (ToscaNodeTemplate template : controlLoopElementNodeTemplates) {
308 assertTrue(checkNodeType(template, derivedTypes));
312 private boolean checkNodeType(ToscaNodeTemplate template, List<ToscaNodeType> derivedNodeTypes) {
313 String controlLoopElementType = "org.onap.policy.clamp.controlloop.ControlLoopElement";
314 for (ToscaNodeType derivedType : derivedNodeTypes) {
315 if (template.getType().equals(derivedType.getName()) || template.getType().equals(controlLoopElementType)) {
322 private List<ToscaNodeType> getDerivedNodeTypes(ToscaServiceTemplate serviceTemplate) {
323 String type = "org.onap.policy.clamp.controlloop.ControlLoopElement";
324 List<ToscaNodeType> nodeTypes = new ArrayList<>();
325 for (ToscaNodeType nodeType : serviceTemplate.getNodeTypes().values()) {
326 if (nodeType.getDerivedFrom().equals(type)) {
327 nodeTypes.add(nodeType);