0bec9d0ce2e76d98e7bcc971d1a6977a8d23c59d
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2023-2024 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.timeout;
28 import static org.mockito.Mockito.times;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
32
33 import java.util.Map;
34 import java.util.Optional;
35 import java.util.UUID;
36 import org.junit.jupiter.api.Test;
37 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
38 import org.onap.policy.clamp.acm.runtime.supervision.comm.AcElementPropertiesPublisher;
39 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionDeployPublisher;
40 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionMigrationPublisher;
41 import org.onap.policy.clamp.acm.runtime.supervision.comm.AutomationCompositionStateChangePublisher;
42 import org.onap.policy.clamp.acm.runtime.supervision.comm.ParticipantSyncPublisher;
43 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
44 import org.onap.policy.clamp.models.acm.concepts.AcElementDeployAck;
45 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
47 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
48 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
49 import org.onap.policy.clamp.models.acm.concepts.DeployState;
50 import org.onap.policy.clamp.models.acm.concepts.LockState;
51 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
52 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
53 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
54 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
55 import org.onap.policy.clamp.models.acm.persistence.provider.AutomationCompositionProvider;
56
57 class SupervisionAcHandlerTest {
58     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
59     private static final UUID IDENTIFIER = UUID.randomUUID();
60
61     @Test
62     void testHandleAutomationCompositionStateChangeAckMessage() {
63         var automationComposition =
64                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
65         automationComposition.setInstanceId(IDENTIFIER);
66         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
67         when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
68                 .thenReturn(Optional.of(automationComposition));
69
70         var acDefinitionProvider = mock(AcDefinitionProvider.class);
71         when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
72                 .thenReturn(new AutomationCompositionDefinition());
73
74         var handler = new SupervisionAcHandler(automationCompositionProvider, acDefinitionProvider,
75                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
76                 mock(AcElementPropertiesPublisher.class), null,
77                 mock(ParticipantSyncPublisher.class));
78
79         var automationCompositionAckMessage =
80                 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATECHANGE_ACK,
81                         automationComposition, DeployState.DEPLOYED, LockState.UNLOCKED);
82         handler.handleAutomationCompositionStateChangeAckMessage(automationCompositionAckMessage);
83
84         verify(automationCompositionProvider, times(3))
85             .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
86     }
87
88     private AutomationCompositionDeployAck getAutomationCompositionDeployAck(ParticipantMessageType messageType,
89             AutomationComposition automationComposition, DeployState deployState, LockState lockState) {
90         var automationCompositionAckMessage = new AutomationCompositionDeployAck(messageType);
91         for (var elementEntry : automationComposition.getElements().entrySet()) {
92             var acElementDeployAck = new AcElementDeployAck(deployState, lockState, "", "", Map.of(), true, "");
93             automationCompositionAckMessage.getAutomationCompositionResultMap().put(elementEntry.getKey(),
94                     acElementDeployAck);
95         }
96         automationCompositionAckMessage.setAutomationCompositionId(automationComposition.getInstanceId());
97         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
98         automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
99         return automationCompositionAckMessage;
100     }
101
102     @Test
103     void testHandleAutomationCompositionUpdateAckMessage() {
104         var automationComposition =
105                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
106         automationComposition.setInstanceId(IDENTIFIER);
107         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
108         when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
109                 .thenReturn(Optional.of(automationComposition));
110
111         var acDefinitionProvider = mock(AcDefinitionProvider.class);
112         when(acDefinitionProvider.getAcDefinition(automationComposition.getCompositionId()))
113                 .thenReturn(new AutomationCompositionDefinition());
114
115         var automationCompositionAckMessage =
116                 getAutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK,
117                         automationComposition, DeployState.DEPLOYED, LockState.LOCKED);
118         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
119
120         var handler = new SupervisionAcHandler(automationCompositionProvider, acDefinitionProvider,
121                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
122                 mock(AcElementPropertiesPublisher.class), null,
123                 mock(ParticipantSyncPublisher.class));
124
125         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
126
127         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
128     }
129
130     @Test
131     void testHandleAcUpdateAckFailedMessage() {
132         var automationComposition =
133                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
134         automationComposition.setDeployState(DeployState.DEPLOYING);
135         automationComposition.setStateChangeResult(StateChangeResult.NO_ERROR);
136         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
137         when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
138                 .thenReturn(Optional.of(automationComposition));
139
140         var automationCompositionAckMessage =
141                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
142         automationCompositionAckMessage.setStateChangeResult(StateChangeResult.NO_ERROR);
143         for (var element : automationComposition.getElements().values()) {
144             element.setDeployState(DeployState.DEPLOYED);
145         }
146         var elementEntry = automationComposition.getElements().entrySet().iterator().next();
147         elementEntry.getValue().setDeployState(DeployState.DEPLOYING);
148         var acElementDeployAck =
149                 new AcElementDeployAck(DeployState.UNDEPLOYED, LockState.NONE, "", "", Map.of(), true, "Error");
150         automationCompositionAckMessage
151                 .setAutomationCompositionResultMap(Map.of(elementEntry.getKey(), acElementDeployAck));
152
153         automationCompositionAckMessage.setParticipantId(CommonTestData.getParticipantId());
154         automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
155
156         var automationCompositionStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
157
158         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
159                 mock(AutomationCompositionDeployPublisher.class), automationCompositionStateChangePublisher, null,
160                 null, mock(ParticipantSyncPublisher.class));
161
162         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
163
164         verify(automationCompositionProvider)
165             .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
166     }
167
168     @Test
169     void testDeployFailed() {
170         var automationCompositionDeployPublisher = mock(AutomationCompositionDeployPublisher.class);
171         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
172         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
173                 automationCompositionDeployPublisher, mock(AutomationCompositionStateChangePublisher.class),
174                 mock(AcElementPropertiesPublisher.class), null, mock(ParticipantSyncPublisher.class));
175
176         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
177         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
178         var automationComposition =
179                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Deploy");
180         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
181         handler.deploy(automationComposition, acDefinition);
182         verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
183         verify(automationCompositionDeployPublisher, timeout(1000))
184             .send(automationComposition, acDefinition.getServiceTemplate(), 0, true);
185     }
186
187     @Test
188     void testUndeploy() {
189         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
190         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
191         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
192                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
193                 mock(AcElementPropertiesPublisher.class), null,
194                 mock(ParticipantSyncPublisher.class));
195         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
196         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
197         var automationComposition =
198                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Undeploy");
199         handler.undeploy(automationComposition, acDefinition);
200
201         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
202         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
203     }
204
205     @Test
206     void testUndeployFailed() {
207         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
208         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
209         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
210                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
211                 mock(AcElementPropertiesPublisher.class), null,
212                 mock(ParticipantSyncPublisher.class));
213
214         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
215         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
216         var automationComposition =
217                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnDeploy");
218         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
219         automationComposition.getElements().values()
220                 .forEach(element -> element.setDeployState(DeployState.UNDEPLOYING));
221         handler.undeploy(automationComposition, acDefinition);
222         verify(automationCompositionProvider).updateAutomationComposition(automationComposition);
223         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
224     }
225
226     @Test
227     void testUnlock() {
228         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
229         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
230         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
231                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
232                 mock(AcElementPropertiesPublisher.class), null,
233                 mock(ParticipantSyncPublisher.class));
234         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
235         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
236         var automationComposition =
237                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
238         handler.unlock(automationComposition, acDefinition);
239
240         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
241         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
242     }
243
244     @Test
245     void testUnlockFailed() {
246         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
247         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
248         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
249                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
250                 mock(AcElementPropertiesPublisher.class), null,
251                 mock(ParticipantSyncPublisher.class));
252         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
253         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
254         var automationComposition =
255                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "UnLock");
256         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
257         automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.UNLOCKING));
258         handler.unlock(automationComposition, acDefinition);
259
260         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
261         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
262     }
263
264     @Test
265     void testLock() {
266         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
267         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
268         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
269                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
270                 mock(AcElementPropertiesPublisher.class), null,
271                 mock(ParticipantSyncPublisher.class));
272         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
273         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
274         var automationComposition =
275                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
276         handler.lock(automationComposition, acDefinition);
277
278         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
279         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
280     }
281
282     @Test
283     void testLockFailed() {
284         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
285         var acStateChangePublisher = mock(AutomationCompositionStateChangePublisher.class);
286         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
287                 mock(AutomationCompositionDeployPublisher.class), acStateChangePublisher,
288                 mock(AcElementPropertiesPublisher.class), null,
289                 mock(ParticipantSyncPublisher.class));
290         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
291         var acDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
292         var automationComposition =
293                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
294         automationComposition.setStateChangeResult(StateChangeResult.FAILED);
295         automationComposition.getElements().values().forEach(element -> element.setLockState(LockState.LOCKING));
296         handler.lock(automationComposition, acDefinition);
297
298         verify(automationCompositionProvider).updateAutomationComposition(any(AutomationComposition.class));
299         verify(acStateChangePublisher, timeout(1000)).send(any(AutomationComposition.class), anyInt(), anyBoolean());
300     }
301
302     @Test
303     void testDeleteAck() {
304         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
305         var automationComposition =
306                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Crud");
307         automationComposition.setDeployState(DeployState.DELETING);
308         when(automationCompositionProvider.findAutomationComposition(IDENTIFIER))
309                 .thenReturn(Optional.of(automationComposition));
310
311         var automationCompositionAckMessage =
312                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY_ACK);
313         automationCompositionAckMessage
314                 .setParticipantId(automationComposition.getElements().values().iterator().next().getParticipantId());
315         automationCompositionAckMessage.setAutomationCompositionId(IDENTIFIER);
316
317         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
318                 mock(AutomationCompositionDeployPublisher.class), mock(AutomationCompositionStateChangePublisher.class),
319                 mock(AcElementPropertiesPublisher.class), null,
320                 mock(ParticipantSyncPublisher.class));
321
322         handler.handleAutomationCompositionUpdateAckMessage(automationCompositionAckMessage);
323
324         verify(automationCompositionProvider)
325             .updateAutomationCompositionElement(any(AutomationCompositionElement.class), any());
326     }
327
328     @Test
329     void testUpdate() {
330         var acElementPropertiesPublisher = mock(AcElementPropertiesPublisher.class);
331         var handler = new SupervisionAcHandler(mock(AutomationCompositionProvider.class),
332                 mock(AcDefinitionProvider.class), mock(AutomationCompositionDeployPublisher.class),
333                 mock(AutomationCompositionStateChangePublisher.class), acElementPropertiesPublisher, null,
334                 mock(ParticipantSyncPublisher.class));
335         var automationComposition =
336                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Lock");
337         handler.update(automationComposition);
338         verify(acElementPropertiesPublisher, timeout(1000)).send(any(AutomationComposition.class));
339     }
340
341     @Test
342     void testMigrate() {
343         var automationCompositionProvider = mock(AutomationCompositionProvider.class);
344         var acCompositionMigrationPublisher = mock(AutomationCompositionMigrationPublisher.class);
345         var handler = new SupervisionAcHandler(automationCompositionProvider, mock(AcDefinitionProvider.class),
346                 null, null, null,
347                 acCompositionMigrationPublisher, mock(ParticipantSyncPublisher.class));
348         var automationComposition =
349                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Migrate");
350         handler.migrate(automationComposition, UUID.randomUUID());
351         verify(acCompositionMigrationPublisher, timeout(1000)).send(any(AutomationComposition.class), any());
352     }
353 }