d9df764a2d9dccba0a64ce06a817520f89ea12fc
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2024-2025 OpenInfra Foundation Europe. All rights reserved.
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.participant.intermediary.handler;
22
23 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyInt;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.times;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
36 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
37 import org.onap.policy.clamp.models.acm.concepts.AcElementDeploy;
38 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
39 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
40 import org.onap.policy.clamp.models.acm.concepts.ParticipantDeploy;
41 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
42 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionPrepare;
43 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
44
45 class AcSubStateHandlerTest {
46
47     @Test
48     void handleAcStateChangeNullTest() {
49         var cacheProvider = mock(CacheProvider.class);
50         var ach = new AcSubStateHandler(cacheProvider, mock(ThreadHandler.class));
51
52         var acMigration = new AutomationCompositionMigration();
53         acMigration.setPrecheck(true);
54         assertDoesNotThrow(() -> ach.handleAcMigrationPrecheck(acMigration));
55
56         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
57         acMigration.setAutomationCompositionId(automationComposition.getInstanceId());
58         acMigration.setCompositionTargetId(UUID.randomUUID());
59         assertDoesNotThrow(() -> ach.handleAcMigrationPrecheck(acMigration));
60
61         var acPrepare = new AutomationCompositionPrepare();
62         assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepare));
63
64         acPrepare.setAutomationCompositionId(automationComposition.getInstanceId());
65         assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepare));
66     }
67
68     @Test
69     void handleAcMigrationPrecheckTest() {
70         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
71         automationComposition.setCompositionId(UUID.randomUUID());
72         automationComposition.setInstanceId(UUID.randomUUID());
73         automationComposition.setCompositionTargetId(UUID.randomUUID());
74         var cacheProvider = new CacheProvider(CommonTestData.getParticipantParameters());
75         var definitions =
76                 CommonTestData.createAutomationCompositionElementDefinitionList(automationComposition);
77         cacheProvider.addElementDefinition(automationComposition.getCompositionId(), definitions);
78         cacheProvider.addElementDefinition(automationComposition.getCompositionTargetId(), definitions);
79         var participantDeploy =
80                 CommonTestData.createparticipantDeploy(cacheProvider.getParticipantId(), automationComposition);
81         cacheProvider.initializeAutomationComposition(automationComposition.getCompositionId(),
82                 automationComposition.getInstanceId(), participantDeploy);
83         var migrationMsg = new AutomationCompositionMigration();
84         migrationMsg.setStage(0);
85         migrationMsg.setCompositionId(automationComposition.getCompositionId());
86         migrationMsg.setAutomationCompositionId(automationComposition.getInstanceId());
87         migrationMsg.setCompositionTargetId(automationComposition.getCompositionTargetId());
88         migrationMsg.setParticipantUpdatesList(List.of(participantDeploy));
89         migrationMsg.setPrecheck(true);
90         var listener = mock(ThreadHandler.class);
91         var ach = new AcSubStateHandler(cacheProvider, listener);
92         ach.handleAcMigrationPrecheck(migrationMsg);
93         verify(listener, times(automationComposition.getElements().size()))
94                 .migratePrecheck(any(), any(), any(), any(), any());
95     }
96
97     @Test
98     void handleAcMigrationPrecheckAddRemoveTest() {
99         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
100         automationComposition.setCompositionId(UUID.randomUUID());
101         automationComposition.setInstanceId(UUID.randomUUID());
102         var cacheProvider = new CacheProvider(CommonTestData.getParticipantParameters());
103         var definitions =
104                 CommonTestData.createAutomationCompositionElementDefinitionList(automationComposition);
105         cacheProvider.addElementDefinition(automationComposition.getCompositionId(), definitions);
106         var participantDeploy =
107                 CommonTestData.createparticipantDeploy(cacheProvider.getParticipantId(), automationComposition);
108         cacheProvider.initializeAutomationComposition(automationComposition.getCompositionId(),
109                 automationComposition.getInstanceId(), participantDeploy);
110
111         var acMigrate = new AutomationComposition(automationComposition);
112         acMigrate.setCompositionTargetId(UUID.randomUUID());
113
114         // replacing first element with new one
115         var element = acMigrate.getElements().values().iterator().next();
116         element.setDefinition(new ToscaConceptIdentifier("policy.clamp.new.element", "1.0.0"));
117         element.setId(UUID.randomUUID());
118
119         var migrateDefinitions =
120                 CommonTestData.createAutomationCompositionElementDefinitionList(acMigrate);
121         cacheProvider.addElementDefinition(acMigrate.getCompositionTargetId(), migrateDefinitions);
122
123         var migrationMsg = new AutomationCompositionMigration();
124         migrationMsg.setStage(0);
125         migrationMsg.setCompositionId(acMigrate.getCompositionId());
126         migrationMsg.setAutomationCompositionId(acMigrate.getInstanceId());
127         migrationMsg.setCompositionTargetId(acMigrate.getCompositionTargetId());
128         var participantMigrate = CommonTestData.createparticipantDeploy(cacheProvider.getParticipantId(), acMigrate);
129         migrationMsg.setParticipantUpdatesList(List.of(participantMigrate));
130         var listener = mock(ThreadHandler.class);
131         var ach = new AcSubStateHandler(cacheProvider, listener);
132         ach.handleAcMigrationPrecheck(migrationMsg);
133         verify(listener, times(acMigrate.getElements().size() + 1))
134                 .migratePrecheck(any(), any(), any(), any(), any());
135     }
136
137     @Test
138     void handlePrepareTest() {
139         var listener = mock(ThreadHandler.class);
140         var cacheProvider = mock(CacheProvider.class);
141         var ach = new AcSubStateHandler(cacheProvider, listener);
142
143         var acPrepareMsg = new AutomationCompositionPrepare();
144         acPrepareMsg.setPreDeploy(true);
145         acPrepareMsg.setStage(0);
146         assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepareMsg));
147
148         acPrepareMsg.setParticipantId(CommonTestData.getParticipantId());
149         when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
150         var participantDeploy = new ParticipantDeploy();
151         participantDeploy.setParticipantId(CommonTestData.getParticipantId());
152         acPrepareMsg.getParticipantList().add(participantDeploy);
153
154         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
155         acPrepareMsg.setAutomationCompositionId(automationComposition.getInstanceId());
156         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
157                 .thenReturn(automationComposition);
158         Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
159         for (var element : automationComposition.getElements().values()) {
160             var acElementDeploy = new AcElementDeploy();
161             acElementDeploy.setProperties(Map.of());
162             acElementDeploy.setId(element.getId());
163             participantDeploy.getAcElementList().add(acElementDeploy);
164             map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
165         }
166         when(cacheProvider.getAcElementsDefinitions())
167             .thenReturn(Map.of(automationComposition.getCompositionId(), map));
168
169         ach.handleAcPrepare(acPrepareMsg);
170         verify(listener, times(automationComposition.getElements().size())).prepare(any(), any(), any(), anyInt());
171     }
172
173     @Test
174     void handleReviewTest() {
175         var cacheProvider = mock(CacheProvider.class);
176         when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
177
178         var acPrepareMsg = new AutomationCompositionPrepare();
179         acPrepareMsg.setPreDeploy(false);
180         acPrepareMsg.setParticipantId(CommonTestData.getParticipantId());
181
182         var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
183         acPrepareMsg.setAutomationCompositionId(automationComposition.getInstanceId());
184         when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
185             .thenReturn(automationComposition);
186         Map<ToscaConceptIdentifier, AutomationCompositionElementDefinition> map = new HashMap<>();
187         for (var element : automationComposition.getElements().values()) {
188             var acElementDeploy = new AcElementDeploy();
189             acElementDeploy.setProperties(Map.of());
190             acElementDeploy.setId(element.getId());
191             map.put(element.getDefinition(), new AutomationCompositionElementDefinition());
192         }
193         when(cacheProvider.getAcElementsDefinitions())
194             .thenReturn(Map.of(automationComposition.getCompositionId(), map));
195
196         var listener = mock(ThreadHandler.class);
197         var ach = new AcSubStateHandler(cacheProvider, listener);
198         ach.handleAcPrepare(acPrepareMsg);
199         verify(listener, times(automationComposition.getElements().size())).review(any(), any(), any());
200     }
201 }