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();
78 private AcDefinitionProvider acDefinitionProvider;
81 private ParticipantProvider participantProvider;
84 private AutomationCompositionInstantiationProvider instantiationProvider;
87 private int randomServerPort;
90 public static void setUpBeforeClass() {
91 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
95 public void setUpPort() {
96 super.setHttpPrefix(randomServerPort);
99 private String getInstanceEndPoint(UUID compositionId) {
100 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString());
103 private String getInstanceEndPoint(UUID compositionId, UUID instanceId) {
104 return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId;
109 super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}"));
113 void testCreate_Unauthorized() {
114 var automationComposition =
115 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
117 assertUnauthorizedPost(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
121 void testQuery_Unauthorized() {
122 assertUnauthorizedGet(getInstanceEndPoint(UUID.randomUUID()));
126 void testUpdate_Unauthorized() {
127 var automationComposition =
128 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
130 assertUnauthorizedPut(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
134 void testDelete_Unauthorized() {
135 assertUnauthorizedDelete(getInstanceEndPoint(UUID.randomUUID()));
140 var compositionId = createAcDefinitionInDB("Create");
141 var automationCompositionFromRsc =
142 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
143 automationCompositionFromRsc.setCompositionId(compositionId);
145 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
146 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
147 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
148 var instResponse = resp.readEntity(InstantiationResponse.class);
149 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
150 automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
151 automationCompositionFromRsc.getElements().values()
152 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
154 var automationCompositionFromDb =
155 instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId());
157 assertNotNull(automationCompositionFromDb);
158 assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
162 void testCreateBadRequest() {
163 var compositionId = createAcDefinitionInDB("CreateBadRequest");
164 var automationCompositionFromRsc = InstantiationUtils
165 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
166 automationCompositionFromRsc.setCompositionId(compositionId);
168 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
169 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
170 assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
172 // testing Bad Request: AC already defined
173 resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
174 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
175 var instResponse = resp.readEntity(InstantiationResponse.class);
176 assertNotNull(instResponse.getErrorDetails());
177 assertNull(instResponse.getAffectedAutomationComposition());
181 void testQuery_NoResultWithThisName() {
182 var invocationBuilder =
183 super.sendRequest(getInstanceEndPoint(UUID.randomUUID()) + "?name=noResultWithThisName");
184 var rawresp = invocationBuilder.buildGet().invoke();
185 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
186 var resp = rawresp.readEntity(AutomationCompositions.class);
187 assertThat(resp.getAutomationCompositionList()).isEmpty();
192 var compositionId = createAcDefinitionInDB("Query");
193 var automationComposition =
194 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
195 automationComposition.setCompositionId(compositionId);
197 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
199 var invocationBuilder = super.sendRequest(
200 getInstanceEndPoint(compositionId) + "?name=" + automationComposition.getKey().getName());
201 var rawresp = invocationBuilder.buildGet().invoke();
202 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
203 var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
204 assertNotNull(automationCompositionsQuery);
205 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
206 assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
211 var compositionId = createAcDefinitionInDB("Get");
212 var automationComposition =
213 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Get");
214 automationComposition.setCompositionId(compositionId);
216 instantiationProvider.createAutomationComposition(compositionId, automationComposition);
218 var invocationBuilder = super.sendRequest(
219 getInstanceEndPoint(compositionId, automationComposition.getInstanceId()));
220 var rawresp = invocationBuilder.buildGet().invoke();
221 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
222 var automationCompositionGet = rawresp.readEntity(AutomationComposition.class);
223 assertNotNull(automationCompositionGet);
224 assertEquals(automationComposition, automationCompositionGet);
229 var compositionId = createAcDefinitionInDB("Update");
230 var automationCompositionCreate =
231 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
232 automationCompositionCreate.setCompositionId(compositionId);
234 var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate);
236 var automationComposition =
237 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
238 automationComposition.setCompositionId(compositionId);
239 automationComposition.setInstanceId(response.getInstanceId());
240 automationComposition.getElements().values()
241 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
243 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
244 var resp = invocationBuilder.post(Entity.json(automationComposition));
245 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
247 var instResponse = resp.readEntity(InstantiationResponse.class);
248 InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
250 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
251 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
253 assertNotNull(automationCompositionsFromDb);
254 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
255 assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
260 var compositionId = createAcDefinitionInDB("Delete");
261 var automationCompositionFromRsc =
262 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
263 automationCompositionFromRsc.setCompositionId(compositionId);
266 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
268 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
269 var resp = invocationBuilder.delete();
270 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
271 instResponse = resp.readEntity(InstantiationResponse.class);
272 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
274 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
275 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
276 assertEquals(DeployState.DELETING,
277 automationCompositionsFromDb.getAutomationCompositionList().get(0).getDeployState());
281 void testDeleteNotFound() {
282 var compositionId = createAcDefinitionInDB("DeleteNotFound");
283 var automationCompositionFromRsc =
284 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
285 automationCompositionFromRsc.setCompositionId(compositionId);
287 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
289 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
290 var resp = invocationBuilder.delete();
291 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
295 void testDeploy_NotFound() {
296 var compositionId = createAcDefinitionInDB("Deploy_NotFound");
297 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
298 var resp = invocationBuilder.put(Entity.json(new AcInstanceStateUpdate()));
299 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
303 void testDeploy_BadRequest() {
304 var compositionId = createAcDefinitionInDB("Deploy_BadRequest");
306 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "BadRequest");
307 acFromRsc.setCompositionId(compositionId);
309 var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc);
311 var command = new AcInstanceStateUpdate();
312 command.setDeployOrder(null);
313 command.setLockOrder(null);
315 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
316 var resp = invocationBuilder.put(Entity.json(command));
317 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
322 var compositionId = createAcDefinitionInDB("Deploy");
323 var automationComposition =
324 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
325 automationComposition.setCompositionId(compositionId);
326 var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition);
328 var instantiationUpdate = new AcInstanceStateUpdate();
329 instantiationUpdate.setDeployOrder(DeployOrder.DEPLOY);
330 instantiationUpdate.setLockOrder(null);
332 var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
333 var resp = invocationBuilder.put(Entity.json(instantiationUpdate));
334 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
337 private UUID createAcDefinitionInDB(String name) {
338 var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
339 serviceTemplateCreate.setName(name);
340 var acmDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
341 acDefinitionProvider.updateAcDefinition(acmDefinition);
342 saveDummyParticipantInDb();
343 return acmDefinition.getCompositionId();
346 private void saveDummyParticipantInDb() {
347 participantProvider.saveParticipant(CommonTestData.createParticipant(CommonTestData.getParticipantId()));