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.AutomationCompositionStateChangePublisher;
39 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
40 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
41 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
42 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
43 import org.onap.policy.clamp.models.acm.concepts.DeployState;
44 import org.onap.policy.clamp.models.acm.concepts.LockState;
45 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
46 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
47 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
48 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
50 class SupervisionAcHandlerTest {
51 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
52 private static final UUID IDENTIFIER = UUID.randomUUID();
55 void testHandleAutomationCompositionStateChangeAckMessage() {
56 var automationComposition =
57 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
58 automationComposition.setInstanceId(IDENTIFIER);
59 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
60 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
61 .thenReturn(Optional.of(automationComposition));
63 var handler = new SupervisionAcHandler(automationCompositionProvider,
64 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
65 mock(AcElementPropertiesPublisher.class));
67 var automationCompositionAckMessage =
68 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
69 automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
70 handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
72 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
75 private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType,
76 AutomationComposition automationComposition, DeployState deployState, LockState lockState) {
77 var automationCompositionAckMessage = new AutomationCompositionDeployAck(messageType);
78 for (var elementEntry : automationComposition.getElements().entrySet()) {
79 var acElementDeployAck = new AcElementDeployAck(deployState, lockState, "", "", Map.of(), true, "");
80 automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
83 automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
84 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
85 return automationCompositionAckMessage;
89 void testHandleAutomationCompositionUpdateAckMessage() {
90 var automationComposition =
91 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
92 automationComposition.setInstanceId(IDENTIFIER);
93 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
94 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
95 .thenReturn(Optional.of(automationComposition));
97 var automationCompositionAckMessage =
98 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
99 automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
100 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
102 var handler = new SupervisionAcHandler(automationCompositionProvider,
103 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
104 mock(AcElementPropertiesPublisher.class));
106 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
108 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
112 void testHandleAcUpdateAckFailedMessage() {
113 var automationComposition =
114 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
115 automationComposition.setDeployState(DeployState.DEPLOYING);
116 automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
117 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
118 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
119 .thenReturn(Optional.of(automationComposition));
121 var automationCompositionAckMessage =
122 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
123 for (var element : automationComposition.getElements().values()) {
124 element.setDeployState(DeployState.DEPLOYED);
126 var elementEntry = automationComposition.getElements().entrySet().iterator().next();
127 elementEntry.getValue().setDeployState(DeployState.DEPLOYING);
128 var acElementDeployAck =
129 new AcElementDeployAck(DeployState.UNDEPLOYED, LockState.NONE, "", "", Map.of(), true, "Error");
130 automationCompositionAckMessage
131 .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
133 automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
134 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
136 var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
138 var handler = new SupervisionAcHandler(automationCompositionProvider,
139 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null);
141 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
143 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
147 void testDeployFailed() {
148 var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
149 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
150 var handler = new SupervisionAcHandler(automationCompositionProvider, automationCompositionDeployPublisher,
151 mock(AutomationCompositionStateChangePublisher.class), mock(AcElementPropertiesPublisher.class));
153 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
154 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
155 var automationComposition =
156 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
157 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
158 handler.deploy(automationComposition, acDefinition);
159 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
160 verify(automationCompositionDeployPublisher).send(automationComposition, acDefinition.getServiceTemplate(), 0,
165 void testUndeploy() {
166 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
167 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
168 var handler = new SupervisionAcHandler(automationCompositionProvider,
169 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
170 mock(AcElementPropertiesPublisher.class));
171 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
172 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
173 var automationComposition =
174 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Undeploy");
175 handler.undeploy(automationComposition, acDefinition);
177 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
178 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
182 void testUndeployFailed() {
183 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
184 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
185 var handler = new SupervisionAcHandler(automationCompositionProvider,
186 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
187 mock(AcElementPropertiesPublisher.class));
189 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
190 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
191 var automationComposition =
192 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnDeploy");
193 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
194 automationComposition.getElements().values()
195 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYING));
196 handler.undeploy(automationComposition, acDefinition);
197 verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
198 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
203 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
204 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
205 var handler = new SupervisionAcHandler(automationCompositionProvider,
206 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
207 mock(AcElementPropertiesPublisher.class));
208 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
209 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
210 var automationComposition =
211 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
212 handler.unlock(automationComposition, acDefinition);
214 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
215 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
219 void testUnlockFailed() {
220 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
221 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
222 var handler = new SupervisionAcHandler(automationCompositionProvider,
223 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
224 mock(AcElementPropertiesPublisher.class));
225 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
226 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
227 var automationComposition =
228 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
229 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
230 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
231 handler.unlock(automationComposition, acDefinition);
233 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
234 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
239 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
240 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
241 var handler = new SupervisionAcHandler(automationCompositionProvider,
242 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
243 mock(AcElementPropertiesPublisher.class));
244 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
245 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
246 var automationComposition =
247 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
248 handler.lock(automationComposition, acDefinition);
250 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
251 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
255 void testLockFailed() {
256 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
257 var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
258 var handler = new SupervisionAcHandler(automationCompositionProvider,
259 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
260 mock(AcElementPropertiesPublisher.class));
261 var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
262 var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
263 var automationComposition =
264 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
265 automationComposition.setStateChangeResult(StateChangeResult.FAILED);
266 automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
267 handler.lock(automationComposition, acDefinition);
269 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
270 verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
274 void testDeleteAck() {
275 var automationCompositionProvider = mock(AutomationCompositionProvider.class);
276 var automationComposition =
277 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
278 automationComposition.setDeployState(DeployState.DELETING);
279 when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
280 .thenReturn(Optional.of(automationComposition));
282 var automationCompositionAckMessage =
283 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
284 automationCompositionAckMessage
285 .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId());
286 automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
288 var handler = new SupervisionAcHandler(automationCompositionProvider,
289 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
290 mock(AcElementPropertiesPublisher.class));
292 handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
294 verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
299 var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class);
300 var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class),
301 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
302 acElementPropertiesPublisher);
303 var automationComposition =
304 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
305 handler.update(automationComposition);
306 verify(acElementPropertiesPublisher).send(any(AutomationComposition.class));