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 java.util.UUID;
31 import javax.ws.rs.client.Entity;
32 import javax.ws.rs.core.Response;
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.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.boot.test.context.SpringBootTest;
53 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
54 import org.springframework.boot.test.web.server.LocalServerPort;
55 import org.springframework.test.context.ActiveProfiles;
56 import org.springframework.test.context.junit.jupiter.SpringExtension;
59 * Class to perform unit test of {@link InstantiationController}}.
62 @ExtendWith(SpringExtension.class)
63 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
64 @ActiveProfiles({ "test", "default" })
65 class InstantiationControllerTest extends CommonRestController {
67 private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
69 private static final String AC_INSTANTIATION_UPDATE_JSON =
70 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
72 private static final String INSTANTIATION_ENDPOINT = "compositions/%s/instances";
74 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
77 private AcDefinitionProvider acDefinitionProvider;
80 private AutomationCompositionInstantiationProvider instantiationProvider;
83 private int randomServerPort;
86 public static void setUpBeforeClass() {
87 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
91 public void setUpPort() {
92 super.setHttpPrefix(randomServerPort);
95 private String getInstanceEndPoint(UUID compositionId) {
96 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString());
99 private String getInstanceEndPoint(UUID compositionId, UUID instanceId) {
100 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId;
105 super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}"));
109 void testCreate_Unauthorized() {
110 var automationComposition =
111 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
113 assertUnauthorizedPost(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
117 void testQuery_Unauthorized() {
118 assertUnauthorizedGet(getInstanceEndPoint(UUID.randomUUID()));
122 void testUpdate_Unauthorized() {
123 var automationComposition =
124 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
126 assertUnauthorizedPut(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
130 void testDelete_Unauthorized() {
131 assertUnauthorizedDelete(getInstanceEndPoint(UUID.randomUUID()));
136 var compositionId = createAcDefinitionInDB("Create");
137 var automationCompositionFromRsc =
138 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
139 automationCompositionFromRsc.setCompositionId(compositionId);
141 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
142 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
143 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
144 var instResponse = resp.readEntity(InstantiationResponse.class);
145 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
146 automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
147 automationCompositionFromRsc.getElements().values()
148 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
150 var automationCompositionFromDb =
151 instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId());
153 assertNotNull(automationCompositionFromDb);
154 assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
158 void testCreateBadRequest() {
159 var compositionId = createAcDefinitionInDB("CreateBadRequest");
160 var automationCompositionFromRsc = InstantiationUtils
161 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
162 automationCompositionFromRsc.setCompositionId(compositionId);
164 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
165 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
166 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
168 // testing Bad Request: AC already defined
169 resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
170 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
171 var instResponse = resp.readEntity(InstantiationResponse.class);
172 assertNotNull(instResponse.getErrorDetails());
173 assertNull(instResponse.getAffectedAutomationComposition());
177 void testQuery_NoResultWithThisName() {
178 var invocationBuilder =
179 super.sendRequest(getInstanceEndPoint(UUID.randomUUID()) + "?name=noResultWithThisName");
180 var rawresp = invocationBuilder.buildGet().invoke();
181 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
182 var resp = rawresp.readEntity(AutomationCompositions.class);
183 assertThat(resp.getAutomationCompositionList()).isEmpty();
188 var compositionId = createAcDefinitionInDB("Query");
189 var automationComposition =
190 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
191 automationComposition.setCompositionId(compositionId);
193 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
195 var invocationBuilder = super.sendRequest(
196 getInstanceEndPoint(compositionId) + "?name=" + automationComposition.getKey().getName());
197 var rawresp = invocationBuilder.buildGet().invoke();
198 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
199 var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
200 assertNotNull(automationCompositionsQuery);
201 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
202 assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
207 var compositionId = createAcDefinitionInDB("Get");
208 var automationComposition =
209 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Get");
210 automationComposition.setCompositionId(compositionId);
212 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
214 var invocationBuilder = super.sendRequest(
215 getInstanceEndPoint(compositionId, automationComposition.getInstanceId()));
216 var rawresp = invocationBuilder.buildGet().invoke();
217 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
218 var automationCompositionGet = rawresp.readEntity(AutomationComposition.class);
219 assertNotNull(automationCompositionGet);
220 assertEquals(automationComposition, automationCompositionGet);
225 var compositionId = createAcDefinitionInDB("Update");
226 var automationCompositionCreate =
227 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
228 automationCompositionCreate.setCompositionId(compositionId);
230 var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate);
232 var automationComposition =
233 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
234 automationComposition.setCompositionId(compositionId);
235 automationComposition.setInstanceId(response.getInstanceId());
236 automationComposition.getElements().values()
237 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
239 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
240 var resp = invocationBuilder.post(Entity.json(automationComposition));
241 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
243 var instResponse = resp.readEntity(InstantiationResponse.class);
244 InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
246 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
247 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
249 assertNotNull(automationCompositionsFromDb);
250 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
251 assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
256 var compositionId = createAcDefinitionInDB("Delete");
257 var automationCompositionFromRsc =
258 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
259 automationCompositionFromRsc.setCompositionId(compositionId);
262 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
264 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
265 var resp = invocationBuilder.delete();
266 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
267 instResponse = resp.readEntity(InstantiationResponse.class);
268 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
270 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
271 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
272 assertEquals(DeployState.DELETING,
273 automationCompositionsFromDb.getAutomationCompositionList().get(0).getDeployState());
277 void testDeleteNotFound() {
278 var compositionId = createAcDefinitionInDB("DeleteNotFound");
279 var automationCompositionFromRsc =
280 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
281 automationCompositionFromRsc.setCompositionId(compositionId);
283 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
285 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
286 var resp = invocationBuilder.delete();
287 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
291 void testDeploy_NotFound() {
292 var compositionId = createAcDefinitionInDB("Deploy_NotFound");
293 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
294 var resp = invocationBuilder.put(Entity.json(new AcInstanceStateUpdate()));
295 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
299 void testDeploy_BadRequest() {
300 var compositionId = createAcDefinitionInDB("Deploy_BadRequest");
302 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "BadRequest");
303 acFromRsc.setCompositionId(compositionId);
305 var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc);
307 var command = new AcInstanceStateUpdate();
308 command.setDeployOrder(null);
309 command.setLockOrder(null);
311 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
312 var resp = invocationBuilder.put(Entity.json(command));
313 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
318 var compositionId = createAcDefinitionInDB("Deploy");
319 var automationComposition =
320 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
321 automationComposition.setCompositionId(compositionId);
322 var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition);
324 var instantiationUpdate = new AcInstanceStateUpdate();
325 instantiationUpdate.setDeployOrder(DeployOrder.DEPLOY);
326 instantiationUpdate.setLockOrder(null);
328 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
329 var resp = invocationBuilder.put(Entity.json(instantiationUpdate));
330 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
333 private UUID createAcDefinitionInDB(String name) {
334 var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
335 serviceTemplateCreate.setName(name);
336 var acmDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
337 acDefinitionProvider.updateAcDefinition(acmDefinition);
338 return acmDefinition.getCompositionId();