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