2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2022 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.client.Invocation;
33 import javax.ws.rs.core.Response;
34 import org.junit.jupiter.api.AfterEach;
35 import org.junit.jupiter.api.BeforeAll;
36 import org.junit.jupiter.api.BeforeEach;
37 import org.junit.jupiter.api.Test;
38 import org.junit.jupiter.api.extension.ExtendWith;
39 import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
40 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
41 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
42 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
43 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
45 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
47 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
48 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
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.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")
65 class InstantiationControllerTest extends CommonRestController {
67 private static final String AC_INSTANTIATION_CREATE_JSON =
68 "src/test/resources/rest/acm/AutomationCompositions.json";
70 private static final String AC_INSTANTIATION_UPDATE_JSON =
71 "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
73 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
75 private static final String INSTANTIATION_ENDPOINT = "instantiation";
76 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
78 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
79 private UUID compositionId;
82 private AutomationCompositionRepository automationCompositionRepository;
85 private AcDefinitionProvider acDefinitionProvider;
88 private AutomationCompositionInstantiationProvider instantiationProvider;
91 private ParticipantProvider participantProvider;
94 private int randomServerPort;
97 public static void setUpBeforeClass() {
98 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
102 public void populateDb() throws Exception {
107 public void setUpPort() {
108 super.setHttpPrefix(randomServerPort);
112 public void cleanDatabase() throws Exception {
118 super.testSwagger(INSTANTIATION_ENDPOINT);
122 void testCreate_Unauthorized() throws Exception {
123 AutomationCompositions automationCompositions =
124 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
126 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
130 void testQuery_Unauthorized() {
131 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
135 void testUpdate_Unauthorized() throws Exception {
136 AutomationCompositions automationCompositions =
137 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
139 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
143 void testDelete_Unauthorized() {
144 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
148 void testCommand_Unauthorized() throws Exception {
149 InstantiationCommand instantiationCommand = InstantiationUtils
150 .getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
152 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
156 void testCreate() throws Exception {
158 var automationCompositionsFromRsc =
159 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
160 for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
161 automationComposition.setCompositionId(compositionId);
164 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
165 var resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
166 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
167 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
168 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionsFromRsc);
170 for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
171 var automationCompositionsFromDb =
172 instantiationProvider.getAutomationCompositions(automationCompositionFromRsc.getKey().getName(),
173 automationCompositionFromRsc.getKey().getVersion());
175 assertNotNull(automationCompositionsFromDb);
176 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
177 assertEquals(automationCompositionFromRsc,
178 automationCompositionsFromDb.getAutomationCompositionList().get(0));
183 void testCreateBadRequest() throws Exception {
184 var automationCompositionsFromRsc = InstantiationUtils
185 .getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
186 for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
187 automationComposition.setCompositionId(compositionId);
190 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
191 var resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
192 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
194 // testing Bad Request: AC already defined
195 resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
196 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
197 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
198 assertNotNull(instResponse.getErrorDetails());
199 assertNull(instResponse.getAffectedAutomationCompositions());
203 void testQuery_NoResultWithThisName() {
204 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
205 Response rawresp = invocationBuilder.buildGet().invoke();
206 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
207 AutomationCompositions resp = rawresp.readEntity(AutomationCompositions.class);
208 assertThat(resp.getAutomationCompositionList()).isEmpty();
212 void testQuery() throws Exception {
214 var automationCompositions =
215 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
216 for (var acFromRsc : automationCompositions.getAutomationCompositionList()) {
217 acFromRsc.setCompositionId(compositionId);
219 instantiationProvider.createAutomationCompositions(automationCompositions);
221 for (var automationCompositionFromRsc : automationCompositions.getAutomationCompositionList()) {
222 var invocationBuilder = super.sendRequest(
223 INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
224 Response rawresp = invocationBuilder.buildGet().invoke();
225 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
226 AutomationCompositions automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
227 assertNotNull(automationCompositionsQuery);
228 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
229 assertEquals(automationCompositionFromRsc,
230 automationCompositionsQuery.getAutomationCompositionList().get(0));
235 void testUpdate() throws Exception {
237 var automationCompositionsCreate =
238 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
239 for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
240 automationComposition.setCompositionId(compositionId);
243 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
245 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
246 var automationCompositions =
247 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
248 for (var automationComposition : automationCompositions.getAutomationCompositionList()) {
249 automationComposition.setCompositionId(compositionId);
251 var resp = invocationBuilder.put(Entity.json(automationCompositions));
252 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
254 var instResponse = resp.readEntity(InstantiationResponse.class);
255 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositions);
257 for (var automationCompositionUpdate : automationCompositions.getAutomationCompositionList()) {
258 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
259 automationCompositionUpdate.getKey().getName(), automationCompositionUpdate.getKey().getVersion());
261 assertNotNull(automationCompositionsFromDb);
262 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
263 assertEquals(automationCompositionUpdate,
264 automationCompositionsFromDb.getAutomationCompositionList().get(0));
269 void testDelete() throws Exception {
271 var automationCompositionsFromRsc =
272 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
273 for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
274 automationComposition.setCompositionId(compositionId);
277 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
279 for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
280 var invocationBuilder = super.sendRequest(
281 INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName() + "&version="
282 + automationCompositionFromRsc.getKey().getVersion());
283 var resp = invocationBuilder.delete();
284 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
285 var instResponse = resp.readEntity(InstantiationResponse.class);
286 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
288 var automationCompositionsFromDb =
289 instantiationProvider.getAutomationCompositions(automationCompositionFromRsc.getKey().getName(),
290 automationCompositionFromRsc.getKey().getVersion());
291 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
296 void testDeleteBadRequest() throws Exception {
297 var automationCompositionsFromRsc =
298 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest");
299 for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
300 automationComposition.setCompositionId(compositionId);
303 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
305 for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
306 var invocationBuilder = super.sendRequest(
307 INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
308 var resp = invocationBuilder.delete();
309 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
314 void testCommand_NotFound1() {
315 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
316 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
317 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
321 void testCommand_NotFound2() throws Exception {
322 InstantiationCommand command =
323 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
324 command.setOrderedState(null);
326 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
327 Response resp = invocationBuilder.put(Entity.json(command));
328 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
332 void testCommand() throws Exception {
333 var automationCompositions =
334 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
335 for (var automationComposition : automationCompositions.getAutomationCompositionList()) {
336 automationComposition.setCompositionId(compositionId);
338 instantiationProvider.createAutomationCompositions(automationCompositions);
340 var participants = CommonTestData.createParticipants();
341 for (var participant : participants) {
342 participantProvider.saveParticipant(participant);
346 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
348 var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
349 var resp = invocationBuilder.put(Entity.json(command));
350 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
351 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
352 InstantiationUtils.assertInstantiationResponse(instResponse, command);
354 // check passive state on DB
355 for (var toscaConceptIdentifier : command.getAutomationCompositionIdentifierList()) {
356 var automationCompositionsGet = instantiationProvider
357 .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
358 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
359 assertEquals(command.getOrderedState(),
360 automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
364 private synchronized void deleteEntryInDB() throws Exception {
365 automationCompositionRepository.deleteAll();
366 var list = acDefinitionProvider.getAllAcDefinitions();
367 if (!list.isEmpty()) {
368 acDefinitionProvider.deleteAcDefintion(compositionId);
372 private synchronized void createEntryInDB() throws Exception {
374 var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate);
375 compositionId = acmDefinition.getCompositionId();