71e762455fcd4287c824f2fc263120b323a184ef
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.controlloop.runtime.instantiation.rest;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertNull;
27
28 import javax.ws.rs.client.Entity;
29 import javax.ws.rs.client.Invocation;
30 import javax.ws.rs.core.Response;
31 import org.junit.AfterClass;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
35 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
36 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
37 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
38 import org.onap.policy.clamp.controlloop.runtime.instantiation.ControlLoopInstantiationProvider;
39 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
40 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
42
43 /**
44  * Class to perform unit test of {@link InstantiationController}}.
45  *
46  */
47 public class InstantiationControllerTest extends CommonRestController {
48
49     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
50
51     private static final String CL_INSTANTIATION_UPDATE_JSON =
52             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
53
54     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
55             "src/test/resources/rest/controlloops/PassiveCommand.json";
56
57     private static final String TOSCA_TEMPLATE_YAML =
58             "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
59
60     private static final String INSTANTIATION_ENDPOINT = "instantiation";
61
62     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
63
64     /**
65      * starts Main and inserts a commissioning template.
66      *
67      * @throws Exception if an error occurs
68      */
69     @BeforeClass
70     public static void setUpBeforeClass() throws Exception {
71         CommonRestController.setUpBeforeClass("InstApi");
72
73         // to validate control Loop, it needs to define ToscaServiceTemplate
74         InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, getParameters());
75
76         ControlLoops controlLoops =
77                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
78         try (ControlLoopInstantiationProvider instantiationProvider =
79                 new ControlLoopInstantiationProvider(getParameters())) {
80             instantiationProvider.createControlLoops(controlLoops);
81         }
82     }
83
84     @AfterClass
85     public static void teardownAfterClass() {
86         CommonRestController.teardownAfterClass();
87     }
88
89     @Test
90     public void testSwagger() throws Exception {
91         super.testSwagger(INSTANTIATION_ENDPOINT);
92     }
93
94     @Test
95     public void testCreate_Unauthorized() throws Exception {
96         ControlLoops controlLoops =
97                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
98
99         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
100     }
101
102     @Test
103     public void testQuery_Unauthorized() throws Exception {
104         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
105     }
106
107     @Test
108     public void testUpdate_Unauthorized() throws Exception {
109         ControlLoops controlLoops =
110                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
111
112         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
113     }
114
115     @Test
116     public void testDelete_Unauthorized() throws Exception {
117         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
118     }
119
120     @Test
121     public void testCommand_Unauthorized() throws Exception {
122         InstantiationCommand instantiationCommand = InstantiationUtils
123                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
124
125         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
126     }
127
128     @Test
129     public void testCreate() throws Exception {
130         ControlLoops controlLoopsFromRsc =
131                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
132
133         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
134         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
135         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
136         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
137         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
138
139         try (ControlLoopInstantiationProvider instantiationProvider =
140                 new ControlLoopInstantiationProvider(getParameters())) {
141             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
142                 ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
143                         controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
144
145                 assertNotNull(controlLoopsFromDb);
146                 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
147                 assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
148             }
149         }
150     }
151
152     @Test
153     public void testCreateBadRequest() throws Exception {
154         ControlLoops controlLoopsFromRsc =
155                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
156
157         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
158         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
159         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
160
161         // testing Bad Request: CL already defined
162         resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
163         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
164         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
165         assertNotNull(instResponse.getErrorDetails());
166         assertNull(instResponse.getAffectedControlLoops());
167     }
168
169     @Test
170     public void testQuery_NoResultWithThisName() throws Exception {
171         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
172         Response rawresp = invocationBuilder.buildGet().invoke();
173         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
174         ControlLoops resp = rawresp.readEntity(ControlLoops.class);
175         assertThat(resp.getControlLoopList()).isEmpty();
176     }
177
178     @Test
179     public void testQuery() throws Exception {
180         // inserts a ControlLoops to DB
181         ControlLoops controlLoops =
182                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
183         try (ControlLoopInstantiationProvider instantiationProvider =
184                 new ControlLoopInstantiationProvider(getParameters())) {
185             instantiationProvider.createControlLoops(controlLoops);
186         }
187
188         for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
189             Invocation.Builder invocationBuilder =
190                     super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
191             Response rawresp = invocationBuilder.buildGet().invoke();
192             assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
193             ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
194             assertNotNull(controlLoopsQuery);
195             assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
196             assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
197         }
198     }
199
200     @Test
201     public void testUpdate() throws Exception {
202         ControlLoops controlLoopsCreate =
203                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
204
205         ControlLoops controlLoops =
206                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
207
208         try (ControlLoopInstantiationProvider instantiationProvider =
209                 new ControlLoopInstantiationProvider(getParameters())) {
210             instantiationProvider.createControlLoops(controlLoopsCreate);
211
212             Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
213             Response resp = invocationBuilder.put(Entity.json(controlLoops));
214             assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
215
216             InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
217             InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
218
219             for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
220                 ControlLoops controlLoopsFromDb = instantiationProvider
221                         .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
222
223                 assertNotNull(controlLoopsFromDb);
224                 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
225                 assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
226             }
227         }
228     }
229
230     @Test
231     public void testDelete_NoResultWithThisName() throws Exception {
232         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
233         Response resp = invocationBuilder.delete();
234         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
235         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
236         assertNotNull(instResponse.getErrorDetails());
237         assertNull(instResponse.getAffectedControlLoops());
238     }
239
240     @Test
241     public void testDelete() throws Exception {
242         ControlLoops controlLoopsFromRsc =
243                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
244         try (ControlLoopInstantiationProvider instantiationProvider =
245                 new ControlLoopInstantiationProvider(getParameters())) {
246             instantiationProvider.createControlLoops(controlLoopsFromRsc);
247
248             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
249                 Invocation.Builder invocationBuilder =
250                         super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName()
251                                 + "&version=" + controlLoopFromRsc.getKey().getVersion());
252                 Response resp = invocationBuilder.delete();
253                 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
254                 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
255                 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
256
257                 ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
258                         controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
259                 assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
260             }
261         }
262     }
263
264     @Test
265     public void testDeleteBadRequest() throws Exception {
266         ControlLoops controlLoopsFromRsc =
267                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
268         try (ControlLoopInstantiationProvider instantiationProvider =
269                 new ControlLoopInstantiationProvider(getParameters())) {
270             instantiationProvider.createControlLoops(controlLoopsFromRsc);
271
272             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
273                 Invocation.Builder invocationBuilder =
274                         super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
275                 Response resp = invocationBuilder.delete();
276                 // should be BAD_REQUEST
277                 assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
278             }
279         }
280     }
281
282     @Test
283     public void testCommand_NotFound1() throws Exception {
284         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
285         Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
286         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
287     }
288
289     @Test
290     public void testCommand_NotFound2() throws Exception {
291         InstantiationCommand command =
292                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
293         command.setOrderedState(null);
294
295         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
296         Response resp = invocationBuilder.put(Entity.json(command));
297         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
298     }
299
300     @Test
301     public void testCommand() throws Exception {
302         InstantiationCommand command =
303                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
304
305         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
306         Response resp = invocationBuilder.put(Entity.json(command));
307         assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
308         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
309         InstantiationUtils.assertInstantiationResponse(instResponse, command);
310
311         // check passive state on DB
312         try (ControlLoopInstantiationProvider instantiationProvider =
313                 new ControlLoopInstantiationProvider(getParameters())) {
314             for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
315                 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
316                         toscaConceptIdentifier.getVersion());
317                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
318                 assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
319             }
320         }
321     }
322 }