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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.acm.runtime.instantiation.rest;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertNotNull;
27 import static org.junit.jupiter.api.Assertions.assertNull;
28 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
30 import jakarta.ws.rs.client.Entity;
31 import jakarta.ws.rs.core.Response;
32 import java.util.UUID;
33 import org.junit.jupiter.api.BeforeAll;
34 import org.junit.jupiter.api.BeforeEach;
35 import org.junit.jupiter.api.Test;
36 import org.junit.jupiter.api.extension.ExtendWith;
37 import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
38 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
39 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
40 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
41 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
42 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
45 import org.onap.policy.clamp.models.acm.concepts.DeployState;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
47 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
48 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
49 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
50 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
52 import org.springframework.beans.factory.annotation.Autowired;
53 import org.springframework.boot.test.context.SpringBootTest;
54 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
55 import org.springframework.boot.test.web.server.LocalServerPort;
56 import org.springframework.test.context.ActiveProfiles;
57 import org.springframework.test.context.junit.jupiter.SpringExtension;
60 * Class to perform unit test of {@link InstantiationController}}.
63 @ExtendWith(SpringExtension.class)
64 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
65 @ActiveProfiles({ "test", "default" })
66 class InstantiationControllerTest extends CommonRestController {
68 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
70 private static final String AC_INSTANTIATION_UPDATE_JSON =
71 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
73 private static final String INSTANTIATION_ENDPOINT = "compositions/%s/instances";
75 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
77 private static final String NODE_TYPE = "org.onap.policy.clamp.acm.AutomationComposition";
80 private AcDefinitionProvider acDefinitionProvider;
83 private ParticipantProvider participantProvider;
86 private AutomationCompositionInstantiationProvider instantiationProvider;
89 private int randomServerPort;
92 public static void setUpBeforeClass() {
93 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
97 public void setUpPort() {
98 super.setHttpPrefix(randomServerPort);
101 private String getInstanceEndPoint(UUID compositionId) {
102 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString());
105 private String getInstanceEndPoint(UUID compositionId, UUID instanceId) {
106 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId;
111 super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}"));
115 void testCreate_Unauthorized() {
116 var automationComposition =
117 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
119 assertUnauthorizedPost(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
123 void testQuery_Unauthorized() {
124 assertUnauthorizedGet(getInstanceEndPoint(UUID.randomUUID()));
128 void testUpdate_Unauthorized() {
129 var automationComposition =
130 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
132 assertUnauthorizedPut(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
136 void testDelete_Unauthorized() {
137 assertUnauthorizedDelete(getInstanceEndPoint(UUID.randomUUID()));
142 var compositionId = createAcDefinitionInDB("Create");
143 var automationCompositionFromRsc =
144 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
145 automationCompositionFromRsc.setCompositionId(compositionId);
147 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
148 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
149 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
150 var instResponse = resp.readEntity(InstantiationResponse.class);
151 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
152 automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
153 automationCompositionFromRsc.getElements().values()
154 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
156 var automationCompositionFromDb =
157 instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId());
159 assertNotNull(automationCompositionFromDb);
160 assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
164 void testCreateBadRequest() {
165 var compositionId = createAcDefinitionInDB("CreateBadRequest");
166 var automationCompositionFromRsc = InstantiationUtils
167 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
168 automationCompositionFromRsc.setCompositionId(compositionId);
170 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
171 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
172 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
174 // testing Bad Request: AC already defined
175 resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
176 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
177 var instResponse = resp.readEntity(InstantiationResponse.class);
178 assertNotNull(instResponse.getErrorDetails());
179 assertNull(instResponse.getAffectedAutomationComposition());
183 void testQuery_NoResultWithThisName() {
184 var invocationBuilder =
185 super.sendRequest(getInstanceEndPoint(UUID.randomUUID()) + "?name=noResultWithThisName");
186 var rawresp = invocationBuilder.buildGet().invoke();
187 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
188 var resp = rawresp.readEntity(AutomationCompositions.class);
189 assertThat(resp.getAutomationCompositionList()).isEmpty();
194 var compositionId = createAcDefinitionInDB("Query");
195 var automationComposition =
196 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
197 automationComposition.setCompositionId(compositionId);
199 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
201 var invocationBuilder = super.sendRequest(
202 getInstanceEndPoint(compositionId) + "?name=" + automationComposition.getKey().getName());
203 var rawresp = invocationBuilder.buildGet().invoke();
204 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
205 var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
206 assertNotNull(automationCompositionsQuery);
207 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
208 assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
213 var compositionId = createAcDefinitionInDB("Get");
214 var automationComposition =
215 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Get");
216 automationComposition.setCompositionId(compositionId);
218 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
220 var invocationBuilder = super.sendRequest(
221 getInstanceEndPoint(compositionId, automationComposition.getInstanceId()));
222 var rawresp = invocationBuilder.buildGet().invoke();
223 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
224 var automationCompositionGet = rawresp.readEntity(AutomationComposition.class);
225 assertNotNull(automationCompositionGet);
226 assertEquals(automationComposition, automationCompositionGet);
231 var compositionId = createAcDefinitionInDB("Update");
232 var automationCompositionCreate =
233 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
234 automationCompositionCreate.setCompositionId(compositionId);
236 var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate);
238 var automationComposition =
239 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
240 automationComposition.setCompositionId(compositionId);
241 automationComposition.setInstanceId(response.getInstanceId());
242 automationComposition.getElements().values()
243 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
245 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
246 var resp = invocationBuilder.post(Entity.json(automationComposition));
247 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
249 var instResponse = resp.readEntity(InstantiationResponse.class);
250 InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
252 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
253 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
255 assertNotNull(automationCompositionsFromDb);
256 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
257 assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
262 var compositionId = createAcDefinitionInDB("Delete");
263 var automationCompositionFromRsc =
264 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
265 automationCompositionFromRsc.setCompositionId(compositionId);
268 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
270 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
271 var resp = invocationBuilder.delete();
272 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
273 instResponse = resp.readEntity(InstantiationResponse.class);
274 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
276 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
277 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
278 assertEquals(DeployState.DELETING,
279 automationCompositionsFromDb.getAutomationCompositionList().get(0).getDeployState());
283 void testDeleteNotFound() {
284 var compositionId = createAcDefinitionInDB("DeleteNotFound");
285 var automationCompositionFromRsc =
286 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
287 automationCompositionFromRsc.setCompositionId(compositionId);
289 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
291 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
292 var resp = invocationBuilder.delete();
293 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
297 void testDeploy_NotFound() {
298 var compositionId = createAcDefinitionInDB("Deploy_NotFound");
299 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
300 var resp = invocationBuilder.put(Entity.json(new AcInstanceStateUpdate()));
301 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
305 void testDeploy_BadRequest() {
306 var compositionId = createAcDefinitionInDB("Deploy_BadRequest");
308 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "BadRequest");
309 acFromRsc.setCompositionId(compositionId);
311 var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc);
313 var command = new AcInstanceStateUpdate();
314 command.setDeployOrder(null);
315 command.setLockOrder(null);
317 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
318 var resp = invocationBuilder.put(Entity.json(command));
319 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
324 var compositionId = createAcDefinitionInDB("Deploy");
325 var automationComposition =
326 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
327 automationComposition.setCompositionId(compositionId);
328 var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition);
330 var instantiationUpdate = new AcInstanceStateUpdate();
331 instantiationUpdate.setDeployOrder(DeployOrder.DEPLOY);
332 instantiationUpdate.setLockOrder(null);
334 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
335 var resp = invocationBuilder.put(Entity.json(instantiationUpdate));
336 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
339 private UUID createAcDefinitionInDB(String name) {
340 var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
341 serviceTemplateCreate.setName(name);
342 var acmDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
343 acDefinitionProvider.updateAcDefinition(acmDefinition, NODE_TYPE);
344 saveDummyParticipantInDb();
345 return acmDefinition.getCompositionId();
348 private void saveDummyParticipantInDb() {
349 participantProvider.saveParticipant(CommonTestData.createParticipant(CommonTestData.getParticipantId()));