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.common.utils.coder.YamlJsonTranslator;
50 import org.onap.policy.common.utils.resources.ResourceUtils;
51 import org.onap.policy.models.provider.PolicyModelsProvider;
52 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
53 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
55 import org.springframework.beans.factory.annotation.Autowired;
56 import org.springframework.boot.test.context.SpringBootTest;
57 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
58 import org.springframework.boot.web.server.LocalServerPort;
59 import org.springframework.test.context.TestPropertySource;
60 import org.springframework.test.context.junit.jupiter.SpringExtension;
63 * Class to perform unit test of {@link InstantiationController}}.
66 @ExtendWith(SpringExtension.class)
67 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
68 @TestPropertySource(locations = {"classpath:application_test.properties"})
69 class InstantiationControllerTest extends CommonRestController {
71 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
73 private static final String CL_INSTANTIATION_UPDATE_JSON =
74 "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
76 private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
77 "src/test/resources/rest/controlloops/PassiveCommand.json";
79 private static final String TOSCA_TEMPLATE_YAML =
80 "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
82 private static final String INSTANTIATION_ENDPOINT = "instantiation";
84 private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
86 private static final String PRIMING_ENDPOINT = "controlLoopPriming";
88 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
90 private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
94 private ClRuntimeParameterGroup clRuntimeParameterGroup;
97 private ControlLoopInstantiationProvider instantiationProvider;
100 private ParticipantProvider participantProvider;
103 private int randomServerPort;
106 public static void setUpBeforeClass() throws Exception {
107 serviceTemplate = yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(TOSCA_TEMPLATE_YAML),
108 ToscaServiceTemplate.class);
112 public void populateDb() throws Exception {
117 public void setUpPort() {
118 super.setHttpPrefix(randomServerPort);
122 public void cleanDatabase() throws Exception {
123 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
127 void testSwagger() throws Exception {
128 super.testSwagger(INSTANTIATION_ENDPOINT);
132 void testCreate_Unauthorized() throws Exception {
133 ControlLoops controlLoops =
134 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
136 assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
140 void testQuery_Unauthorized() throws Exception {
141 assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
145 void testUpdate_Unauthorized() throws Exception {
146 ControlLoops controlLoops =
147 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
149 assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
153 void testDelete_Unauthorized() throws Exception {
154 assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
158 void testCommand_Unauthorized() throws Exception {
159 InstantiationCommand instantiationCommand = InstantiationUtils
160 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
162 assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
166 void testCreate() throws Exception {
168 ControlLoops controlLoopsFromRsc =
169 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
171 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
172 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
173 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
174 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
175 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
177 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
178 ControlLoops controlLoopsFromDb = instantiationProvider
179 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
181 assertNotNull(controlLoopsFromDb);
182 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
183 assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
186 invocationBuilder = super.sendRequest(PRIMING_ENDPOINT + "?name="
187 + "PMSHInstance0Create" + "&version=" + "1.0.1");
188 Response rawresp = invocationBuilder.buildGet().invoke();
189 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
190 ControlLoopPrimedResponse primResponse = rawresp.readEntity(ControlLoopPrimedResponse.class);
191 assertEquals(false, primResponse.getPrimedControlLoopsList().get(0).isPrimed());
195 void testCreateBadRequest() throws Exception {
197 ControlLoops controlLoopsFromRsc =
198 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
200 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
201 Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
202 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
204 // testing Bad Request: CL already defined
205 resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
206 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
207 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
208 assertNotNull(instResponse.getErrorDetails());
209 assertNull(instResponse.getAffectedControlLoops());
213 void testQuery_NoResultWithThisName() throws Exception {
214 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
215 Response rawresp = invocationBuilder.buildGet().invoke();
216 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
217 ControlLoops resp = rawresp.readEntity(ControlLoops.class);
218 assertThat(resp.getControlLoopList()).isEmpty();
222 void testQuery() throws Exception {
224 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
225 instantiationProvider.createControlLoops(controlLoops);
227 for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
228 Invocation.Builder invocationBuilder =
229 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
230 Response rawresp = invocationBuilder.buildGet().invoke();
231 assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
232 ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
233 assertNotNull(controlLoopsQuery);
234 assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
235 assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
240 void testUpdate() throws Exception {
242 ControlLoops controlLoopsCreate =
243 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
245 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
246 instantiationProvider.createControlLoops(controlLoopsCreate);
248 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
249 Response resp = invocationBuilder.put(Entity.json(controlLoops));
250 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
252 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
253 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
255 for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
256 ControlLoops controlLoopsFromDb = instantiationProvider
257 .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
259 assertNotNull(controlLoopsFromDb);
260 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
261 assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
266 void testDelete_NoResultWithThisName() throws Exception {
267 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
268 Response resp = invocationBuilder.delete();
269 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
270 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
271 assertNotNull(instResponse.getErrorDetails());
272 assertNull(instResponse.getAffectedControlLoops());
276 void testDelete() throws Exception {
278 ControlLoops controlLoopsFromRsc =
279 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
281 instantiationProvider.createControlLoops(controlLoopsFromRsc);
283 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
284 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name="
285 + controlLoopFromRsc.getKey().getName() + "&version=" + controlLoopFromRsc.getKey().getVersion());
286 Response resp = invocationBuilder.delete();
287 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
288 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
289 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
291 ControlLoops controlLoopsFromDb = instantiationProvider
292 .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
293 assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
298 void testDeleteBadRequest() throws Exception {
300 ControlLoops controlLoopsFromRsc =
301 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
303 instantiationProvider.createControlLoops(controlLoopsFromRsc);
305 for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
306 Invocation.Builder invocationBuilder =
307 super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
308 Response resp = invocationBuilder.delete();
309 // should be BAD_REQUEST
310 assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
315 void testCommand_NotFound1() throws Exception {
316 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
317 Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
318 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
322 void testCommand_NotFound2() throws Exception {
323 InstantiationCommand command =
324 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
325 command.setOrderedState(null);
327 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
328 Response resp = invocationBuilder.put(Entity.json(command));
329 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
333 void testCommand() throws Exception {
334 var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
335 instantiationProvider.createControlLoops(controlLoops);
337 participantProvider.createParticipants(CommonTestData.createParticipants());
339 InstantiationCommand command =
340 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
342 Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
343 Response resp = invocationBuilder.put(Entity.json(command));
344 assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
345 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
346 InstantiationUtils.assertInstantiationResponse(instResponse, command);
348 // check passive state on DB
349 for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
350 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
351 toscaConceptIdentifier.getVersion());
352 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
353 assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
357 private synchronized void deleteEntryInDB(String name, String version) throws Exception {
358 try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
359 .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
360 if (!modelsProvider.getServiceTemplateList(null, null).isEmpty()) {
361 modelsProvider.deleteServiceTemplate(name, version);
366 private synchronized void createEntryInDB() throws Exception {
367 try (PolicyModelsProvider modelsProvider = new PolicyModelsProviderFactory()
368 .createPolicyModelsProvider(clRuntimeParameterGroup.getDatabaseProviderParameters())) {
369 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
370 modelsProvider.createServiceTemplate(serviceTemplate);