2e01be2895364da54c8063e1ec4b37e5cf60258a
[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.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;
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     @Autowired
89     private ClRuntimeParameterGroup clRuntimeParameterGroup;
90
91     @Autowired
92     private ControlLoopInstantiationProvider instantiationProvider;
93
94     @Autowired
95     private ParticipantProvider participantProvider;
96
97     @LocalServerPort
98     private int randomServerPort;
99
100     @BeforeAll
101     public static void setUpBeforeClass() throws Exception {
102         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
103     }
104
105     @BeforeEach
106     public void populateDb() throws Exception {
107         createEntryInDB();
108     }
109
110     @BeforeEach
111     public void setUpPort() {
112         super.setHttpPrefix(randomServerPort);
113     }
114
115     @AfterEach
116     public void cleanDatabase() throws Exception {
117         deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
118     }
119
120     @Test
121     void testSwagger() throws Exception {
122         super.testSwagger(INSTANTIATION_ENDPOINT);
123     }
124
125     @Test
126     void testCreate_Unauthorized() throws Exception {
127         ControlLoops controlLoops =
128                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
129
130         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
131     }
132
133     @Test
134     void testQuery_Unauthorized() throws Exception {
135         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
136     }
137
138     @Test
139     void testUpdate_Unauthorized() throws Exception {
140         ControlLoops controlLoops =
141                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
142
143         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
144     }
145
146     @Test
147     void testDelete_Unauthorized() throws Exception {
148         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
149     }
150
151     @Test
152     void testCommand_Unauthorized() throws Exception {
153         InstantiationCommand instantiationCommand = InstantiationUtils
154                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
155
156         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
157     }
158
159     @Test
160     void testCreate() throws Exception {
161
162         ControlLoops controlLoopsFromRsc =
163                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
164
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);
170
171         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
172             ControlLoops controlLoopsFromDb = instantiationProvider
173                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
174
175             assertNotNull(controlLoopsFromDb);
176             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
177             assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
178         }
179
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());
186     }
187
188     @Test
189     void testCreateBadRequest() throws Exception {
190
191         ControlLoops controlLoopsFromRsc =
192                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
193
194         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
195         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
196         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
197
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());
204     }
205
206     @Test
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();
213     }
214
215     @Test
216     void testQuery() throws Exception {
217
218         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
219         instantiationProvider.createControlLoops(controlLoops);
220
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));
230         }
231     }
232
233     @Test
234     void testUpdate() throws Exception {
235
236         ControlLoops controlLoopsCreate =
237                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
238
239         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
240         instantiationProvider.createControlLoops(controlLoopsCreate);
241
242         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
243         Response resp = invocationBuilder.put(Entity.json(controlLoops));
244         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
245
246         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
247         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
248
249         for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
250             ControlLoops controlLoopsFromDb = instantiationProvider
251                     .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
252
253             assertNotNull(controlLoopsFromDb);
254             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
255             assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
256         }
257     }
258
259     @Test
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());
267     }
268
269     @Test
270     void testDelete() throws Exception {
271
272         ControlLoops controlLoopsFromRsc =
273                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
274
275         instantiationProvider.createControlLoops(controlLoopsFromRsc);
276
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);
284
285             ControlLoops controlLoopsFromDb = instantiationProvider
286                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
287             assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
288         }
289     }
290
291     @Test
292     void testDeleteBadRequest() throws Exception {
293
294         ControlLoops controlLoopsFromRsc =
295                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
296
297         instantiationProvider.createControlLoops(controlLoopsFromRsc);
298
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());
305         }
306     }
307
308     @Test
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());
313     }
314
315     @Test
316     void testCommand_NotFound2() throws Exception {
317         InstantiationCommand command =
318                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
319         command.setOrderedState(null);
320
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());
324     }
325
326     @Test
327     void testCommand() throws Exception {
328         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
329         instantiationProvider.createControlLoops(controlLoops);
330
331         participantProvider.createParticipants(CommonTestData.createParticipants());
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 }