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.ControlLoops;
39 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
40 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.ControlLoopPrimedResponse;
41 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
42 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
43 import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
44 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
45 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
46 import org.onap.policy.clamp.controlloop.runtime.main.rest.InstantiationController;
47 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
48 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
49 import org.onap.policy.models.provider.PolicyModelsProvider;
50 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
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.TestPropertySource;
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 @TestPropertySource(locations = {"classpath:application_test.properties"})
67 class InstantiationControllerTest extends CommonRestController {
69 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
71 private static final String CL_INSTANTIATION_UPDATE_JSON =
72 "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
74 private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
75 "src/test/resources/rest/controlloops/PassiveCommand.json";
77 private static final String TOSCA_TEMPLATE_YAML =
78 "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
80 private static final String INSTANTIATION_ENDPOINT = "instantiation";
82 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
84 private static final String PRIMING_ENDPOINT = "controlLoopPriming";
86 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
89 private ClRuntimeParameterGroup clRuntimeParameterGroup;
92 private ControlLoopInstantiationProvider instantiationProvider;
95 private ParticipantProvider participantProvider;
98 private int randomServerPort;
101 public static void setUpBeforeClass() throws Exception {
102 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
106 public void populateDb() throws Exception {
111 public void setUpPort() {
112 super.setHttpPrefix(randomServerPort);
116 public void cleanDatabase() throws Exception {
117 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
121 void testSwagger() throws Exception {
122 super.testSwagger(INSTANTIATION_ENDPOINT);
126 void testCreate_Unauthorized() throws Exception {
127 ControlLoops controlLoops =
128 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
130 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
134 void testQuery_Unauthorized() throws Exception {
135 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
139 void testUpdate_Unauthorized() throws Exception {
140 ControlLoops controlLoops =
141 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
143 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
147 void testDelete_Unauthorized() throws Exception {
148 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
152 void testCommand_Unauthorized() throws Exception {
153 InstantiationCommand instantiationCommand = InstantiationUtils
154 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
156 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
160 void testCreate() throws Exception {
162 ControlLoops controlLoopsFromRsc =
163 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
165 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
166 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
167 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
168 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
169 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
171 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
172 ControlLoops controlLoopsFromDb = instantiationProvider
173 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
175 assertNotNull(controlLoopsFromDb);
176 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
177 assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
180 invocationBuilder = super.sendRequest(PRIMING_ENDPOINT + "?name="
181 + "PMSHInstance0Create" + "&version=" + "1.0.1");
182 Response rawresp = invocationBuilder.buildGet().invoke();
183 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
184 ControlLoopPrimedResponse primResponse = rawresp.readEntity(ControlLoopPrimedResponse.class);
185 assertEquals(false, primResponse.getPrimedControlLoopsList().get(0).isPrimed());
189 void testCreateBadRequest() throws Exception {
191 ControlLoops controlLoopsFromRsc =
192 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
194 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
195 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
196 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
198 // testing Bad Request: CL already defined
199 resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
200 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
201 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
202 assertNotNull(instResponse.getErrorDetails());
203 assertNull(instResponse.getAffectedControlLoops());
207 void testQuery_NoResultWithThisName() throws Exception {
208 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
209 Response rawresp = invocationBuilder.buildGet().invoke();
210 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
211 ControlLoops resp = rawresp.readEntity(ControlLoops.class);
212 assertThat(resp.getControlLoopList()).isEmpty();
216 void testQuery() throws Exception {
218 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
219 instantiationProvider.createControlLoops(controlLoops);
221 for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
222 Invocation.Builder invocationBuilder =
223 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
224 Response rawresp = invocationBuilder.buildGet().invoke();
225 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
226 ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
227 assertNotNull(controlLoopsQuery);
228 assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
229 assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
234 void testUpdate() throws Exception {
236 ControlLoops controlLoopsCreate =
237 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
239 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
240 instantiationProvider.createControlLoops(controlLoopsCreate);
242 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
243 Response resp = invocationBuilder.put(Entity.json(controlLoops));
244 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
246 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
247 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
249 for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
250 ControlLoops controlLoopsFromDb = instantiationProvider
251 .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
253 assertNotNull(controlLoopsFromDb);
254 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
255 assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
260 void testDelete_NoResultWithThisName() throws Exception {
261 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
262 Response resp = invocationBuilder.delete();
263 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
264 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
265 assertNotNull(instResponse.getErrorDetails());
266 assertNull(instResponse.getAffectedControlLoops());
270 void testDelete() throws Exception {
272 ControlLoops controlLoopsFromRsc =
273 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
275 instantiationProvider.createControlLoops(controlLoopsFromRsc);
277 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
278 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name="
279 + controlLoopFromRsc.getKey().getName() + "&version=" + controlLoopFromRsc.getKey().getVersion());
280 Response resp = invocationBuilder.delete();
281 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
282 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
283 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
285 ControlLoops controlLoopsFromDb = instantiationProvider
286 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
287 assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
292 void testDeleteBadRequest() throws Exception {
294 ControlLoops controlLoopsFromRsc =
295 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
297 instantiationProvider.createControlLoops(controlLoopsFromRsc);
299 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
300 Invocation.Builder invocationBuilder =
301 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
302 Response resp = invocationBuilder.delete();
303 // should be BAD_REQUEST
304 assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
309 void testCommand_NotFound1() throws Exception {
310 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
311 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
312 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
316 void testCommand_NotFound2() throws Exception {
317 InstantiationCommand command =
318 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
319 command.setOrderedState(null);
321 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
322 Response resp = invocationBuilder.put(Entity.json(command));
323 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
327 void testCommand() throws Exception {
328 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
329 instantiationProvider.createControlLoops(controlLoops);
331 participantProvider.createParticipants(CommonTestData.createParticipants());
333 InstantiationCommand command =
334 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
336 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
337 Response resp = invocationBuilder.put(Entity.json(command));
338 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
339 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
340 InstantiationUtils.assertInstantiationResponse(instResponse, command);
342 // check passive state on DB
343 for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
344 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
345 toscaConceptIdentifier.getVersion());
346 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
347 assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
351 private synchronized void deleteEntryInDB(String name, String version) throws Exception {
352 try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
353 .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
354 if (!modelsProvider.getServiceTemplateList(null, null).isEmpty()) {
355 modelsProvider.deleteServiceTemplate(name, version);
360 private synchronized void createEntryInDB() throws Exception {
361 try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
362 .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
363 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
364 modelsProvider.createServiceTemplate(serviceTemplate);