5a15687c5cf2d14f876deddb79ce681715797491
[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.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;
61
62 /**
63  * Class to perform unit test of {@link InstantiationController}}.
64  *
65  */
66 @ExtendWith(SpringExtension.class)
67 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
68 @TestPropertySource(locations = {"classpath:application_test.properties"})
69 class InstantiationControllerTest extends CommonRestController {
70
71     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
72
73     private static final String CL_INSTANTIATION_UPDATE_JSON =
74             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
75
76     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
77             "src/test/resources/rest/controlloops/PassiveCommand.json";
78
79     private static final String TOSCA_TEMPLATE_YAML =
80             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
81
82     private static final String INSTANTIATION_ENDPOINT = "instantiation";
83
84     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
85
86     private static final String PRIMING_ENDPOINT = "controlLoopPriming";
87
88     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
89
90     private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
91
92
93     @Autowired
94     private ClRuntimeParameterGroup clRuntimeParameterGroup;
95
96     @Autowired
97     private ControlLoopInstantiationProvider instantiationProvider;
98
99     @Autowired
100     private ParticipantProvider participantProvider;
101
102     @LocalServerPort
103     private int randomServerPort;
104
105     @BeforeAll
106     public static void setUpBeforeClass() throws Exception {
107         serviceTemplate = yamlTranslator.fromYaml(ResourceUtils.getResourceAsString(TOSCA_TEMPLATE_YAML),
108             ToscaServiceTemplate.class);
109     }
110
111     @BeforeEach
112     public void populateDb() throws Exception {
113         createEntryInDB();
114     }
115
116     @BeforeEach
117     public void setUpPort() {
118         super.setHttpPrefix(randomServerPort);
119     }
120
121     @AfterEach
122     public void cleanDatabase() throws Exception {
123         deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
124     }
125
126     @Test
127     void testSwagger() throws Exception {
128         super.testSwagger(INSTANTIATION_ENDPOINT);
129     }
130
131     @Test
132     void testCreate_Unauthorized() throws Exception {
133         ControlLoops controlLoops =
134                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
135
136         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
137     }
138
139     @Test
140     void testQuery_Unauthorized() throws Exception {
141         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
142     }
143
144     @Test
145     void testUpdate_Unauthorized() throws Exception {
146         ControlLoops controlLoops =
147                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
148
149         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
150     }
151
152     @Test
153     void testDelete_Unauthorized() throws Exception {
154         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
155     }
156
157     @Test
158     void testCommand_Unauthorized() throws Exception {
159         InstantiationCommand instantiationCommand = InstantiationUtils
160                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
161
162         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
163     }
164
165     @Test
166     void testCreate() throws Exception {
167
168         ControlLoops controlLoopsFromRsc =
169                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
170
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);
176
177         for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
178             ControlLoops controlLoopsFromDb = instantiationProvider
179                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
180
181             assertNotNull(controlLoopsFromDb);
182             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
183             assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
184         }
185
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());
192     }
193
194     @Test
195     void testCreateBadRequest() throws Exception {
196
197         ControlLoops controlLoopsFromRsc =
198                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
199
200         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
201         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
202         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
203
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());
210     }
211
212     @Test
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();
219     }
220
221     @Test
222     void testQuery() throws Exception {
223
224         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
225         instantiationProvider.createControlLoops(controlLoops);
226
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));
236         }
237     }
238
239     @Test
240     void testUpdate() throws Exception {
241
242         ControlLoops controlLoopsCreate =
243                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
244
245         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
246         instantiationProvider.createControlLoops(controlLoopsCreate);
247
248         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
249         Response resp = invocationBuilder.put(Entity.json(controlLoops));
250         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
251
252         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
253         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
254
255         for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
256             ControlLoops controlLoopsFromDb = instantiationProvider
257                     .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
258
259             assertNotNull(controlLoopsFromDb);
260             assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
261             assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
262         }
263     }
264
265     @Test
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());
273     }
274
275     @Test
276     void testDelete() throws Exception {
277
278         ControlLoops controlLoopsFromRsc =
279                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
280
281         instantiationProvider.createControlLoops(controlLoopsFromRsc);
282
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);
290
291             ControlLoops controlLoopsFromDb = instantiationProvider
292                     .getControlLoops(controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
293             assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
294         }
295     }
296
297     @Test
298     void testDeleteBadRequest() throws Exception {
299
300         ControlLoops controlLoopsFromRsc =
301                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
302
303         instantiationProvider.createControlLoops(controlLoopsFromRsc);
304
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());
311         }
312     }
313
314     @Test
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());
319     }
320
321     @Test
322     void testCommand_NotFound2() throws Exception {
323         InstantiationCommand command =
324                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
325         command.setOrderedState(null);
326
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());
330     }
331
332     @Test
333     void testCommand() throws Exception {
334         var controlLoops = InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
335         instantiationProvider.createControlLoops(controlLoops);
336
337         participantProvider.createParticipants(CommonTestData.createParticipants());
338
339         InstantiationCommand command =
340                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
341
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);
347
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());
354         }
355     }
356
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);
362             }
363         }
364     }
365
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);
371         }
372     }
373 }