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.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.eq;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import com.fasterxml.jackson.databind.ObjectMapper;
32 import com.fasterxml.jackson.databind.PropertyNamingStrategies;
33 import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
34 import java.util.List;
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.common.utils.coder.Coder;
42 import org.onap.policy.common.utils.coder.StandardCoder;
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";
59 private static final Coder CODER = new StandardCoder();
60 private final ObjectMapper mapper = new ObjectMapper();
63 * Test the fetching of control loop definitions (ToscaServiceTemplates).
68 void testGetControlLoopDefinitions() throws Exception {
69 var clProvider = mock(ControlLoopProvider.class);
70 var participantProvider = mock(ParticipantProvider.class);
71 var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
73 CommissioningProvider provider =
74 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
76 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
77 assertThat(listOfTemplates).isEmpty();
79 when(clProvider.getFilteredNodeTemplates(any()))
80 .thenReturn(List.of(new ToscaNodeTemplate(), new ToscaNodeTemplate()));
81 listOfTemplates = provider.getControlLoopDefinitions(null, null);
82 assertThat(listOfTemplates).hasSize(2);
86 * Test the creation of control loop definitions (ToscaServiceTemplates).
91 void testCreateControlLoopDefinitions() throws Exception {
92 var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
93 var clProvider = mock(ControlLoopProvider.class);
94 var participantProvider = mock(ParticipantProvider.class);
96 CommissioningProvider provider =
97 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
99 List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
100 assertThat(listOfTemplates).isEmpty();
102 ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
103 when(serviceTemplateProvider.createServiceTemplate(serviceTemplate)).thenReturn(serviceTemplate);
105 // Response should return the number of node templates present in the service template
106 List<ToscaConceptIdentifier> affectedDefinitions =
107 provider.createControlLoopDefinitions(serviceTemplate).getAffectedControlLoopDefinitions();
108 assertThat(affectedDefinitions).hasSize(13);
110 when(clProvider.getFilteredNodeTemplates(any()))
111 .thenReturn(List.of(new ToscaNodeTemplate(), new ToscaNodeTemplate()));
113 listOfTemplates = provider.getControlLoopDefinitions(null, null);
114 assertThat(listOfTemplates).hasSize(2);
118 * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
119 * tested in the testGetToscaServiceTemplateReduced() test.
123 void testGetToscaServiceTemplate() throws Exception {
124 var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
125 var clProvider = mock(ControlLoopProvider.class);
126 var participantProvider = mock(ParticipantProvider.class);
128 CommissioningProvider provider =
129 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
130 ToscaServiceTemplate serviceTemplate =
131 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
132 when(serviceTemplateProvider.createServiceTemplate(serviceTemplate)).thenReturn(serviceTemplate);
134 provider.createControlLoopDefinitions(serviceTemplate);
135 verify(serviceTemplateProvider).createServiceTemplate(serviceTemplate);
137 when(serviceTemplateProvider.getToscaServiceTemplate(eq(null), eq(null))).thenReturn(serviceTemplate);
139 ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
140 assertThat(returnedServiceTemplate).isNotNull();
142 Map<String, ToscaNodeTemplate> nodeTemplates =
143 returnedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
145 assertThat(nodeTemplates).hasSize(8);
149 * Test the fetching of a reduced ToscaServiceTemplate with only some of the objects from the full template.
150 * The reduced template does not contain: DataTypesAsMap or PolicyTypesAsMap.
154 void testGetToscaServiceTemplateReduced() throws Exception {
155 var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
156 var clProvider = mock(ControlLoopProvider.class);
157 var participantProvider = mock(ParticipantProvider.class);
159 CommissioningProvider provider =
160 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
161 ToscaServiceTemplate serviceTemplate =
162 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
163 when(serviceTemplateProvider.createServiceTemplate(serviceTemplate)).thenReturn(serviceTemplate);
165 provider.createControlLoopDefinitions(serviceTemplate);
167 when(serviceTemplateProvider.getServiceTemplateList(any(), any())).thenReturn(List.of(serviceTemplate));
169 String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
170 assertThat(returnedServiceTemplate).isNotNull();
171 ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
173 assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
177 * Tests the different schemas being returned from the schema endpoint. As schemas of the different
178 * sections of the Tosca Service Templates can be returned by the API, this test must cover all of the
179 * different sections.
183 void testGetToscaServiceTemplateSchema() throws Exception {
184 var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
185 var clProvider = mock(ControlLoopProvider.class);
186 var participantProvider = mock(ParticipantProvider.class);
188 CommissioningProvider provider =
189 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
190 ToscaServiceTemplate serviceTemplate =
191 InstantiationUtils.getToscaServiceTemplate(COMMON_TOSCA_SERVICE_TEMPLATE_YAML);
192 when(serviceTemplateProvider.createServiceTemplate(serviceTemplate)).thenReturn(serviceTemplate);
194 provider.createControlLoopDefinitions(serviceTemplate);
196 mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
198 Map<String, Class<?>> sections = Map.of("all", ToscaServiceTemplate.class, "data_types", ToscaDataType.class,
199 "capability_types", ToscaCapabilityType.class, "node_types", ToscaNodeType.class, "relationship_types",
200 ToscaRelationshipType.class, "policy_types", ToscaPolicyType.class, "topology_template",
201 ToscaTopologyTemplate.class, "node_templates", List.class);
203 for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
204 String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
205 assertThat(returnedServiceTemplateSchema).isNotNull();
207 var visitor = new SchemaFactoryWrapper();
209 if (entry.getKey().equals("node_templates")) {
210 mapper.acceptJsonFormatVisitor(
211 mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class), visitor);
213 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
216 var jsonSchema = visitor.finalSchema();
217 String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
218 assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);