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.AutomationComposition;
45 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
47 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
48 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
49 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
50 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
53 import org.springframework.beans.factory.annotation.Autowired;
54 import org.springframework.boot.test.context.SpringBootTest;
55 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
56 import org.springframework.boot.web.server.LocalServerPort;
57 import org.springframework.test.context.ActiveProfiles;
58 import org.springframework.test.context.junit.jupiter.SpringExtension;
61 * Class to perform unit test of {@link InstantiationController}}.
64 @ExtendWith(SpringExtension.class)
65 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
66 @ActiveProfiles("test")
67 class InstantiationControllerTest extends CommonRestController {
69 private static final String AC_INSTANTIATION_CREATE_JSON =
70 "src/test/resources/rest/acm/AutomationCompositions.json";
72 private static final String AC_INSTANTIATION_UPDATE_JSON =
73 "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
75 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
77 private static final String INSTANTIATION_ENDPOINT = "instantiation";
78 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
80 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
81 private UUID compositionId;
84 private AutomationCompositionRepository automationCompositionRepository;
87 private AcDefinitionProvider acDefinitionProvider;
90 private AutomationCompositionInstantiationProvider instantiationProvider;
93 private ParticipantProvider participantProvider;
96 private int randomServerPort;
99 public static void setUpBeforeClass() {
100 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
104 public void populateDb() throws Exception {
109 public void setUpPort() {
110 super.setHttpPrefix(randomServerPort);
114 public void cleanDatabase() throws Exception {
120 super.testSwagger(INSTANTIATION_ENDPOINT);
124 void testCreate_Unauthorized() throws Exception {
125 AutomationCompositions automationCompositions =
126 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
128 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
132 void testQuery_Unauthorized() {
133 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
137 void testUpdate_Unauthorized() throws Exception {
138 AutomationCompositions automationCompositions =
139 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
141 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
145 void testDelete_Unauthorized() {
146 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
150 void testCommand_Unauthorized() throws Exception {
151 InstantiationCommand instantiationCommand =
152 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
154 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
158 void testCreate() throws Exception {
160 AutomationCompositions automationCompositionsFromRsc =
161 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
163 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
164 Response resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
165 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
166 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
167 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionsFromRsc);
169 for (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
170 .getAutomationCompositionList()) {
171 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
172 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
174 assertNotNull(automationCompositionsFromDb);
175 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
176 assertEquals(automationCompositionFromRsc,
177 automationCompositionsFromDb.getAutomationCompositionList().get(0));
182 void testCreateBadRequest() throws Exception {
184 AutomationCompositions automationCompositionsFromRsc =
185 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
187 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
188 Response resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
189 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
191 // testing Bad Request: AC already defined
192 resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
193 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
194 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
195 assertNotNull(instResponse.getErrorDetails());
196 assertNull(instResponse.getAffectedAutomationCompositions());
200 void testQuery_NoResultWithThisName() {
201 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
202 Response rawresp = invocationBuilder.buildGet().invoke();
203 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
204 AutomationCompositions resp = rawresp.readEntity(AutomationCompositions.class);
205 assertThat(resp.getAutomationCompositionList()).isEmpty();
209 void testQuery() throws Exception {
211 var automationCompositions =
212 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
213 instantiationProvider.createAutomationCompositions(automationCompositions);
215 for (AutomationComposition automationCompositionFromRsc : automationCompositions
216 .getAutomationCompositionList()) {
217 Invocation.Builder invocationBuilder =
218 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
219 Response rawresp = invocationBuilder.buildGet().invoke();
220 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
221 AutomationCompositions automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
222 assertNotNull(automationCompositionsQuery);
223 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
224 assertEquals(automationCompositionFromRsc,
225 automationCompositionsQuery.getAutomationCompositionList().get(0));
230 void testUpdate() throws Exception {
232 AutomationCompositions automationCompositionsCreate =
233 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
235 var automationCompositions =
236 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
237 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
239 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
240 Response resp = invocationBuilder.put(Entity.json(automationCompositions));
241 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
243 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
244 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositions);
246 for (AutomationComposition automationCompositionUpdate : automationCompositions
247 .getAutomationCompositionList()) {
248 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
249 automationCompositionUpdate.getKey().getName(), automationCompositionUpdate.getKey().getVersion());
251 assertNotNull(automationCompositionsFromDb);
252 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
253 assertEquals(automationCompositionUpdate,
254 automationCompositionsFromDb.getAutomationCompositionList().get(0));
259 void testDelete() throws Exception {
261 AutomationCompositions automationCompositionsFromRsc =
262 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
264 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
266 for (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
267 .getAutomationCompositionList()) {
268 Invocation.Builder invocationBuilder =
269 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName()
270 + "&version=" + automationCompositionFromRsc.getKey().getVersion());
271 Response resp = invocationBuilder.delete();
272 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
273 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
274 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
276 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
277 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
278 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
283 void testDeleteBadRequest() throws Exception {
285 AutomationCompositions automationCompositionsFromRsc =
286 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest");
288 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
290 for (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
291 .getAutomationCompositionList()) {
292 Invocation.Builder invocationBuilder =
293 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
294 Response resp = invocationBuilder.delete();
295 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
300 void testCommand_NotFound1() {
301 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
302 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
303 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
307 void testCommand_NotFound2() throws Exception {
308 InstantiationCommand command =
309 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
310 command.setOrderedState(null);
312 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
313 Response resp = invocationBuilder.put(Entity.json(command));
314 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
318 void testCommand() throws Exception {
319 var automationCompositions =
320 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
321 instantiationProvider.createAutomationCompositions(automationCompositions);
323 var participants = CommonTestData.createParticipants();
324 for (var participant : participants) {
325 participantProvider.saveParticipant(participant);
328 InstantiationCommand command =
329 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
331 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
332 Response resp = invocationBuilder.put(Entity.json(command));
333 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
334 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
335 InstantiationUtils.assertInstantiationResponse(instResponse, command);
337 // check passive state on DB
338 for (ToscaConceptIdentifier toscaConceptIdentifier : command.getAutomationCompositionIdentifierList()) {
339 AutomationCompositions automationCompositionsGet = instantiationProvider
340 .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
341 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
342 assertEquals(command.getOrderedState(),
343 automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
347 private synchronized void deleteEntryInDB() throws Exception {
348 automationCompositionRepository.deleteAll();
349 var list = acDefinitionProvider.getAllServiceTemplates();
350 if (!list.isEmpty()) {
351 acDefinitionProvider.deleteAcDefintion(compositionId);
355 private synchronized void createEntryInDB() throws Exception {
357 var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate);
358 compositionId = acmDefinition.getCompositionId();