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.instantiation;
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;
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;
56 * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
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";
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";
91 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
94 public static void setUpBeforeClass() throws Exception {
95 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
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);
105 when(commissioningProvider.getAllToscaServiceTemplate()).thenReturn(List.of(serviceTemplate));
106 when(commissioningProvider.getToscaServiceTemplate(ID_NAME, ID_VERSION)).thenReturn(serviceTemplate);
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));
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));
122 var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
123 assertEquals(ControlLoopOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
124 assertEquals(ID_NAME, instanceOrderState.getControlLoopIdentifierList().get(0).getName());
126 when(clProvider.findControlLoop(ID_NAME, ID_VERSION)).thenReturn(Optional.of(controlLoop));
127 when(clProvider.deleteControlLoop(ID_NAME, ID_VERSION)).thenReturn(controlLoop);
129 var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
130 assertEquals(ID_NAME, instanceResponse.getAffectedControlLoops().get(0).getName());
135 void testInstantiationCrud() throws Exception {
136 var participantProvider = Mockito.mock(ParticipantProvider.class);
137 var participants = CommonTestData.createParticipants();
138 when(participantProvider.getParticipants()).thenReturn(participants);
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));
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");
157 when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
158 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
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);
169 verify(clProvider).saveControlLoops(controlLoopsCreate.getControlLoopList());
171 for (var controlLoop : controlLoopsCreate.getControlLoopList()) {
172 when(clProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion()))
173 .thenReturn(List.of(controlLoop));
175 ControlLoops controlLoopsGet =
176 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
177 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
178 assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
181 ControlLoops controlLoopsUpdate =
182 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
184 instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
185 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
187 verify(clProvider).saveControlLoops(controlLoopsUpdate.getControlLoopList());
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);
196 InstantiationCommand instantiationCommand =
197 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
198 instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
199 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
201 verify(supervisionHandler).triggerControlLoopSupervision(instantiationCommand.getControlLoopIdentifierList());
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);
207 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
208 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
210 verify(clProvider).deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
215 void testInstantiationDelete() throws Exception {
217 ControlLoops controlLoops =
218 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
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);
226 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
227 supervisionHandler, participantProvider);
230 () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
231 .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
233 for (ControlLoopState state : ControlLoopState.values()) {
234 if (!ControlLoopState.UNINITIALISED.equals(state)) {
235 assertThatDeleteThrownBy(controlLoops, state);
238 controlLoop0.setState(ControlLoopState.UNINITIALISED);
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);
245 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
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);
257 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
258 supervisionHandler, participantProvider);
260 when(clProvider.findControlLoop(controlLoop.getName(), controlLoop.getVersion()))
261 .thenReturn(Optional.of(controlLoop));
264 () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
265 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
269 void testCreateControlLoops_NoDuplicates() throws Exception {
270 var commissioningProvider = mock(CommissioningProvider.class);
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));
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");
288 when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
289 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3, toscaNodeTemplate4));
291 ControlLoops controlLoopsCreate =
292 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
294 var clProvider = mock(ControlLoopProvider.class);
295 var participantProvider = Mockito.mock(ParticipantProvider.class);
296 var supervisionHandler = mock(SupervisionHandler.class);
298 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
299 supervisionHandler, participantProvider);
301 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
302 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
304 when(clProvider.findControlLoop(controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier()))
305 .thenReturn(Optional.of(controlLoopsCreate.getControlLoopList().get(0)));
307 assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
308 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
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");
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");
327 when(commissioningProvider.getControlLoopDefinitions(
328 controlLoops.getControlLoopList().get(0).getDefinition().getName(),
329 controlLoops.getControlLoopList().get(0).getDefinition().getVersion()))
330 .thenReturn(List.of(toscaNodeTemplate1));
332 when(commissioningProvider.getControlLoopElementDefinitions(toscaNodeTemplate1))
333 .thenReturn(List.of(toscaNodeTemplate1, toscaNodeTemplate2, toscaNodeTemplate3));
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);
341 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
342 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
344 assertThatThrownBy(() -> provider.updateControlLoops(controlLoops))
345 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
349 void testCreateControlLoops_CommissionedClNotFound() throws Exception {
350 ControlLoops controlLoops = InstantiationUtils
351 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
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);
360 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
361 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
363 assertThatThrownBy(() -> provider.updateControlLoops(controlLoops))
364 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
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);