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 javax.ws.rs.client.Entity;
31 import javax.ws.rs.client.Invocation;
32 import javax.ws.rs.core.Response;
33 import org.junit.jupiter.api.AfterEach;
34 import org.junit.jupiter.api.BeforeAll;
35 import org.junit.jupiter.api.BeforeEach;
36 import org.junit.jupiter.api.Test;
37 import org.junit.jupiter.api.extension.ExtendWith;
38 import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
39 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
40 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
41 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
42 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
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.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.ParticipantProvider;
48 import org.onap.policy.clamp.models.acm.persistence.provider.ServiceTemplateProvider;
49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
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 ID_NAME = "PMSH_Test_Instance";
69 private static final String ID_VERSION = "1.2.3";
71 private static final String AC_INSTANTIATION_CREATE_JSON =
72 "src/test/resources/rest/acm/AutomationCompositions.json";
74 private static final String AC_INSTANTIATION_UPDATE_JSON =
75 "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
77 private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
79 private static final String INSTANTIATION_ENDPOINT = "instantiation";
80 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
82 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
85 private AutomationCompositionRepository automationCompositionRepository;
88 private ServiceTemplateProvider serviceTemplateProvider;
91 private AutomationCompositionInstantiationProvider instantiationProvider;
94 private ParticipantProvider participantProvider;
97 private int randomServerPort;
100 public static void setUpBeforeClass() {
101 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
105 public void populateDb() throws Exception {
110 public void setUpPort() {
111 super.setHttpPrefix(randomServerPort);
115 public void cleanDatabase() throws Exception {
121 super.testSwagger(INSTANTIATION_ENDPOINT);
125 void testCreate_Unauthorized() throws Exception {
126 AutomationCompositions automationCompositions =
127 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
129 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
133 void testQuery_Unauthorized() {
134 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
138 void testUpdate_Unauthorized() throws Exception {
139 AutomationCompositions automationCompositions =
140 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
142 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
146 void testDelete_Unauthorized() {
147 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
151 void testCommand_Unauthorized() throws Exception {
152 InstantiationCommand instantiationCommand =
153 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
155 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
159 void testCreate() throws Exception {
161 AutomationCompositions automationCompositionsFromRsc =
162 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
164 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
165 Response 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 (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
171 .getAutomationCompositionList()) {
172 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
173 automationCompositionFromRsc.getKey().getName(), 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 {
185 AutomationCompositions automationCompositionsFromRsc =
186 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
188 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
189 Response resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
190 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
192 // testing Bad Request: AC already defined
193 resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
194 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
195 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
196 assertNotNull(instResponse.getErrorDetails());
197 assertNull(instResponse.getAffectedAutomationCompositions());
201 void testQuery_NoResultWithThisName() {
202 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
203 Response rawresp = invocationBuilder.buildGet().invoke();
204 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
205 AutomationCompositions resp = rawresp.readEntity(AutomationCompositions.class);
206 assertThat(resp.getAutomationCompositionList()).isEmpty();
210 void testQuery() throws Exception {
212 var automationCompositions =
213 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
214 instantiationProvider.createAutomationCompositions(automationCompositions);
216 for (AutomationComposition automationCompositionFromRsc : automationCompositions
217 .getAutomationCompositionList()) {
218 Invocation.Builder invocationBuilder =
219 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
220 Response rawresp = invocationBuilder.buildGet().invoke();
221 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
222 AutomationCompositions automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
223 assertNotNull(automationCompositionsQuery);
224 assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
225 assertEquals(automationCompositionFromRsc,
226 automationCompositionsQuery.getAutomationCompositionList().get(0));
231 void testUpdate() throws Exception {
233 AutomationCompositions automationCompositionsCreate =
234 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
236 var automationCompositions =
237 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
238 instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
240 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
241 Response resp = invocationBuilder.put(Entity.json(automationCompositions));
242 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
244 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
245 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositions);
247 for (AutomationComposition automationCompositionUpdate : automationCompositions
248 .getAutomationCompositionList()) {
249 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
250 automationCompositionUpdate.getKey().getName(), automationCompositionUpdate.getKey().getVersion());
252 assertNotNull(automationCompositionsFromDb);
253 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
254 assertEquals(automationCompositionUpdate,
255 automationCompositionsFromDb.getAutomationCompositionList().get(0));
260 void testDelete() throws Exception {
262 AutomationCompositions automationCompositionsFromRsc =
263 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
265 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
267 for (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
268 .getAutomationCompositionList()) {
269 Invocation.Builder invocationBuilder =
270 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName()
271 + "&version=" + automationCompositionFromRsc.getKey().getVersion());
272 Response resp = invocationBuilder.delete();
273 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
274 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
275 InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
277 AutomationCompositions automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
278 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
279 assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
284 void testDeleteBadRequest() throws Exception {
286 AutomationCompositions automationCompositionsFromRsc =
287 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest");
289 instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
291 for (AutomationComposition automationCompositionFromRsc : automationCompositionsFromRsc
292 .getAutomationCompositionList()) {
293 Invocation.Builder invocationBuilder =
294 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
295 Response resp = invocationBuilder.delete();
296 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
301 void testCommand_NotFound1() {
302 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
303 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
304 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
308 void testCommand_NotFound2() throws Exception {
309 InstantiationCommand command =
310 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
311 command.setOrderedState(null);
313 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
314 Response resp = invocationBuilder.put(Entity.json(command));
315 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
319 void testCommand() throws Exception {
320 var automationCompositions =
321 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
322 instantiationProvider.createAutomationCompositions(automationCompositions);
324 var participants = CommonTestData.createParticipants();
325 for (var participant : participants) {
326 participantProvider.saveParticipant(participant);
329 InstantiationCommand command =
330 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
332 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
333 Response resp = invocationBuilder.put(Entity.json(command));
334 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
335 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
336 InstantiationUtils.assertInstantiationResponse(instResponse, command);
338 // check passive state on DB
339 for (ToscaConceptIdentifier toscaConceptIdentifier : command.getAutomationCompositionIdentifierList()) {
340 AutomationCompositions automationCompositionsGet = instantiationProvider
341 .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
342 assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
343 assertEquals(command.getOrderedState(),
344 automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
348 private synchronized void deleteEntryInDB() throws Exception {
349 automationCompositionRepository.deleteAll();
350 var list = serviceTemplateProvider.getAllServiceTemplates();
351 if (!list.isEmpty()) {
352 serviceTemplateProvider.deleteServiceTemplate(list.get(0).getName(), list.get(0).getVersion());
356 private synchronized void createEntryInDB() throws Exception {
358 serviceTemplateProvider.createServiceTemplate(serviceTemplate);