2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 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.controlloop.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;
29 import javax.ws.rs.client.Entity;
30 import javax.ws.rs.client.Invocation;
31 import javax.ws.rs.core.Response;
32 import org.junit.jupiter.api.AfterEach;
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.controlloop.models.controlloop.concepts.ControlLoop;
38 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
39 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
40 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
41 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider;
42 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.ControlLoopOrderStateResponse;
43 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.ControlLoopPrimedResponse;
44 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstancePropertiesResponse;
45 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
46 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
47 import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
48 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
49 import org.onap.policy.clamp.controlloop.runtime.main.rest.InstantiationController;
50 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
51 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.boot.test.context.SpringBootTest;
56 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
57 import org.springframework.boot.web.server.LocalServerPort;
58 import org.springframework.test.context.TestPropertySource;
59 import org.springframework.test.context.junit.jupiter.SpringExtension;
62 * Class to perform unit test of {@link InstantiationController}}.
65 @ExtendWith(SpringExtension.class)
66 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
67 @TestPropertySource(locations = {"classpath:application_test.properties"})
68 class InstantiationControllerTest extends CommonRestController {
70 private static final String ID_NAME = "PMSH_Instance1";
71 private static final String ID_VERSION = "1.2.3";
73 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
75 private static final String CL_INSTANTIATION_UPDATE_JSON =
76 "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
78 private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
79 "src/test/resources/rest/controlloops/PassiveCommand.json";
81 private static final String TOSCA_TEMPLATE_YAML =
82 "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
84 private static final String INSTANTIATION_ENDPOINT = "instantiation";
85 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
86 private static final String PRIMING_ENDPOINT = "controlLoopPriming";
87 private static final String INSTANTIATION_PROPERTIES = "instanceProperties";
88 private static final String INSTANTIATION_STATE = "instantiationState";
90 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
93 private ServiceTemplateProvider serviceTemplateProvider;
96 private ControlLoopInstantiationProvider instantiationProvider;
99 private ParticipantProvider participantProvider;
102 private int randomServerPort;
105 public static void setUpBeforeClass() throws Exception {
106 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
110 public void populateDb() throws Exception {
115 public void setUpPort() {
116 super.setHttpPrefix(randomServerPort);
120 public void cleanDatabase() throws Exception {
125 void testSwagger() throws Exception {
126 super.testSwagger(INSTANTIATION_ENDPOINT);
130 void testCreate_Unauthorized() throws Exception {
131 ControlLoops controlLoops =
132 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
134 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
138 void testQuery_Unauthorized() throws Exception {
139 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
143 void testUpdate_Unauthorized() throws Exception {
144 ControlLoops controlLoops =
145 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
147 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
151 void testDelete_Unauthorized() throws Exception {
152 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
156 void testCommand_Unauthorized() throws Exception {
157 InstantiationCommand instantiationCommand = InstantiationUtils
158 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
160 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
164 void testCreate() throws Exception {
166 ControlLoops controlLoopsFromRsc =
167 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
169 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
170 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
171 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
172 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
173 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
175 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
176 ControlLoops controlLoopsFromDb = instantiationProvider
177 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
179 assertNotNull(controlLoopsFromDb);
180 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
181 assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
185 super.sendRequest(PRIMING_ENDPOINT + "?name=" + "PMSHInstance0Create" + "&version=" + "1.0.1");
186 Response rawresp = invocationBuilder.buildGet().invoke();
187 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
188 ControlLoopPrimedResponse primResponse = rawresp.readEntity(ControlLoopPrimedResponse.class);
189 assertEquals(false, primResponse.getPrimedControlLoopsList().get(0).isPrimed());
193 void testCreateBadRequest() throws Exception {
195 ControlLoops controlLoopsFromRsc =
196 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
198 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
199 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
200 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
202 // testing Bad Request: CL already defined
203 resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
204 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
205 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
206 assertNotNull(instResponse.getErrorDetails());
207 assertNull(instResponse.getAffectedControlLoops());
211 void testQuery_NoResultWithThisName() throws Exception {
212 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
213 Response rawresp = invocationBuilder.buildGet().invoke();
214 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
215 ControlLoops resp = rawresp.readEntity(ControlLoops.class);
216 assertThat(resp.getControlLoopList()).isEmpty();
220 void testQuery() throws Exception {
222 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
223 instantiationProvider.createControlLoops(controlLoops);
225 for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
226 Invocation.Builder invocationBuilder =
227 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
228 Response rawresp = invocationBuilder.buildGet().invoke();
229 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
230 ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
231 assertNotNull(controlLoopsQuery);
232 assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
233 assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
238 void testUpdate() throws Exception {
240 ControlLoops controlLoopsCreate =
241 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
243 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
244 instantiationProvider.createControlLoops(controlLoopsCreate);
246 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
247 Response resp = invocationBuilder.put(Entity.json(controlLoops));
248 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
250 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
251 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
253 for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
254 ControlLoops controlLoopsFromDb = instantiationProvider
255 .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
257 assertNotNull(controlLoopsFromDb);
258 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
259 assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
264 void testDelete_NoResultWithThisName() throws Exception {
265 Invocation.Builder invocationBuilder =
266 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName&version=1.0.1");
267 Response resp = invocationBuilder.delete();
268 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
269 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
270 assertNotNull(instResponse.getErrorDetails());
271 assertNull(instResponse.getAffectedControlLoops());
275 void testDelete() throws Exception {
277 ControlLoops controlLoopsFromRsc =
278 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
280 instantiationProvider.createControlLoops(controlLoopsFromRsc);
282 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
283 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name="
284 + controlLoopFromRsc.getKey().getName() + "&version=" + controlLoopFromRsc.getKey().getVersion());
285 Response resp = invocationBuilder.delete();
286 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
287 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
288 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
290 ControlLoops controlLoopsFromDb = instantiationProvider
291 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
292 assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
297 void testDeleteBadRequest() throws Exception {
299 ControlLoops controlLoopsFromRsc =
300 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
302 instantiationProvider.createControlLoops(controlLoopsFromRsc);
304 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
305 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name="
306 + controlLoopFromRsc.getKey().getName());
307 Response resp = invocationBuilder.delete();
308 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
313 void testCommand_NotFound1() throws Exception {
314 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
315 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
316 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
320 void testCommand_NotFound2() throws Exception {
321 InstantiationCommand command =
322 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
323 command.setOrderedState(null);
325 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
326 Response resp = invocationBuilder.put(Entity.json(command));
327 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
331 void testCommand() throws Exception {
332 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
333 instantiationProvider.createControlLoops(controlLoops);
335 var participants = CommonTestData.createParticipants();
336 for (var participant : participants) {
337 participantProvider.saveParticipant(participant);
340 InstantiationCommand command =
341 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
343 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
344 Response resp = invocationBuilder.put(Entity.json(command));
345 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
346 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
347 InstantiationUtils.assertInstantiationResponse(instResponse, command);
349 // check passive state on DB
350 for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
351 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
352 toscaConceptIdentifier.getVersion());
353 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
354 assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
359 void testIntanceProperties() throws Exception {
360 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_PROPERTIES);
361 Response resp = invocationBuilder.post(Entity.json(serviceTemplate));
362 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
363 var instancePropertyList = resp.readEntity(InstancePropertiesResponse.class);
364 assertNull(instancePropertyList.getErrorDetails());
365 var id = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
366 assertEquals(id, instancePropertyList.getAffectedInstanceProperties().get(0));
368 invocationBuilder = super.sendRequest(INSTANTIATION_STATE + "?name=" + ID_NAME + "&version=" + ID_VERSION);
369 resp = invocationBuilder.buildGet().invoke();
370 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
371 var instanceOrderState = resp.readEntity(ControlLoopOrderStateResponse.class);
372 assertEquals(ControlLoopOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
373 assertEquals(ID_NAME, instanceOrderState.getControlLoopIdentifierList().get(0).getName());
374 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(ID_NAME, ID_VERSION);
375 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
377 invocationBuilder = super.sendRequest(INSTANTIATION_PROPERTIES + "?name=" + ID_NAME + "&version=" + ID_VERSION);
378 resp = invocationBuilder.delete();
379 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
380 var instanceResponse = resp.readEntity(InstantiationResponse.class);
381 assertEquals(ID_NAME, instanceResponse.getAffectedControlLoops().get(0).getName());
382 controlLoopsGet = instantiationProvider.getControlLoops(ID_NAME, ID_VERSION);
383 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
386 private synchronized void deleteEntryInDB() throws Exception {
387 var list = serviceTemplateProvider.getAllServiceTemplates();
388 if (!list.isEmpty()) {
389 serviceTemplateProvider.deleteServiceTemplate(list.get(0).getName(), list.get(0).getVersion());
393 private synchronized void createEntryInDB() throws Exception {
395 serviceTemplateProvider.createServiceTemplate(serviceTemplate);