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