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.core.Response;
33 import org.junit.Ignore;
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.base.PfModelException;
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.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")
66 class InstantiationControllerTest extends CommonRestController {
68 private static final String AC_INSTANTIATION_CREATE_JSON =
69 "src/test/resources/rest/acm/AutomationComposition.json";
71 private static final String AC_INSTANTIATION_UPDATE_JSON =
72 "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
74 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
76 private static final String INSTANTIATION_ENDPOINT = "instantiation";
77 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
79 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
80 private UUID compositionId;
83 private AutomationCompositionRepository automationCompositionRepository;
86 private AcDefinitionProvider acDefinitionProvider;
89 private AutomationCompositionInstantiationProvider instantiationProvider;
92 private ParticipantProvider participantProvider;
95 private int randomServerPort;
98 public static void setUpBeforeClass() {
99 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
103 public void populateDb() throws Exception {
108 public void setUpPort() {
109 super.setHttpPrefix(randomServerPort);
113 public void cleanDatabase() throws Exception {
120 // TODO: Reimplement using springdoc when Impelmentation endpoint is refactored
121 super.testSwagger(INSTANTIATION_ENDPOINT);
125 void testCreate_Unauthorized() {
126 var automationComposition =
127 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
129 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationComposition));
133 void testQuery_Unauthorized() {
134 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
138 void testUpdate_Unauthorized() throws Exception {
139 var automationComposition =
140 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
142 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationComposition));
146 void testDelete_Unauthorized() {
147 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
151 void testCommand_Unauthorized() {
152 var instantiationCommand = InstantiationUtils
153 .getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
155 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
160 var automationCompositionFromRsc =
161 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
162 automationCompositionFromRsc.setCompositionId(compositionId);
164 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
165 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
166 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
167 var instResponse = resp.readEntity(InstantiationResponse.class);
168 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
169 automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
171 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
172 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
174 assertNotNull(automationCompositionsFromDb);
175 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
176 assertEquals(automationCompositionFromRsc, automationCompositionsFromDb.getAutomationCompositionList().get(0));
181 void testCreateBadRequest() {
182 var automationCompositionFromRsc = InstantiationUtils
183 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
184 automationCompositionFromRsc.setCompositionId(compositionId);
186 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
187 var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
188 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
190 // testing Bad Request: AC already defined
191 resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
192 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
193 var instResponse = resp.readEntity(InstantiationResponse.class);
194 assertNotNull(instResponse.getErrorDetails());
195 assertNull(instResponse.getAffectedAutomationComposition());
199 void testQuery_NoResultWithThisName() {
200 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
201 var rawresp = invocationBuilder.buildGet().invoke();
202 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
203 var resp = rawresp.readEntity(AutomationCompositions.class);
204 assertThat(resp.getAutomationCompositionList()).isEmpty();
209 var automationComposition =
210 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
211 automationComposition.setCompositionId(compositionId);
213 instantiationProvider.createAutomationComposition(automationComposition);
215 var invocationBuilder =
216 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationComposition.getKey().getName());
217 var rawresp = invocationBuilder.buildGet().invoke();
218 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
219 var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
220 assertNotNull(automationCompositionsQuery);
221 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
222 assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
227 var automationCompositionCreate =
228 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
229 automationCompositionCreate.setCompositionId(compositionId);
231 var response = instantiationProvider.createAutomationComposition(automationCompositionCreate);
233 var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
234 var automationComposition =
235 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
236 automationComposition.setCompositionId(compositionId);
237 automationComposition.setInstanceId(response.getInstanceId());
238 var resp = invocationBuilder.put(Entity.json(automationComposition));
239 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
241 var instResponse = resp.readEntity(InstantiationResponse.class);
242 InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
244 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
245 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
247 assertNotNull(automationCompositionsFromDb);
248 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
249 assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
254 var automationCompositionFromRsc =
255 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
256 automationCompositionFromRsc.setCompositionId(compositionId);
258 instantiationProvider.createAutomationComposition(automationCompositionFromRsc);
260 var invocationBuilder =
261 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName()
262 + "&version=" + automationCompositionFromRsc.getKey().getVersion());
263 var resp = invocationBuilder.delete();
264 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
265 var instResponse = resp.readEntity(InstantiationResponse.class);
266 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
268 var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
269 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
270 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
274 void testDeleteBadRequest() {
275 var automationCompositionFromRsc =
276 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest");
277 automationCompositionFromRsc.setCompositionId(compositionId);
279 instantiationProvider.createAutomationComposition(automationCompositionFromRsc);
281 var invocationBuilder =
282 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
283 var resp = invocationBuilder.delete();
284 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
288 void testCommand_NotFound1() {
289 var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
290 var resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
291 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
295 void testCommand_NotFound2() {
297 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
298 command.setOrderedState(null);
300 var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
301 var resp = invocationBuilder.put(Entity.json(command));
302 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
306 void testCommand() throws PfModelException {
307 var automationComposition =
308 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
309 automationComposition.setCompositionId(compositionId);
310 instantiationProvider.createAutomationComposition(automationComposition);
312 var participants = CommonTestData.createParticipants();
313 for (var participant : participants) {
314 participantProvider.saveParticipant(participant);
318 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
320 var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
321 var resp = invocationBuilder.put(Entity.json(command));
322 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
323 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
324 InstantiationUtils.assertInstantiationResponse(instResponse, command);
326 // check passive state on DB
327 var toscaConceptIdentifier = command.getAutomationCompositionIdentifier();
328 var automationCompositionsGet = instantiationProvider
329 .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
330 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
331 assertEquals(command.getOrderedState(),
332 automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
335 private synchronized void deleteEntryInDB() throws Exception {
336 automationCompositionRepository.deleteAll();
337 var list = acDefinitionProvider.getAllAcDefinitions();
338 if (!list.isEmpty()) {
339 acDefinitionProvider.deleteAcDefintion(compositionId);
343 private synchronized void createEntryInDB() throws Exception {
345 var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate);
346 compositionId = acmDefinition.getCompositionId();