732b76a8174c492f45586f0c9c5fdc9c9feabf08
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2022 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.acm.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 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
29
30 import java.util.UUID;
31 import javax.ws.rs.client.Entity;
32 import javax.ws.rs.client.Invocation;
33 import javax.ws.rs.core.Response;
34 import org.junit.jupiter.api.AfterEach;
35 import org.junit.jupiter.api.BeforeAll;
36 import org.junit.jupiter.api.BeforeEach;
37 import org.junit.jupiter.api.Test;
38 import org.junit.jupiter.api.extension.ExtendWith;
39 import org.onap.policy.clamp.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
40 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
41 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
42 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
43 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
45 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationCommand;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
47 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
48 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
49 import org.onap.policy.clamp.models.acm.persistence.repository.AutomationCompositionRepository;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.boot.test.context.SpringBootTest;
53 import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
54 import org.springframework.boot.web.server.LocalServerPort;
55 import org.springframework.test.context.ActiveProfiles;
56 import org.springframework.test.context.junit.jupiter.SpringExtension;
57
58 /**
59  * Class to perform unit test of {@link InstantiationController}}.
60  *
61  */
62 @ExtendWith(SpringExtension.class)
63 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
64 @ActiveProfiles("test")
65 class InstantiationControllerTest extends CommonRestController {
66
67     private static final String AC_INSTANTIATION_CREATE_JSON =
68             "src/test/resources/rest/acm/AutomationCompositions.json";
69
70     private static final String AC_INSTANTIATION_UPDATE_JSON =
71             "src/test/resources/rest/acm/AutomationCompositionsUpdate.json";
72
73     private static final String AC_INSTANTIATION_CHANGE_STATE_JSON = "src/test/resources/rest/acm/PassiveCommand.json";
74
75     private static final String INSTANTIATION_ENDPOINT = "instantiation";
76     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
77
78     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
79     private UUID compositionId;
80
81     @Autowired
82     private AutomationCompositionRepository automationCompositionRepository;
83
84     @Autowired
85     private AcDefinitionProvider acDefinitionProvider;
86
87     @Autowired
88     private AutomationCompositionInstantiationProvider instantiationProvider;
89
90     @Autowired
91     private ParticipantProvider participantProvider;
92
93     @LocalServerPort
94     private int randomServerPort;
95
96     @BeforeAll
97     public static void setUpBeforeClass() {
98         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
99     }
100
101     @BeforeEach
102     public void populateDb() throws Exception {
103         createEntryInDB();
104     }
105
106     @BeforeEach
107     public void setUpPort() {
108         super.setHttpPrefix(randomServerPort);
109     }
110
111     @AfterEach
112     public void cleanDatabase() throws Exception {
113         deleteEntryInDB();
114     }
115
116     @Test
117     void testSwagger() {
118         super.testSwagger(INSTANTIATION_ENDPOINT);
119     }
120
121     @Test
122     void testCreate_Unauthorized() throws Exception {
123         AutomationCompositions automationCompositions =
124                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
125
126         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
127     }
128
129     @Test
130     void testQuery_Unauthorized() {
131         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
132     }
133
134     @Test
135     void testUpdate_Unauthorized() throws Exception {
136         AutomationCompositions automationCompositions =
137                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
138
139         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(automationCompositions));
140     }
141
142     @Test
143     void testDelete_Unauthorized() {
144         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
145     }
146
147     @Test
148     void testCommand_Unauthorized() throws Exception {
149         InstantiationCommand instantiationCommand = InstantiationUtils
150                 .getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
151
152         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
153     }
154
155     @Test
156     void testCreate() throws Exception {
157
158         var automationCompositionsFromRsc =
159                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
160         for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
161             automationComposition.setCompositionId(compositionId);
162         }
163
164         var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
165         var resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
166         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
167         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
168         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionsFromRsc);
169
170         for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
171             var automationCompositionsFromDb =
172                     instantiationProvider.getAutomationCompositions(automationCompositionFromRsc.getKey().getName(),
173                             automationCompositionFromRsc.getKey().getVersion());
174
175             assertNotNull(automationCompositionsFromDb);
176             assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
177             assertEquals(automationCompositionFromRsc,
178                     automationCompositionsFromDb.getAutomationCompositionList().get(0));
179         }
180     }
181
182     @Test
183     void testCreateBadRequest() throws Exception {
184         var automationCompositionsFromRsc = InstantiationUtils
185                 .getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
186         for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
187             automationComposition.setCompositionId(compositionId);
188         }
189
190         var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
191         var resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
192         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
193
194         // testing Bad Request: AC already defined
195         resp = invocationBuilder.post(Entity.json(automationCompositionsFromRsc));
196         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
197         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
198         assertNotNull(instResponse.getErrorDetails());
199         assertNull(instResponse.getAffectedAutomationCompositions());
200     }
201
202     @Test
203     void testQuery_NoResultWithThisName() {
204         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
205         Response rawresp = invocationBuilder.buildGet().invoke();
206         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
207         AutomationCompositions resp = rawresp.readEntity(AutomationCompositions.class);
208         assertThat(resp.getAutomationCompositionList()).isEmpty();
209     }
210
211     @Test
212     void testQuery() throws Exception {
213
214         var automationCompositions =
215                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
216         for (var acFromRsc : automationCompositions.getAutomationCompositionList()) {
217             acFromRsc.setCompositionId(compositionId);
218         }
219         instantiationProvider.createAutomationCompositions(automationCompositions);
220
221         for (var automationCompositionFromRsc : automationCompositions.getAutomationCompositionList()) {
222             var invocationBuilder = super.sendRequest(
223                     INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
224             Response rawresp = invocationBuilder.buildGet().invoke();
225             assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
226             AutomationCompositions automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
227             assertNotNull(automationCompositionsQuery);
228             assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
229             assertEquals(automationCompositionFromRsc,
230                     automationCompositionsQuery.getAutomationCompositionList().get(0));
231         }
232     }
233
234     @Test
235     void testUpdate() throws Exception {
236
237         var automationCompositionsCreate =
238                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
239         for (var automationComposition : automationCompositionsCreate.getAutomationCompositionList()) {
240             automationComposition.setCompositionId(compositionId);
241         }
242
243         instantiationProvider.createAutomationCompositions(automationCompositionsCreate);
244
245         var invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
246         var automationCompositions =
247                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
248         for (var automationComposition : automationCompositions.getAutomationCompositionList()) {
249             automationComposition.setCompositionId(compositionId);
250         }
251         var resp = invocationBuilder.put(Entity.json(automationCompositions));
252         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
253
254         var instResponse = resp.readEntity(InstantiationResponse.class);
255         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositions);
256
257         for (var automationCompositionUpdate : automationCompositions.getAutomationCompositionList()) {
258             var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(
259                     automationCompositionUpdate.getKey().getName(), automationCompositionUpdate.getKey().getVersion());
260
261             assertNotNull(automationCompositionsFromDb);
262             assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
263             assertEquals(automationCompositionUpdate,
264                     automationCompositionsFromDb.getAutomationCompositionList().get(0));
265         }
266     }
267
268     @Test
269     void testDelete() throws Exception {
270
271         var automationCompositionsFromRsc =
272                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
273         for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
274             automationComposition.setCompositionId(compositionId);
275         }
276
277         instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
278
279         for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
280             var invocationBuilder = super.sendRequest(
281                     INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName() + "&version="
282                             + automationCompositionFromRsc.getKey().getVersion());
283             var resp = invocationBuilder.delete();
284             assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
285             var instResponse = resp.readEntity(InstantiationResponse.class);
286             InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
287
288             var automationCompositionsFromDb =
289                     instantiationProvider.getAutomationCompositions(automationCompositionFromRsc.getKey().getName(),
290                             automationCompositionFromRsc.getKey().getVersion());
291             assertThat(automationCompositionsFromDb.getAutomationCompositionList()).isEmpty();
292         }
293     }
294
295     @Test
296     void testDeleteBadRequest() throws Exception {
297         var automationCompositionsFromRsc =
298                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "DelBadRequest");
299         for (var automationComposition : automationCompositionsFromRsc.getAutomationCompositionList()) {
300             automationComposition.setCompositionId(compositionId);
301         }
302
303         instantiationProvider.createAutomationCompositions(automationCompositionsFromRsc);
304
305         for (var automationCompositionFromRsc : automationCompositionsFromRsc.getAutomationCompositionList()) {
306             var invocationBuilder = super.sendRequest(
307                     INSTANTIATION_ENDPOINT + "?name=" + automationCompositionFromRsc.getKey().getName());
308             var resp = invocationBuilder.delete();
309             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
310         }
311     }
312
313     @Test
314     void testCommand_NotFound1() {
315         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
316         Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
317         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
318     }
319
320     @Test
321     void testCommand_NotFound2() throws Exception {
322         InstantiationCommand command =
323                 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
324         command.setOrderedState(null);
325
326         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
327         Response resp = invocationBuilder.put(Entity.json(command));
328         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
329     }
330
331     @Test
332     void testCommand() throws Exception {
333         var automationCompositions =
334                 InstantiationUtils.getAutomationCompositionsFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
335         for (var automationComposition : automationCompositions.getAutomationCompositionList()) {
336             automationComposition.setCompositionId(compositionId);
337         }
338         instantiationProvider.createAutomationCompositions(automationCompositions);
339
340         var participants = CommonTestData.createParticipants();
341         for (var participant : participants) {
342             participantProvider.saveParticipant(participant);
343         }
344
345         var command =
346                 InstantiationUtils.getInstantiationCommandFromResource(AC_INSTANTIATION_CHANGE_STATE_JSON, "Command");
347
348         var invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
349         var resp = invocationBuilder.put(Entity.json(command));
350         assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
351         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
352         InstantiationUtils.assertInstantiationResponse(instResponse, command);
353
354         // check passive state on DB
355         for (var toscaConceptIdentifier : command.getAutomationCompositionIdentifierList()) {
356             var automationCompositionsGet = instantiationProvider
357                     .getAutomationCompositions(toscaConceptIdentifier.getName(), toscaConceptIdentifier.getVersion());
358             assertThat(automationCompositionsGet.getAutomationCompositionList()).hasSize(1);
359             assertEquals(command.getOrderedState(),
360                     automationCompositionsGet.getAutomationCompositionList().get(0).getOrderedState());
361         }
362     }
363
364     private synchronized void deleteEntryInDB() throws Exception {
365         automationCompositionRepository.deleteAll();
366         var list = acDefinitionProvider.getAllAcDefinitions();
367         if (!list.isEmpty()) {
368             acDefinitionProvider.deleteAcDefintion(compositionId);
369         }
370     }
371
372     private synchronized void createEntryInDB() throws Exception {
373         deleteEntryInDB();
374         var acmDefinition = acDefinitionProvider.createAutomationCompositionDefinition(serviceTemplate);
375         compositionId = acmDefinition.getCompositionId();
376     }
377 }