42e4ddee27beadd7a6bef00d508580cf0cfb6ab8
[policy/clamp.git] /
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.clamp.controlloop.runtime.instantiation.rest;
23
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
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.messages.rest.instantiation.ControlLoopPrimedResponse;
40 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
41 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
42 import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
43 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
44 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
45 import org.onap.policy.clamp.controlloop.runtime.main.rest.InstantiationController;
46 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
47 import org.onap.policy.common.utils.coder.YamlJsonTranslator;
48 import org.onap.policy.common.utils.resources.ResourceUtils;
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;
59
60 /**
61  * Class to perform unit test of {@link InstantiationController}}.
62  *
63  */
64 @ExtendWith(SpringExtension.class)
65 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
66 @TestPropertySource(locations = {"classpath:application_test.properties"})
67 class InstantiationControllerTest extends CommonRestController {
68
69     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
70
71     private static final String CL_INSTANTIATION_UPDATE_JSON =
72             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
73
74     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
75             "src/test/resources/rest/controlloops/PassiveCommand.json";
76
77     private static final String TOSCA_TEMPLATE_YAML =
78             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
79
80     private static final String INSTANTIATION_ENDPOINT = "instantiation";
81
82     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
83
84     private static final String PRIMING_ENDPOINT = "controlLoopPriming";
85
86     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
87
88     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
89
90
91     @Autowired
92     private ClRuntimeParameterGroup clRuntimeParameterGroup;
93
94     @Autowired
95     private ControlLoopInstantiationProvider instantiationProvider;
96
97     @LocalServerPort
98     private int randomServerPort;
99
100     @BeforeAll
101     public static void setUpBeforeClass() throws Exception {
102         serviceTemplate = yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(TOSCA_TEMPLATE_YAML),
103             ToscaServiceTemplate.class);
104     }
105
106     @BeforeEach
107     public void populateDb() throws Exception {
108         createEntryInDB();
109     }
110
111     @BeforeEach
112     public void setUpPort() {
113         super.setHttpPrefix(randomServerPort);
114     }
115
116     @AfterEach
117     public void cleanDatabase() throws Exception {
118         deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
119     }
120
121     @Test
122     void testSwagger() throws Exception {
123         super.testSwagger(INSTANTIATION_ENDPOINT);
124     }
125
126     @Test
127     void testCreate_Unauthorized() throws Exception {
128         ControlLoops controlLoops =
129                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
130
131         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
132     }
133
134     @Test
135     void testQuery_Unauthorized() throws Exception {
136         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
137     }
138
139     @Test
140     void testUpdate_Unauthorized() throws Exception {
141         ControlLoops controlLoops =
142                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
143
144         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
145     }
146
147     @Test
148     void testDelete_Unauthorized() throws Exception {
149         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
150     }
151
152     @Test
153     void testCommand_Unauthorized() throws Exception {
154         InstantiationCommand instantiationCommand = InstantiationUtils
155                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
156
157         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
158     }
159
160     @Test
161     void testCreate() throws Exception {
162
163         ControlLoops controlLoopsFromRsc =
164                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
165
166         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
167         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
168         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
169         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
170         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
171
172         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
173             ControlLoops controlLoopsFromDb = instantiationProvider
174                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
175
176             assertNotNull(controlLoopsFromDb);
177             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
178             assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
179         }
180
181         invocationBuilder = super.sendRequest(PRIMING_ENDPOINT + "?name="
182                 + "PMSHInstance0Create" + "&version=" + "1.0.1");
183         Response rawresp = invocationBuilder.buildGet().invoke();
184         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
185         ControlLoopPrimedResponse primResponse = rawresp.readEntity(ControlLoopPrimedResponse.class);
186         assertEquals(false, primResponse.getPrimedControlLoopsList().get(0).isPrimed());
187     }
188
189     @Test
190     void testCreateBadRequest() throws Exception {
191
192         ControlLoops controlLoopsFromRsc =
193                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
194
195         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
196         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
197         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
198
199         // testing Bad Request: CL already defined
200         resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
201         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
202         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
203         assertNotNull(instResponse.getErrorDetails());
204         assertNull(instResponse.getAffectedControlLoops());
205     }
206
207     @Test
208     void testQuery_NoResultWithThisName() throws Exception {
209         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
210         Response rawresp = invocationBuilder.buildGet().invoke();
211         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
212         ControlLoops resp = rawresp.readEntity(ControlLoops.class);
213         assertThat(resp.getControlLoopList()).isEmpty();
214     }
215
216     @Test
217     void testQuery() throws Exception {
218
219         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
220         instantiationProvider.createControlLoops(controlLoops);
221
222         for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
223             Invocation.Builder invocationBuilder =
224                     super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
225             Response rawresp = invocationBuilder.buildGet().invoke();
226             assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
227             ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
228             assertNotNull(controlLoopsQuery);
229             assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
230             assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
231         }
232     }
233
234     @Test
235     void testUpdate() throws Exception {
236
237         ControlLoops controlLoopsCreate =
238                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
239
240         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
241         instantiationProvider.createControlLoops(controlLoopsCreate);
242
243         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
244         Response resp = invocationBuilder.put(Entity.json(controlLoops));
245         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
246
247         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
248         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
249
250         for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
251             ControlLoops controlLoopsFromDb = instantiationProvider
252                     .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
253
254             assertNotNull(controlLoopsFromDb);
255             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
256             assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
257         }
258     }
259
260     @Test
261     void testDelete_NoResultWithThisName() throws Exception {
262         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
263         Response resp = invocationBuilder.delete();
264         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
265         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
266         assertNotNull(instResponse.getErrorDetails());
267         assertNull(instResponse.getAffectedControlLoops());
268     }
269
270     @Test
271     void testDelete() throws Exception {
272
273         ControlLoops controlLoopsFromRsc =
274                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
275
276         instantiationProvider.createControlLoops(controlLoopsFromRsc);
277
278         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
279             Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name="
280                     + controlLoopFromRsc.getKey().getName() + "&version=" + controlLoopFromRsc.getKey().getVersion());
281             Response resp = invocationBuilder.delete();
282             assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
283             InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
284             InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
285
286             ControlLoops controlLoopsFromDb = instantiationProvider
287                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
288             assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
289         }
290     }
291
292     @Test
293     void testDeleteBadRequest() throws Exception {
294
295         ControlLoops controlLoopsFromRsc =
296                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
297
298         instantiationProvider.createControlLoops(controlLoopsFromRsc);
299
300         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
301             Invocation.Builder invocationBuilder =
302                     super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
303             Response resp = invocationBuilder.delete();
304             // should be BAD_REQUEST
305             assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
306         }
307     }
308
309     @Test
310     void testCommand_NotFound1() throws Exception {
311         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
312         Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
313         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
314     }
315
316     @Test
317     void testCommand_NotFound2() throws Exception {
318         InstantiationCommand command =
319                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
320         command.setOrderedState(null);
321
322         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
323         Response resp = invocationBuilder.put(Entity.json(command));
324         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
325     }
326
327     @Test
328     void testCommand() throws Exception {
329
330         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
331         instantiationProvider.createControlLoops(controlLoops);
332
333         InstantiationCommand command =
334                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
335
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);
341
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());
348         }
349     }
350
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);
356             }
357         }
358     }
359
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);
365         }
366     }
367 }