2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023 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.acm.runtime.supervision;
23 import static org.mockito.ArgumentMatchers.any;
24 import static org.mockito.ArgumentMatchers.anyBoolean;
25 import static org.mockito.ArgumentMatchers.anyInt;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
29 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
32 import java.util.Optional;
33 import java.util.UUID;
34 import org.junit.jupiter.api.Test;
35 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
36 import org.onap.policy.clamp.acm.runtime.supervision.comm.AcElementPropertiesPublisher;
37 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
38 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
40 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
41 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
42 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.DeployState;
45 import org.onap.policy.clamp.models.acm.concepts.LockState;
46 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
47 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
48 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
49 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
51 class SupervisionAcHandlerTest {
52 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
53 private static final UUID IDENTIFIER = UUID.randomUUID();
56 void testHandleAutomationCompositionStateChangeAckMessage() {
57 var automationComposition =
58 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
59 automationComposition.setInstanceId(IDENTIFIER);
60 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
61 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
62 .thenReturn(Optional.of(automationComposition));
64 var handler = new SupervisionAcHandler(automationCompositionProvider,
65 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
66 mock(AcElementPropertiesPublisher.class), null);
68 var automationCompositionAckMessage =
69 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
70 automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
71 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
73 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
76 private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType,
77 AutomationComposition automationComposition, DeployState deployState, LockState lockState) {
78 var automationCompositionAckMessage = new AutomationCompositionDeployAck(messageType);
79 for (var elementEntry : automationComposition.getElements().entrySet()) {
80 var acElementDeployAck = new AcElementDeployAck(deployState, lockState, "", "", Map.of(), true, "");
81 automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
84 automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
85 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
86 return automationCompositionAckMessage;
90 void testHandleAutomationCompositionUpdateAckMessage() {
91 var automationComposition =
92 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
93 automationComposition.setInstanceId(IDENTIFIER);
94 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
95 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
96 .thenReturn(Optional.of(automationComposition));
98 var automationCompositionAckMessage =
99 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
100 automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
101 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
103 var handler = new SupervisionAcHandler(automationCompositionProvider,
104 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
105 mock(AcElementPropertiesPublisher.class), null);
107 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
109 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
113 void testHandleAcUpdateAckFailedMessage() {
114 var automationComposition =
115 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
116 automationComposition.setDeployState(DeployState.DEPLOYING);
117 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
118 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
119 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
120 .thenReturn(Optional.of(automationComposition));
122 var automationCompositionAckMessage =
123 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
124 for (var element : automationComposition.getElements().values()) {
125 element.setDeployState(DeployState.DEPLOYED);
127 var elementEntry = automationComposition.getElements().entrySet().iterator().next();
128 elementEntry.getValue().setDeployState(DeployState.DEPLOYING);
129 var acElementDeployAck =
130 new AcElementDeployAck(DeployState.UNDEPLOYED, LockState.NONE, "", "", Map.of(), true, "Error");
131 automationCompositionAckMessage
132 .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
134 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
135 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
137 var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
139 var handler = new SupervisionAcHandler(automationCompositionProvider,
140 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null,
143 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
145 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
149 void testDeployFailed() {
150 var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
151 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
152 var handler = new SupervisionAcHandler(automationCompositionProvider, automationCompositionDeployPublisher,
153 mock(AutomationCompositionStateChangePublisher.class), mock(AcElementPropertiesPublisher.class), null);
155 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
156 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
157 var automationComposition =
158 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
159 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
160 handler.deploy(automationComposition, acDefinition);
161 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
162 verify(automationCompositionDeployPublisher).send(automationComposition, acDefinition.getServiceTemplate(), 0,
167 void testUndeploy() {
168 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
169 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
170 var handler = new SupervisionAcHandler(automationCompositionProvider,
171 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
172 mock(AcElementPropertiesPublisher.class), null);
173 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
174 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
175 var automationComposition =
176 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Undeploy");
177 handler.undeploy(automationComposition, acDefinition);
179 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
180 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
184 void testUndeployFailed() {
185 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
186 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
187 var handler = new SupervisionAcHandler(automationCompositionProvider,
188 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
189 mock(AcElementPropertiesPublisher.class), null);
191 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
192 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
193 var automationComposition =
194 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnDeploy");
195 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
196 automationComposition.getElements().values()
197 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYING));
198 handler.undeploy(automationComposition, acDefinition);
199 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
200 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
205 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
206 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
207 var handler = new SupervisionAcHandler(automationCompositionProvider,
208 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
209 mock(AcElementPropertiesPublisher.class), null);
210 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
211 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
212 var automationComposition =
213 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
214 handler.unlock(automationComposition, acDefinition);
216 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
217 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
221 void testUnlockFailed() {
222 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
223 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
224 var handler = new SupervisionAcHandler(automationCompositionProvider,
225 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
226 mock(AcElementPropertiesPublisher.class), null);
227 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
228 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
229 var automationComposition =
230 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
231 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
232 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
233 handler.unlock(automationComposition, acDefinition);
235 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
236 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
241 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
242 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
243 var handler = new SupervisionAcHandler(automationCompositionProvider,
244 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
245 mock(AcElementPropertiesPublisher.class), null);
246 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
247 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
248 var automationComposition =
249 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
250 handler.lock(automationComposition, acDefinition);
252 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
253 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
257 void testLockFailed() {
258 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
259 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
260 var handler = new SupervisionAcHandler(automationCompositionProvider,
261 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
262 mock(AcElementPropertiesPublisher.class), null);
263 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
264 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
265 var automationComposition =
266 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
267 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
268 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
269 handler.lock(automationComposition, acDefinition);
271 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
272 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
276 void testDeleteAck() {
277 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
278 var automationComposition =
279 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
280 automationComposition.setDeployState(DeployState.DELETING);
281 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
282 .thenReturn(Optional.of(automationComposition));
284 var automationCompositionAckMessage =
285 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
286 automationCompositionAckMessage
287 .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId());
288 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
290 var handler = new SupervisionAcHandler(automationCompositionProvider,
291 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
292 mock(AcElementPropertiesPublisher.class), null);
294 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
296 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
301 var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class);
302 var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class),
303 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
304 acElementPropertiesPublisher, null);
305 var automationComposition =
306 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
307 handler.update(automationComposition);
308 verify(acElementPropertiesPublisher).send(any(AutomationComposition.class));
313 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
314 var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class);
315 var handler = new SupervisionAcHandler(automationCompositionProvider, null, null, null,
316 acCompositionMigrationPublisher);
317 var automationComposition =
318 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
319 handler.migrate(automationComposition, UUID.randomUUID());
320 verify(acCompositionMigrationPublisher).send(any(AutomationComposition.class), any());