ebd25c3c140e423f7993e822c14b0a2a213820c6
[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.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;
60
61 /**
62  * Class to perform unit test of {@link InstantiationController}}.
63  *
64  */
65 @ExtendWith(SpringExtension.class)
66 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
67 @TestPropertySource(locations = {"classpath:application_test.properties"})
68 class InstantiationControllerTest extends CommonRestController {
69
70     private static final String ID_NAME = "PMSH_Instance1";
71     private static final String ID_VERSION = "1.2.3";
72
73     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
74
75     private static final String CL_INSTANTIATION_UPDATE_JSON =
76             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
77
78     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
79             "src/test/resources/rest/controlloops/PassiveCommand.json";
80
81     private static final String TOSCA_TEMPLATE_YAML =
82             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
83
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";
89
90     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
91
92     @Autowired
93     private ServiceTemplateProvider serviceTemplateProvider;
94
95     @Autowired
96     private ControlLoopInstantiationProvider instantiationProvider;
97
98     @Autowired
99     private ParticipantProvider participantProvider;
100
101     @LocalServerPort
102     private int randomServerPort;
103
104     @BeforeAll
105     public static void setUpBeforeClass() throws Exception {
106         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
107     }
108
109     @BeforeEach
110     public void populateDb() throws Exception {
111         createEntryInDB();
112     }
113
114     @BeforeEach
115     public void setUpPort() {
116         super.setHttpPrefix(randomServerPort);
117     }
118
119     @AfterEach
120     public void cleanDatabase() throws Exception {
121         deleteEntryInDB();
122     }
123
124     @Test
125     void testSwagger() throws Exception {
126         super.testSwagger(INSTANTIATION_ENDPOINT);
127     }
128
129     @Test
130     void testCreate_Unauthorized() throws Exception {
131         ControlLoops controlLoops =
132                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
133
134         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
135     }
136
137     @Test
138     void testQuery_Unauthorized() throws Exception {
139         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
140     }
141
142     @Test
143     void testUpdate_Unauthorized() throws Exception {
144         ControlLoops controlLoops =
145                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
146
147         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
148     }
149
150     @Test
151     void testDelete_Unauthorized() throws Exception {
152         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
153     }
154
155     @Test
156     void testCommand_Unauthorized() throws Exception {
157         InstantiationCommand instantiationCommand = InstantiationUtils
158                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
159
160         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
161     }
162
163     @Test
164     void testCreate() throws Exception {
165
166         ControlLoops controlLoopsFromRsc =
167                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
168
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);
174
175         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
176             ControlLoops controlLoopsFromDb = instantiationProvider
177                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
178
179             assertNotNull(controlLoopsFromDb);
180             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
181             assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
182         }
183
184         invocationBuilder =
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());
190     }
191
192     @Test
193     void testCreateBadRequest() throws Exception {
194
195         ControlLoops controlLoopsFromRsc =
196                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
197
198         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
199         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
200         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
201
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());
208     }
209
210     @Test
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();
217     }
218
219     @Test
220     void testQuery() throws Exception {
221
222         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
223         instantiationProvider.createControlLoops(controlLoops);
224
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));
234         }
235     }
236
237     @Test
238     void testUpdate() throws Exception {
239
240         ControlLoops controlLoopsCreate =
241                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
242
243         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
244         instantiationProvider.createControlLoops(controlLoopsCreate);
245
246         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
247         Response resp = invocationBuilder.put(Entity.json(controlLoops));
248         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
249
250         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
251         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
252
253         for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
254             ControlLoops controlLoopsFromDb = instantiationProvider
255                     .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
256
257             assertNotNull(controlLoopsFromDb);
258             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
259             assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
260         }
261     }
262
263     @Test
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());
272     }
273
274     @Test
275     void testDelete() throws Exception {
276
277         ControlLoops controlLoopsFromRsc =
278                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
279
280         instantiationProvider.createControlLoops(controlLoopsFromRsc);
281
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);
289
290             ControlLoops controlLoopsFromDb = instantiationProvider
291                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
292             assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
293         }
294     }
295
296     @Test
297     void testDeleteBadRequest() throws Exception {
298
299         ControlLoops controlLoopsFromRsc =
300                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
301
302         instantiationProvider.createControlLoops(controlLoopsFromRsc);
303
304         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
305             Invocation.Builder invocationBuilder =
306                     super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
307             Response resp = invocationBuilder.delete();
308             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
309         }
310     }
311
312     @Test
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());
317     }
318
319     @Test
320     void testCommand_NotFound2() throws Exception {
321         InstantiationCommand command =
322                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
323         command.setOrderedState(null);
324
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());
328     }
329
330     @Test
331     void testCommand() throws Exception {
332         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
333         instantiationProvider.createControlLoops(controlLoops);
334
335         var participants = CommonTestData.createParticipants();
336         for (var participant : participants) {
337             participantProvider.saveParticipant(participant);
338         }
339
340         InstantiationCommand command =
341                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
342
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);
348
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());
355         }
356     }
357
358     @Test
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));
367
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);
376
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();
384     }
385
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());
390         }
391     }
392
393     private synchronized void createEntryInDB() throws Exception {
394         deleteEntryInDB();
395         serviceTemplateProvider.createServiceTemplate(serviceTemplate);
396     }
397 }