87e00da934dd1f623bfac389ba1d526a097b3cd6
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2023 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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.acm.runtime.supervision.comm;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.mockito.ArgumentMatchers.anyString;
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.Collections;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Map;
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.main.parameters.AcRuntimeParameterGroup;
39 import org.onap.policy.clamp.acm.runtime.participants.AcmParticipantProvider;
40 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionAcHandler;
41 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionHandler;
42 import org.onap.policy.clamp.acm.runtime.supervision.SupervisionParticipantHandler;
43 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
44 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
46 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionDefinition;
47 import org.onap.policy.clamp.models.acm.concepts.DeployState;
48 import org.onap.policy.clamp.models.acm.concepts.LockState;
49 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionDeployAck;
50 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregister;
51 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantDeregisterAck;
52 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantMessageType;
53 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantPrimeAck;
54 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegister;
55 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantRegisterAck;
56 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.ParticipantStatus;
57 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
58 import org.onap.policy.clamp.models.acm.utils.AcmUtils;
59 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
60 import org.onap.policy.common.endpoints.event.comm.TopicSink;
61 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
62
63 class SupervisionMessagesTest {
64
65     private static final String AC_INSTANTIATION_UPDATE_JSON =
66             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
67     private static final String NOT_ACTIVE = "Not Active!";
68     private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
69     private static final String TOPIC = "my-topic";
70
71     private static final String TOSCA_ELEMENT_NAME = "org.onap.policy.clamp.acm.AutomationCompositionElement";
72
73     @Test
74     void testSendParticipantRegisterAck() {
75         var acRegisterAckPublisher = new ParticipantRegisterAckPublisher();
76         var topicSink = mock(TopicSink.class);
77         acRegisterAckPublisher.active(List.of(topicSink));
78         acRegisterAckPublisher.send(new ParticipantRegisterAck());
79         verify(topicSink).send(anyString());
80         acRegisterAckPublisher.stop();
81     }
82
83     @Test
84     void testSendParticipantRegisterAckNoActive() {
85         var acRegisterAckPublisher = new ParticipantRegisterAckPublisher();
86         assertThatThrownBy(() -> acRegisterAckPublisher.send(new ParticipantRegisterAck()))
87                 .hasMessageMatching(NOT_ACTIVE);
88     }
89
90     @Test
91     void testReceiveParticipantDeregister() {
92         final var participantDeregisterMsg = new ParticipantDeregister();
93         var supervisionHandler = mock(SupervisionParticipantHandler.class);
94         var participantDeregisterListener = new ParticipantDeregisterListener(supervisionHandler);
95         participantDeregisterListener.onTopicEvent(INFRA, TOPIC, null, participantDeregisterMsg);
96         verify(supervisionHandler).handleParticipantMessage(participantDeregisterMsg);
97     }
98
99     @Test
100     void testSendParticipantDeregisterAck() {
101         var acDeregisterAckPublisher = new ParticipantDeregisterAckPublisher();
102         var topicSink = mock(TopicSink.class);
103         acDeregisterAckPublisher.active(Collections.singletonList(topicSink));
104         acDeregisterAckPublisher.send(new ParticipantDeregisterAck());
105         verify(topicSink).send(anyString());
106         acDeregisterAckPublisher.stop();
107     }
108
109     void testSendParticipantDeregisterAckNoActive() {
110         var acDeregisterAckPublisher = new ParticipantDeregisterAckPublisher();
111         assertThatThrownBy(() -> acDeregisterAckPublisher.send(new ParticipantDeregisterAck()))
112                 .hasMessageMatching(NOT_ACTIVE);
113     }
114
115     @Test
116     void testReceiveParticipantPrimeAckMessage() {
117         final var participantPrimeAckMsg = new ParticipantPrimeAck();
118         var supervisionHandler = mock(SupervisionHandler.class);
119         var participantPrimeAckListener = new ParticipantPrimeAckListener(supervisionHandler);
120         participantPrimeAckListener.onTopicEvent(INFRA, TOPIC, null, participantPrimeAckMsg);
121         verify(supervisionHandler).handleParticipantMessage(participantPrimeAckMsg);
122     }
123
124     @Test
125     void testSendAutomationCompositionStateChangePublisherNotActive() {
126         var publisher = new AutomationCompositionStateChangePublisher();
127         assertThatThrownBy(() -> publisher.send(getAutomationComposition(), 0, true)).hasMessage(NOT_ACTIVE);
128     }
129
130     private AutomationComposition getAutomationComposition() {
131         var automationComposition = new AutomationComposition();
132         automationComposition.setName("NAME");
133         automationComposition.setVersion("0.0.1");
134         automationComposition.setDeployState(DeployState.DEPLOYED);
135         automationComposition.setLockState(LockState.UNLOCKING);
136         return automationComposition;
137     }
138
139     @Test
140     void testSendAutomationCompositionStateChangePublisher() {
141         var publisher = new AutomationCompositionStateChangePublisher();
142         var topicSink = mock(TopicSink.class);
143         publisher.active(List.of(topicSink));
144         publisher.send(getAutomationComposition(), 0, true);
145         verify(topicSink).send(anyString());
146         publisher.stop();
147     }
148
149     @Test
150     void testParticipantPrimePublisherDecommissioning() {
151         var publisher = new ParticipantPrimePublisher(mock(ParticipantProvider.class),
152                 mock(AcmParticipantProvider.class), mock(AcRuntimeParameterGroup.class));
153         var topicSink = mock(TopicSink.class);
154         publisher.active(List.of(topicSink));
155         publisher.sendDepriming(UUID.randomUUID());
156         verify(topicSink).send(anyString());
157     }
158
159     @Test
160     void testParticipantPrimePublisherPriming() {
161         var participantId = UUID.randomUUID();
162         Map<ToscaConceptIdentifier, UUID> supportedElementMap = new HashMap<>();
163         supportedElementMap.put(
164                 new ToscaConceptIdentifier("org.onap.policy.clamp.acm.PolicyAutomationCompositionElement", "1.0.0"),
165                 participantId);
166         supportedElementMap.put(new ToscaConceptIdentifier(
167                 "org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement", "1.0.0"), participantId);
168         supportedElementMap.put(
169                 new ToscaConceptIdentifier("org.onap.policy.clamp.acm.HttpAutomationCompositionElement", "1.0.0"),
170                 participantId);
171         var participantProvider = mock(ParticipantProvider.class);
172         when(participantProvider.getSupportedElementMap()).thenReturn(supportedElementMap);
173         var publisher = new ParticipantPrimePublisher(participantProvider, mock(AcmParticipantProvider.class),
174                 CommonTestData.getTestParamaterGroup());
175         var topicSink = mock(TopicSink.class);
176         publisher.active(List.of(topicSink));
177         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
178         serviceTemplate.setName("Name");
179         serviceTemplate.setVersion("1.0.0");
180         var acmDefinition = new AutomationCompositionDefinition();
181         acmDefinition.setCompositionId(UUID.randomUUID());
182         acmDefinition.setServiceTemplate(serviceTemplate);
183         var acElements = AcmUtils
184                 .extractAcElementsFromServiceTemplate(serviceTemplate, TOSCA_ELEMENT_NAME);
185         acmDefinition.setElementStateMap(AcmUtils.createElementStateMap(acElements, AcTypeState.COMMISSIONED));
186         var preparation = publisher.prepareParticipantPriming(acmDefinition);
187         publisher.sendPriming(preparation, acmDefinition.getCompositionId(), null);
188         verify(topicSink).send(anyString());
189     }
190
191     @Test
192     void testParticipantStatusReqPublisher() {
193         var publisher = new ParticipantStatusReqPublisher();
194         var topicSink = mock(TopicSink.class);
195         publisher.active(List.of(topicSink));
196         publisher.send(CommonTestData.getParticipantId());
197         verify(topicSink).send(anyString());
198     }
199
200     @Test
201     void testParticipantRegisterAckPublisher() {
202         var publisher = new ParticipantRegisterAckPublisher();
203         var topicSink = mock(TopicSink.class);
204         publisher.active(List.of(topicSink));
205         publisher.send(UUID.randomUUID(), CommonTestData.getParticipantId());
206         verify(topicSink).send(anyString());
207     }
208
209     @Test
210     void testParticipantDeregisterAckPublisher() {
211         var publisher = new ParticipantDeregisterAckPublisher();
212         var topicSink = mock(TopicSink.class);
213         publisher.active(List.of(topicSink));
214         publisher.send(UUID.randomUUID());
215         verify(topicSink).send(anyString());
216     }
217
218     @Test
219     void testAcElementPropertiesPublisher() {
220         var publisher = new AcElementPropertiesPublisher();
221         var topicSink = mock(TopicSink.class);
222         publisher.active(List.of(topicSink));
223         var automationComposition =
224                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
225         publisher.send(automationComposition);
226         verify(topicSink).send(anyString());
227     }
228
229     @Test
230     void testAutomationCompositionMigrationPublisher() {
231         var publisher = new AutomationCompositionMigrationPublisher();
232         var topicSink = mock(TopicSink.class);
233         publisher.active(List.of(topicSink));
234         var automationComposition =
235                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
236         publisher.send(automationComposition, UUID.randomUUID());
237         verify(topicSink).send(anyString());
238     }
239
240     @Test
241     void testParticipantRestartPublisher() {
242         var publisher = new ParticipantRestartPublisher(CommonTestData.getTestParamaterGroup());
243         var topicSink = mock(TopicSink.class);
244         publisher.active(List.of(topicSink));
245
246         var serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
247         // serviceTemplate.setName("Name");
248         // serviceTemplate.setVersion("1.0.0");
249         var acmDefinition = new AutomationCompositionDefinition();
250         acmDefinition.setCompositionId(UUID.randomUUID());
251         acmDefinition.setServiceTemplate(serviceTemplate);
252         var acElements = AcmUtils
253                 .extractAcElementsFromServiceTemplate(serviceTemplate, "");
254         acmDefinition.setElementStateMap(AcmUtils.createElementStateMap(acElements, AcTypeState.PRIMED));
255
256         var automationComposition =
257                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Crud");
258
259         var participantId = automationComposition.getElements().values().iterator().next().getParticipantId();
260         acmDefinition.getElementStateMap().values().iterator().next().setParticipantId(participantId);
261
262         publisher.send(participantId, acmDefinition, List.of(automationComposition));
263         verify(topicSink).send(anyString());
264     }
265
266     @Test
267     void testParticipantRegisterListener() {
268         final var participantRegister = new ParticipantRegister();
269         var supervisionHandler = mock(SupervisionParticipantHandler.class);
270         var participantRegisterListener = new ParticipantRegisterListener(supervisionHandler);
271         participantRegisterListener.onTopicEvent(INFRA, TOPIC, null, participantRegister);
272         verify(supervisionHandler).handleParticipantMessage(participantRegister);
273     }
274
275     @Test
276     void testParticipantStatusListener() {
277         final var participantStatus = new ParticipantStatus();
278         var supervisionHandler = mock(SupervisionParticipantHandler.class);
279         var participantStatusListener = new ParticipantStatusListener(supervisionHandler);
280         participantStatusListener.onTopicEvent(INFRA, TOPIC, null, participantStatus);
281         verify(supervisionHandler).handleParticipantMessage(participantStatus);
282     }
283
284     @Test
285     void testAutomationCompositionUpdateAckListener() {
286         final var automationCompositionAck =
287                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY);
288         var supervisionHandler = mock(SupervisionAcHandler.class);
289         var acUpdateAckListener = new AutomationCompositionUpdateAckListener(supervisionHandler);
290         acUpdateAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck);
291         verify(supervisionHandler).handleAutomationCompositionUpdateAckMessage(automationCompositionAck);
292     }
293
294     @Test
295     void testAutomationCompositionStateChangeAckListener() {
296         final var automationCompositionAck =
297                 new AutomationCompositionDeployAck(ParticipantMessageType.AUTOMATION_COMPOSITION_STATE_CHANGE);
298         var supervisionHandler = mock(SupervisionAcHandler.class);
299         var acStateChangeAckListener = new AutomationCompositionStateChangeAckListener(supervisionHandler);
300         acStateChangeAckListener.onTopicEvent(INFRA, TOPIC, null, automationCompositionAck);
301         verify(supervisionHandler).handleAutomationCompositionStateChangeAckMessage(automationCompositionAck);
302     }
303 }