2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-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.http.handler;
23 import static org.mockito.ArgumentMatchers.any;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.when;
28 import java.util.HashMap;
29 import java.util.List;
31 import java.util.UUID;
32 import org.apache.commons.lang3.tuple.Pair;
33 import org.junit.jupiter.api.Test;
34 import org.onap.policy.clamp.acm.participant.http.main.handler.AutomationCompositionElementHandler;
35 import org.onap.policy.clamp.acm.participant.http.main.models.ConfigRequest;
36 import org.onap.policy.clamp.acm.participant.http.main.webclient.AcHttpClient;
37 import org.onap.policy.clamp.acm.participant.http.utils.CommonTestData;
38 import org.onap.policy.clamp.acm.participant.http.utils.ToscaUtils;
39 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
40 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
41 import org.onap.policy.clamp.models.acm.concepts.DeployState;
42 import org.onap.policy.clamp.models.acm.concepts.LockState;
43 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
44 import org.onap.policy.models.base.PfModelException;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
46 import org.springframework.http.HttpStatus;
48 class AcElementHandlerTest {
50 private final CommonTestData commonTestData = new CommonTestData();
51 private static final String HTTP_AUTOMATION_COMPOSITION_ELEMENT =
52 "org.onap.domain.database.Http_PMSHMicroserviceAutomationCompositionElement";
56 var instanceId = commonTestData.getAutomationCompositionId();
57 var element = commonTestData.getAutomationCompositionElement();
58 var acElementId = element.getId();
59 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
61 var automationCompositionElementHandler =
62 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
63 automationCompositionElementHandler.undeploy(instanceId, acElementId);
64 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
65 DeployState.UNDEPLOYED, null, StateChangeResult.NO_ERROR, "");
70 void testDeployConstraintViolations() {
71 var instanceId = commonTestData.getAutomationCompositionId();
72 var element = commonTestData.getAutomationCompositionElement();
73 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
75 var automationCompositionElementHandler =
76 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
78 Map<String, Object> map = new HashMap<>();
79 automationCompositionElementHandler.deploy(instanceId, element, map);
80 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
81 DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Constraint violations in the config request");
85 void testDeployError() {
86 var instanceId = commonTestData.getAutomationCompositionId();
87 var element = commonTestData.getAutomationCompositionElement();
88 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
90 var automationCompositionElementHandler =
91 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
93 Map<String, Object> map = new HashMap<>();
94 map.put("httpHeaders", 1);
95 automationCompositionElementHandler.deploy(instanceId, element, map);
96 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
97 DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Error extracting ConfigRequest ");
102 void testDeployFailed() {
103 var serviceTemplate = ToscaUtils.readAutomationCompositionFromTosca();
104 var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
105 var map = new HashMap<>(nodeTemplatesMap.get(HTTP_AUTOMATION_COMPOSITION_ELEMENT).getProperties());
106 var element = commonTestData.getAutomationCompositionElement();
107 map.putAll(element.getProperties());
108 var instanceId = commonTestData.getAutomationCompositionId();
109 var acHttpClient = mock(AcHttpClient.class);
110 when(acHttpClient.run(any())).thenReturn(Map.of(new ToscaConceptIdentifier(),
111 Pair.of(HttpStatus.BAD_REQUEST.value(), "")));
112 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
114 var automationCompositionElementHandler =
115 new AutomationCompositionElementHandler(participantIntermediaryApi, acHttpClient);
117 automationCompositionElementHandler.deploy(instanceId, element, map);
118 verify(acHttpClient).run(any(ConfigRequest.class));
119 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
120 DeployState.UNDEPLOYED, null, StateChangeResult.FAILED,
121 "Error on Invoking the http request: [(400,)]");
126 var serviceTemplate = ToscaUtils.readAutomationCompositionFromTosca();
127 var nodeTemplatesMap = serviceTemplate.getToscaTopologyTemplate().getNodeTemplates();
128 var map = new HashMap<>(nodeTemplatesMap.get(HTTP_AUTOMATION_COMPOSITION_ELEMENT).getProperties());
129 var element = commonTestData.getAutomationCompositionElement();
130 map.putAll(element.getProperties());
131 var instanceId = commonTestData.getAutomationCompositionId();
132 var acHttpClient = mock(AcHttpClient.class);
133 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
135 var automationCompositionElementHandler =
136 new AutomationCompositionElementHandler(participantIntermediaryApi, acHttpClient);
138 automationCompositionElementHandler.deploy(instanceId, element, map);
139 verify(acHttpClient).run(any(ConfigRequest.class));
140 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, element.getId(),
141 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
145 void testUpdate() throws PfModelException {
146 var instanceId = commonTestData.getAutomationCompositionId();
147 var element = commonTestData.getAutomationCompositionElement();
148 var acElementId = element.getId();
149 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
151 var automationCompositionElementHandler =
152 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
154 automationCompositionElementHandler.update(instanceId, element, Map.of());
155 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
156 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Update not supported");
160 void testLock() throws PfModelException {
161 var instanceId = commonTestData.getAutomationCompositionId();
162 var acElementId = UUID.randomUUID();
163 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
165 var automationCompositionElementHandler =
166 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
168 automationCompositionElementHandler.lock(instanceId, acElementId);
169 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId, null,
170 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
174 void testUnlock() throws PfModelException {
175 var instanceId = commonTestData.getAutomationCompositionId();
176 var acElementId = UUID.randomUUID();
177 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
179 var automationCompositionElementHandler =
180 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
182 automationCompositionElementHandler.unlock(instanceId, acElementId);
183 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId, null,
184 LockState.UNLOCKED, StateChangeResult.NO_ERROR, "Unlocked");
188 void testDelete() throws PfModelException {
189 var instanceId = commonTestData.getAutomationCompositionId();
190 var acElementId = UUID.randomUUID();
191 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
193 var automationCompositionElementHandler =
194 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
196 automationCompositionElementHandler.delete(instanceId, acElementId);
197 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
198 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
202 void testPrime() throws PfModelException {
203 var compositionId = UUID.randomUUID();
204 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
206 var automationCompositionElementHandler =
207 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
209 automationCompositionElementHandler.prime(compositionId, List.of());
210 verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.PRIMED,
211 StateChangeResult.NO_ERROR, "Primed");
215 void testDeprime() throws PfModelException {
216 var compositionId = UUID.randomUUID();
217 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
219 var automationCompositionElementHandler =
220 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
222 automationCompositionElementHandler.deprime(compositionId);
223 verify(participantIntermediaryApi).updateCompositionState(compositionId, AcTypeState.COMMISSIONED,
224 StateChangeResult.NO_ERROR, "Deprimed");
228 void testMigrate() throws PfModelException {
229 var instanceId = commonTestData.getAutomationCompositionId();
230 var element = commonTestData.getAutomationCompositionElement();
231 var acElementId = element.getId();
232 var participantIntermediaryApi = mock(ParticipantIntermediaryApi.class);
234 var automationCompositionElementHandler =
235 new AutomationCompositionElementHandler(participantIntermediaryApi, mock(AcHttpClient.class));
237 automationCompositionElementHandler.migrate(instanceId, element, UUID.randomUUID(), Map.of());
238 verify(participantIntermediaryApi).updateAutomationCompositionElementState(instanceId, acElementId,
239 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Migrated");