d3f85984374f60381ce0eecddc1083d63c79d731
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.acm.runtime.supervision;
22
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;
30
31 import java.util.Map;
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;
50
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();
54
55     @Test
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));
63
64         var handler = new SupervisionAcHandler(automationCompositionProvider,
65                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
66                 mock(AcElementPropertiesPublisher.class), null);
67
68         var automationCompositionAckMessage =
69                 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
70                         automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
71         handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
72
73         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
74     }
75
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(),
82                     acElementDeployAck);
83         }
84         automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
85         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
86         return automationCompositionAckMessage;
87     }
88
89     @Test
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));
97
98         var automationCompositionAckMessage =
99                 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
100                         automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
101         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
102
103         var handler = new SupervisionAcHandler(automationCompositionProvider,
104                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
105                 mock(AcElementPropertiesPublisher.class), null);
106
107         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
108
109         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
110     }
111
112     @Test
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));
121
122         var automationCompositionAckMessage =
123                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
124         for (var element : automationComposition.getElements().values()) {
125             element.setDeployState(DeployState.DEPLOYED);
126         }
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));
133
134         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
135         automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
136
137         var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
138
139         var handler = new SupervisionAcHandler(automationCompositionProvider,
140                 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null,
141                 null);
142
143         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
144
145         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
146     }
147
148     @Test
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);
154
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,
163                 true);
164     }
165
166     @Test
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);
178
179         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
180         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
181     }
182
183     @Test
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);
190
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());
201     }
202
203     @Test
204     void testUnlock() {
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);
215
216         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
217         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
218     }
219
220     @Test
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);
234
235         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
236         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
237     }
238
239     @Test
240     void testLock() {
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);
251
252         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
253         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
254     }
255
256     @Test
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);
270
271         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
272         verify(acStateChangePublisher).send(any(AutomationComposition.class), anyInt(), anyBoolean());
273     }
274
275     @Test
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));
283
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);
289
290         var handler = new SupervisionAcHandler(automationCompositionProvider,
291                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
292                 mock(AcElementPropertiesPublisher.class), null);
293
294         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
295
296         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
297     }
298
299     @Test
300     void testUpdate() {
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));
309     }
310
311     @Test
312     void testMigrate() {
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());
321     }
322 }