843985e7de3a0f82e46577b2f64b3312f1fd7d85
[policy/clamp.git] /
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.controlloop.runtime.commissioning;
23
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;
30
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;
35 import java.util.Map;
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;
52
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
59     private static final Coder CODER = new StandardCoder();
60     private final ObjectMapper mapper = new ObjectMapper();
61
62     /**
63      * Test the fetching of control loop definitions (ToscaServiceTemplates).
64      *
65      * @throws Exception .
66      */
67     @Test
68     void testGetControlLoopDefinitions() throws Exception {
69         var clProvider = mock(ControlLoopProvider.class);
70         var participantProvider = mock(ParticipantProvider.class);
71         var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
72
73         CommissioningProvider provider =
74                 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
75
76         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
77         assertThat(listOfTemplates).isEmpty();
78
79         when(clProvider.getFilteredNodeTemplates(any()))
80                 .thenReturn(List.of(new ToscaNodeTemplate(), new ToscaNodeTemplate()));
81         listOfTemplates = provider.getControlLoopDefinitions(null, null);
82         assertThat(listOfTemplates).hasSize(2);
83     }
84
85     /**
86      * Test the creation of control loop definitions (ToscaServiceTemplates).
87      *
88      * @throws Exception .
89      */
90     @Test
91     void testCreateControlLoopDefinitions() throws Exception {
92         var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
93         var clProvider = mock(ControlLoopProvider.class);
94         var participantProvider = mock(ParticipantProvider.class);
95
96         CommissioningProvider provider =
97                 new CommissioningProvider(serviceTemplateProvider, clProvider, null, participantProvider);
98
99         List<ToscaNodeTemplate> listOfTemplates = provider.getControlLoopDefinitions(null, null);
100         assertThat(listOfTemplates).isEmpty();
101
102         ToscaServiceTemplate serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
103         when(serviceTemplateProvider.createServiceTemplate(serviceTemplate)).thenReturn(serviceTemplate);
104
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);
109
110         when(clProvider.getFilteredNodeTemplates(any()))
111                 .thenReturn(List.of(new ToscaNodeTemplate(), new ToscaNodeTemplate()));
112
113         listOfTemplates = provider.getControlLoopDefinitions(null, null);
114         assertThat(listOfTemplates).hasSize(2);
115     }
116
117     /**
118      * Test the fetching of a full ToscaServiceTemplate object - as opposed to the reduced template that is being
119      * tested in the testGetToscaServiceTemplateReduced() test.
120      *
121      */
122     @Test
123     void testGetToscaServiceTemplate() throws Exception {
124         var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
125         var clProvider = mock(ControlLoopProvider.class);
126         var participantProvider = mock(ParticipantProvider.class);
127
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);
133
134         provider.createControlLoopDefinitions(serviceTemplate);
135         verify(serviceTemplateProvider).createServiceTemplate(serviceTemplate);
136
137         when(serviceTemplateProvider.getToscaServiceTemplate(eq(null), eq(null))).thenReturn(serviceTemplate);
138
139         ToscaServiceTemplate returnedServiceTemplate = provider.getToscaServiceTemplate(null, null);
140         assertThat(returnedServiceTemplate).isNotNull();
141
142         Map<String, ToscaNodeTemplate> nodeTemplates =
143                 returnedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
144
145         assertThat(nodeTemplates).hasSize(8);
146     }
147
148     /**
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.
151      *
152      */
153     @Test
154     void testGetToscaServiceTemplateReduced() throws Exception {
155         var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
156         var clProvider = mock(ControlLoopProvider.class);
157         var participantProvider = mock(ParticipantProvider.class);
158
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);
164
165         provider.createControlLoopDefinitions(serviceTemplate);
166
167         when(serviceTemplateProvider.getServiceTemplateList(any(), any())).thenReturn(List.of(serviceTemplate));
168
169         String returnedServiceTemplate = provider.getToscaServiceTemplateReduced(null, null);
170         assertThat(returnedServiceTemplate).isNotNull();
171         ToscaServiceTemplate parsedServiceTemplate = CODER.decode(returnedServiceTemplate, ToscaServiceTemplate.class);
172
173         assertThat(parsedServiceTemplate.getToscaTopologyTemplate().getNodeTemplates()).hasSize(8);
174     }
175
176     /**
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.
180      *
181      */
182     @Test
183     void testGetToscaServiceTemplateSchema() throws Exception {
184         var serviceTemplateProvider = mock(ServiceTemplateProvider.class);
185         var clProvider = mock(ControlLoopProvider.class);
186         var participantProvider = mock(ParticipantProvider.class);
187
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);
193
194         provider.createControlLoopDefinitions(serviceTemplate);
195
196         mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
197
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);
202
203         for (Map.Entry<String, Class<?>> entry : sections.entrySet()) {
204             String returnedServiceTemplateSchema = provider.getToscaServiceTemplateSchema(entry.getKey());
205             assertThat(returnedServiceTemplateSchema).isNotNull();
206
207             var visitor = new SchemaFactoryWrapper();
208
209             if (entry.getKey().equals("node_templates")) {
210                 mapper.acceptJsonFormatVisitor(
211                         mapper.getTypeFactory().constructCollectionType(List.class, ToscaNodeTemplate.class), visitor);
212             } else {
213                 mapper.acceptJsonFormatVisitor(mapper.constructType(entry.getValue()), visitor);
214             }
215
216             var jsonSchema = visitor.finalSchema();
217             String localServiceTemplateSchema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
218             assertThat(localServiceTemplateSchema).isEqualTo(returnedServiceTemplateSchema);
219         }
220     }
221 }