ba1cc0813b8c738ca6024477cfbd6925a1b866bb
[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.instantiation;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNull;
28 import static org.mockito.ArgumentMatchers.anyString;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32
33 import java.io.IOException;
34 import java.util.List;
35 import java.util.Optional;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.Test;
38 import org.mockito.Mockito;
39 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
40 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
41 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
42 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
43 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
44 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
45 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
46 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
47 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
48 import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
49 import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
50 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
54
55 /**
56  * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
57  *
58  */
59 class ControlLoopInstantiationProviderTest {
60     private static final String ID_NAME = "PMSH_Instance1";
61     private static final String ID_VERSION = "1.2.3";
62     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
63     private static final String CL_INSTANTIATION_UPDATE_JSON =
64             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
65     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
66             "src/test/resources/rest/controlloops/PassiveCommand.json";
67     private static final String CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
68             "src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json";
69     private static final String CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON =
70             "src/test/resources/rest/controlloops/ControlLoopsNotFound.json";
71     private static final String TOSCA_TEMPLATE_YAML =
72             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
73     private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
74     private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
75     private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
76     private static final String CONTROLLOOP_ELEMENT_NAME_NOT_FOUND =
77             "\"ControlLoops\" INVALID, item has status INVALID\n"
78                     + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
79                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n"
80                     + "  \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
81                     + "    \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n";
82
83     private static final String CONTROLLOOP_DEFINITION_NOT_FOUND = "\"ControlLoops\" INVALID, item has status INVALID\n"
84             + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
85             + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
86             + " Commissioned control loop definition not FOUND\n"
87             + "  \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
88             + "    item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
89             + " Commissioned control loop definition not FOUND\n";
90
91     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
92
93     @BeforeAll
94     public static void setUpBeforeClass() throws Exception {
95         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
96     }
97
98     @Test
99     void testIntanceResponses() throws Exception {
100         var participantProvider = Mockito.mock(ParticipantProvider.class);
101         var clProvider = mock(ControlLoopProvider.class);
102         var supervisionHandler = mock(SupervisionHandler.class);
103         var commissioningProvider = mock(CommissioningProvider.class);
104
105         when(commissioningProvider.getAllToscaServiceTemplate()).thenReturn(List.of(serviceTemplate));
106         when(commissioningProvider.getToscaServiceTemplate(ID_NAME, ID_VERSION)).thenReturn(serviceTemplate);
107
108         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
109                 supervisionHandler, participantProvider);
110         var instancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
111         assertNull(instancePropertyList.getErrorDetails());
112         var id = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
113         assertEquals(id, instancePropertyList.getAffectedInstanceProperties().get(0));
114
115         ControlLoops controlLoops =
116                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
117         var controlLoop = controlLoops.getControlLoopList().get(0);
118         controlLoop.setName(ID_NAME);
119         controlLoop.setVersion(ID_VERSION);
120         when(clProvider.getControlLoops(ID_NAME, ID_VERSION)).thenReturn(List.of(controlLoop));
121
122         var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
123         assertEquals(ControlLoopOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
124         assertEquals(ID_NAME, instanceOrderState.getControlLoopIdentifierList().get(0).getName());
125
126         when(clProvider.findControlLoop(ID_NAME, ID_VERSION)).thenReturn(Optional.of(controlLoop));
127         when(clProvider.deleteControlLoop(ID_NAME, ID_VERSION)).thenReturn(controlLoop);
128
129         var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
130         assertEquals(ID_NAME, instanceResponse.getAffectedControlLoops().get(0).getName());
131
132     }
133
134     @Test
135     void testInstantiationCrud() throws Exception {
136         var participantProvider = Mockito.mock(ParticipantProvider.class);
137         var participants = CommonTestData.createParticipants();
138         when(participantProvider.getParticipants()).thenReturn(participants);
139
140         var commissioningProvider = mock(CommissioningProvider.class);
141         var toscaNodeTemplate1 = new ToscaNodeTemplate();
142         toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement");
143         toscaNodeTemplate1.setVersion("1.2.3");
144         when(commissioningProvider.getControlLoopDefinitions(anyString(), anyString()))
145                 .thenReturn(List.of(toscaNodeTemplate1));
146
147         var toscaNodeTemplate2 = new ToscaNodeTemplate();
148         toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement");
149         toscaNodeTemplate2.setVersion("1.2.3");
150         var toscaNodeTemplate3 = new ToscaNodeTemplate();
151         toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement");
152         toscaNodeTemplate3.setVersion("1.2.3");
153         var toscaNodeTemplate4 = new ToscaNodeTemplate();
154         toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
155         toscaNodeTemplate4.setVersion("1.2.3");
156
157         when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
158                 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
159
160         var supervisionHandler = mock(SupervisionHandler.class);
161         var clProvider = mock(ControlLoopProvider.class);
162         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
163                 supervisionHandler, participantProvider);
164         ControlLoops controlLoopsCreate =
165                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
166         InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
167         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
168
169         verify(clProvider).saveControlLoops(controlLoopsCreate.getControlLoopList());
170
171         for (var controlLoop : controlLoopsCreate.getControlLoopList()) {
172             when(clProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion()))
173                     .thenReturn(List.of(controlLoop));
174
175             ControlLoops controlLoopsGet =
176                     instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
177             assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
178             assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
179         }
180
181         ControlLoops controlLoopsUpdate =
182                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
183
184         instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
185         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
186
187         verify(clProvider).saveControlLoops(controlLoopsUpdate.getControlLoopList());
188
189         for (var controlLoop : controlLoopsUpdate.getControlLoopList()) {
190             when(clProvider.findControlLoop(controlLoop.getKey().asIdentifier())).thenReturn(Optional.of(controlLoop));
191             when(clProvider.findControlLoop(controlLoop.getName(), controlLoop.getVersion()))
192                     .thenReturn(Optional.of(controlLoop));
193             when(clProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion())).thenReturn(controlLoop);
194         }
195
196         InstantiationCommand instantiationCommand =
197                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
198         instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
199         InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
200
201         verify(supervisionHandler).triggerControlLoopSupervision(instantiationCommand.getControlLoopIdentifierList());
202
203         // in order to delete a controlLoop the state must be UNINITIALISED
204         controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
205         instantiationProvider.updateControlLoops(controlLoopsCreate);
206
207         for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
208             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
209
210             verify(clProvider).deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
211         }
212     }
213
214     @Test
215     void testInstantiationDelete() throws Exception {
216
217         ControlLoops controlLoops =
218                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
219
220         ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
221         var participantProvider = Mockito.mock(ParticipantProvider.class);
222         var clProvider = mock(ControlLoopProvider.class);
223         var supervisionHandler = mock(SupervisionHandler.class);
224         var commissioningProvider = mock(CommissioningProvider.class);
225
226         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
227                 supervisionHandler, participantProvider);
228
229         assertThatThrownBy(
230                 () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
231                         .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
232
233         for (ControlLoopState state : ControlLoopState.values()) {
234             if (!ControlLoopState.UNINITIALISED.equals(state)) {
235                 assertThatDeleteThrownBy(controlLoops, state);
236             }
237         }
238         controlLoop0.setState(ControlLoopState.UNINITIALISED);
239
240         for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
241             when(clProvider.findControlLoop(controlLoop.getName(), controlLoop.getVersion()))
242                     .thenReturn(Optional.of(controlLoop));
243             when(clProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion())).thenReturn(controlLoop);
244
245             instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
246         }
247     }
248
249     private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
250         ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
251         controlLoop.setState(state);
252         var participantProvider = Mockito.mock(ParticipantProvider.class);
253         var clProvider = mock(ControlLoopProvider.class);
254         var supervisionHandler = mock(SupervisionHandler.class);
255         var commissioningProvider = mock(CommissioningProvider.class);
256
257         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
258                 supervisionHandler, participantProvider);
259
260         when(clProvider.findControlLoop(controlLoop.getName(), controlLoop.getVersion()))
261                 .thenReturn(Optional.of(controlLoop));
262
263         assertThatThrownBy(
264                 () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
265                         .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
266     }
267
268     @Test
269     void testCreateControlLoops_NoDuplicates() throws Exception {
270         var commissioningProvider = mock(CommissioningProvider.class);
271
272         var toscaNodeTemplate1 = new ToscaNodeTemplate();
273         toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement");
274         toscaNodeTemplate1.setVersion("1.2.3");
275         when(commissioningProvider.getControlLoopDefinitions(anyString(), anyString()))
276                 .thenReturn(List.of(toscaNodeTemplate1));
277
278         var toscaNodeTemplate2 = new ToscaNodeTemplate();
279         toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement");
280         toscaNodeTemplate2.setVersion("1.2.3");
281         var toscaNodeTemplate3 = new ToscaNodeTemplate();
282         toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement");
283         toscaNodeTemplate3.setVersion("1.2.3");
284         var toscaNodeTemplate4 = new ToscaNodeTemplate();
285         toscaNodeTemplate4.setName("org.onap.domain.pmsh.PMSH_DCAEMicroservice");
286         toscaNodeTemplate4.setVersion("1.2.3");
287
288         when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
289                 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
290
291         ControlLoops controlLoopsCreate =
292                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
293
294         var clProvider = mock(ControlLoopProvider.class);
295         var participantProvider = Mockito.mock(ParticipantProvider.class);
296         var supervisionHandler = mock(SupervisionHandler.class);
297
298         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
299                 supervisionHandler, participantProvider);
300
301         InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
302         InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
303
304         when(clProvider.findControlLoop(controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier()))
305                 .thenReturn(Optional.of(controlLoopsCreate.getControlLoopList().get(0)));
306
307         assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
308                 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
309     }
310
311     @Test
312     void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
313         var toscaNodeTemplate1 = new ToscaNodeTemplate();
314         toscaNodeTemplate1.setName("org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement");
315         toscaNodeTemplate1.setVersion("1.2.3");
316
317         var toscaNodeTemplate2 = new ToscaNodeTemplate();
318         toscaNodeTemplate2.setName("org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement");
319         toscaNodeTemplate2.setVersion("1.2.3");
320         var toscaNodeTemplate3 = new ToscaNodeTemplate();
321         toscaNodeTemplate3.setName("org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement");
322         toscaNodeTemplate3.setVersion("1.2.3");
323         var commissioningProvider = mock(CommissioningProvider.class);
324         ControlLoops controlLoops = InstantiationUtils
325                 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
326
327         when(commissioningProvider.getControlLoopDefinitions(
328                 controlLoops.getControlLoopList().get(0).getDefinition().getName(),
329                 controlLoops.getControlLoopList().get(0).getDefinition().getVersion()))
330                         .thenReturn(List.of(toscaNodeTemplate1));
331
332         when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
333                 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
334
335         var clProvider = mock(ControlLoopProvider.class);
336         var participantProvider = mock(ParticipantProvider.class);
337         var supervisionHandler = mock(SupervisionHandler.class);
338         var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
339                 participantProvider);
340
341         assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
342                 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
343
344         assertThatThrownBy(() -> provider.updateControlLoops(controlLoops))
345                 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
346     }
347
348     @Test
349     void testCreateControlLoops_CommissionedClNotFound() throws Exception {
350         ControlLoops controlLoops = InstantiationUtils
351                 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
352
353         var participantProvider = Mockito.mock(ParticipantProvider.class);
354         var clProvider = mock(ControlLoopProvider.class);
355         var supervisionHandler = mock(SupervisionHandler.class);
356         var commissioningProvider = mock(CommissioningProvider.class);
357         var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
358                 participantProvider);
359
360         assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
361                 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
362
363         assertThatThrownBy(() -> provider.updateControlLoops(controlLoops))
364                 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
365     }
366
367     @Test
368     void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
369         var participantProvider = Mockito.mock(ParticipantProvider.class);
370         var clProvider = mock(ControlLoopProvider.class);
371         var supervisionHandler = mock(SupervisionHandler.class);
372         var commissioningProvider = mock(CommissioningProvider.class);
373         var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
374                 supervisionHandler, participantProvider);
375         assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
376                 .hasMessageMatching(ORDERED_STATE_INVALID);
377     }
378 }