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
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.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;
31 import java.util.HashMap;
32 import java.util.List;
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;
45 class AcSubStateHandlerTest {
48 void handleAcStateChangeNullTest() {
49 var cacheProvider = mock(CacheProvider.class);
50 var ach = new AcSubStateHandler(cacheProvider, mock(ThreadHandler.class));
52 var acMigration = new AutomationCompositionMigration();
53 acMigration.setPrecheck(true);
54 assertDoesNotThrow(() -> ach.handleAcMigrationPrecheck(acMigration));
56 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
57 acMigration.setAutomationCompositionId(automationComposition.getInstanceId());
58 acMigration.setCompositionTargetId(UUID.randomUUID());
59 assertDoesNotThrow(() -> ach.handleAcMigrationPrecheck(acMigration));
61 var acPrepare = new AutomationCompositionPrepare();
62 assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepare));
64 acPrepare.setAutomationCompositionId(automationComposition.getInstanceId());
65 assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepare));
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());
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());
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());
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);
111 var acMigrate = new AutomationComposition(automationComposition);
112 acMigrate.setCompositionTargetId(UUID.randomUUID());
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());
119 var migrateDefinitions =
120 CommonTestData.createAutomationCompositionElementDefinitionList(acMigrate);
121 cacheProvider.addElementDefinition(acMigrate.getCompositionTargetId(), migrateDefinitions);
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());
138 void handlePrepareTest() {
139 var listener = mock(ThreadHandler.class);
140 var cacheProvider = mock(CacheProvider.class);
141 var ach = new AcSubStateHandler(cacheProvider, listener);
143 var acPrepareMsg = new AutomationCompositionPrepare();
144 acPrepareMsg.setPreDeploy(true);
145 acPrepareMsg.setStage(0);
146 assertDoesNotThrow(() -> ach.handleAcPrepare(acPrepareMsg));
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);
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());
166 when(cacheProvider.getAcElementsDefinitions())
167 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
169 ach.handleAcPrepare(acPrepareMsg);
170 verify(listener, times(automationComposition.getElements().size())).prepare(any(), any(), any(), anyInt());
174 void handleReviewTest() {
175 var cacheProvider = mock(CacheProvider.class);
176 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
178 var acPrepareMsg = new AutomationCompositionPrepare();
179 acPrepareMsg.setPreDeploy(false);
180 acPrepareMsg.setParticipantId(CommonTestData.getParticipantId());
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());
193 when(cacheProvider.getAcElementsDefinitions())
194 .thenReturn(Map.of(automationComposition.getCompositionId(), map));
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());