985d9a0c3db4e76a00eb2d5c452c27e5e9f60c9b
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021-2023 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 jakarta.ws.rs.client.Entity;
31 import jakarta.ws.rs.core.Response;
32 import java.util.UUID;
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.acm.runtime.instantiation.AutomationCompositionInstantiationProvider;
38 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
39 import org.onap.policy.clamp.acm.runtime.main.rest.InstantiationController;
40 import org.onap.policy.clamp.acm.runtime.util.CommonTestData;
41 import org.onap.policy.clamp.acm.runtime.util.rest.CommonRestController;
42 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
43 import org.onap.policy.clamp.models.acm.concepts.AutomationComposition;
44 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositions;
45 import org.onap.policy.clamp.models.acm.concepts.DeployState;
46 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.AcInstanceStateUpdate;
47 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
48 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.InstantiationResponse;
49 import org.onap.policy.clamp.models.acm.persistence.provider.AcDefinitionProvider;
50 import org.onap.policy.clamp.models.acm.persistence.provider.ParticipantProvider;
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.test.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", "default" })
66 class InstantiationControllerTest extends CommonRestController {
67
68     private static final String AC_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/acm/AutomationComposition.json";
69
70     private static final String AC_INSTANTIATION_UPDATE_JSON =
71             "src/test/resources/rest/acm/AutomationCompositionUpdate.json";
72
73     private static final String INSTANTIATION_ENDPOINT = "compositions/%s/instances";
74
75     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
76
77     @Autowired
78     private AcDefinitionProvider acDefinitionProvider;
79
80     @Autowired
81     private ParticipantProvider participantProvider;
82
83     @Autowired
84     private AutomationCompositionInstantiationProvider instantiationProvider;
85
86     @LocalServerPort
87     private int randomServerPort;
88
89     @BeforeAll
90     public static void setUpBeforeClass() {
91         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
92     }
93
94     @BeforeEach
95     public void setUpPort() {
96         super.setHttpPrefix(randomServerPort);
97     }
98
99     private String getInstanceEndPoint(UUID compositionId) {
100         return String.format(INSTANTIATION_ENDPOINT, compositionId.toString());
101     }
102
103     private String getInstanceEndPoint(UUID compositionId, UUID instanceId) {
104         return String.format(INSTANTIATION_ENDPOINT, compositionId.toString()) + "/" + instanceId;
105     }
106
107     @Test
108     void testSwagger() {
109         super.testSwagger(String.format(INSTANTIATION_ENDPOINT, "{compositionId}"));
110     }
111
112     @Test
113     void testCreate_Unauthorized() {
114         var automationComposition =
115                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Unauthorized");
116
117         assertUnauthorizedPost(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
118     }
119
120     @Test
121     void testQuery_Unauthorized() {
122         assertUnauthorizedGet(getInstanceEndPoint(UUID.randomUUID()));
123     }
124
125     @Test
126     void testUpdate_Unauthorized() {
127         var automationComposition =
128                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Unauthorized");
129
130         assertUnauthorizedPut(getInstanceEndPoint(UUID.randomUUID()), Entity.json(automationComposition));
131     }
132
133     @Test
134     void testDelete_Unauthorized() {
135         assertUnauthorizedDelete(getInstanceEndPoint(UUID.randomUUID()));
136     }
137
138     @Test
139     void testCreate() {
140         var compositionId = createAcDefinitionInDB("Create");
141         var automationCompositionFromRsc =
142                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Create");
143         automationCompositionFromRsc.setCompositionId(compositionId);
144
145         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
146         var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
147         assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
148         var instResponse = resp.readEntity(InstantiationResponse.class);
149         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
150         automationCompositionFromRsc.setInstanceId(instResponse.getInstanceId());
151         automationCompositionFromRsc.getElements().values()
152                 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
153
154         var automationCompositionFromDb =
155                 instantiationProvider.getAutomationComposition(compositionId, instResponse.getInstanceId());
156
157         assertNotNull(automationCompositionFromDb);
158         assertEquals(automationCompositionFromRsc, automationCompositionFromDb);
159     }
160
161     @Test
162     void testCreateBadRequest() {
163         var compositionId = createAcDefinitionInDB("CreateBadRequest");
164         var automationCompositionFromRsc = InstantiationUtils
165                 .getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
166         automationCompositionFromRsc.setCompositionId(compositionId);
167
168         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
169         var resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
170         assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
171
172         // testing Bad Request: AC already defined
173         resp = invocationBuilder.post(Entity.json(automationCompositionFromRsc));
174         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
175         var instResponse = resp.readEntity(InstantiationResponse.class);
176         assertNotNull(instResponse.getErrorDetails());
177         assertNull(instResponse.getAffectedAutomationComposition());
178     }
179
180     @Test
181     void testQuery_NoResultWithThisName() {
182         var invocationBuilder =
183                 super.sendRequest(getInstanceEndPoint(UUID.randomUUID()) + "?name=noResultWithThisName");
184         var rawresp = invocationBuilder.buildGet().invoke();
185         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
186         var resp = rawresp.readEntity(AutomationCompositions.class);
187         assertThat(resp.getAutomationCompositionList()).isEmpty();
188     }
189
190     @Test
191     void testQuery() {
192         var compositionId = createAcDefinitionInDB("Query");
193         var automationComposition =
194                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Query");
195         automationComposition.setCompositionId(compositionId);
196
197         instantiationProvider.createAutomationComposition(compositionId, automationComposition);
198
199         var invocationBuilder = super.sendRequest(
200                 getInstanceEndPoint(compositionId) + "?name=" + automationComposition.getKey().getName());
201         var rawresp = invocationBuilder.buildGet().invoke();
202         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
203         var automationCompositionsQuery = rawresp.readEntity(AutomationCompositions.class);
204         assertNotNull(automationCompositionsQuery);
205         assertThat(automationCompositionsQuery.getAutomationCompositionList()).hasSize(1);
206         assertEquals(automationComposition, automationCompositionsQuery.getAutomationCompositionList().get(0));
207     }
208
209     @Test
210     void testGet() {
211         var compositionId = createAcDefinitionInDB("Get");
212         var automationComposition =
213                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Get");
214         automationComposition.setCompositionId(compositionId);
215
216         instantiationProvider.createAutomationComposition(compositionId, automationComposition);
217
218         var invocationBuilder = super.sendRequest(
219                 getInstanceEndPoint(compositionId, automationComposition.getInstanceId()));
220         var rawresp = invocationBuilder.buildGet().invoke();
221         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
222         var automationCompositionGet = rawresp.readEntity(AutomationComposition.class);
223         assertNotNull(automationCompositionGet);
224         assertEquals(automationComposition, automationCompositionGet);
225     }
226
227     @Test
228     void testUpdate() {
229         var compositionId = createAcDefinitionInDB("Update");
230         var automationCompositionCreate =
231                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Update");
232         automationCompositionCreate.setCompositionId(compositionId);
233
234         var response = instantiationProvider.createAutomationComposition(compositionId, automationCompositionCreate);
235
236         var automationComposition =
237                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_UPDATE_JSON, "Update");
238         automationComposition.setCompositionId(compositionId);
239         automationComposition.setInstanceId(response.getInstanceId());
240         automationComposition.getElements().values()
241                 .forEach(element -> element.setParticipantId(CommonTestData.getParticipantId()));
242
243         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId));
244         var resp = invocationBuilder.post(Entity.json(automationComposition));
245         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
246
247         var instResponse = resp.readEntity(InstantiationResponse.class);
248         InstantiationUtils.assertInstantiationResponse(instResponse, automationComposition);
249
250         var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
251                 automationComposition.getKey().getName(), automationComposition.getKey().getVersion());
252
253         assertNotNull(automationCompositionsFromDb);
254         assertThat(automationCompositionsFromDb.getAutomationCompositionList()).hasSize(1);
255         assertEquals(automationComposition, automationCompositionsFromDb.getAutomationCompositionList().get(0));
256     }
257
258     @Test
259     void testDelete() {
260         var compositionId = createAcDefinitionInDB("Delete");
261         var automationCompositionFromRsc =
262                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Delete");
263         automationCompositionFromRsc.setCompositionId(compositionId);
264
265         var instResponse =
266                 instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
267
268         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
269         var resp = invocationBuilder.delete();
270         assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
271         instResponse = resp.readEntity(InstantiationResponse.class);
272         InstantiationUtils.assertInstantiationResponse(instResponse, automationCompositionFromRsc);
273
274         var automationCompositionsFromDb = instantiationProvider.getAutomationCompositions(compositionId,
275                 automationCompositionFromRsc.getKey().getName(), automationCompositionFromRsc.getKey().getVersion());
276         assertEquals(DeployState.DELETING,
277                 automationCompositionsFromDb.getAutomationCompositionList().get(0).getDeployState());
278     }
279
280     @Test
281     void testDeleteNotFound() {
282         var compositionId = createAcDefinitionInDB("DeleteNotFound");
283         var automationCompositionFromRsc =
284                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "DelNotFound");
285         automationCompositionFromRsc.setCompositionId(compositionId);
286
287         instantiationProvider.createAutomationComposition(compositionId, automationCompositionFromRsc);
288
289         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
290         var resp = invocationBuilder.delete();
291         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
292     }
293
294     @Test
295     void testDeploy_NotFound() {
296         var compositionId = createAcDefinitionInDB("Deploy_NotFound");
297         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, UUID.randomUUID()));
298         var resp = invocationBuilder.put(Entity.json(new AcInstanceStateUpdate()));
299         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
300     }
301
302     @Test
303     void testDeploy_BadRequest() {
304         var compositionId = createAcDefinitionInDB("Deploy_BadRequest");
305         var acFromRsc =
306                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "BadRequest");
307         acFromRsc.setCompositionId(compositionId);
308
309         var instResponse = instantiationProvider.createAutomationComposition(compositionId, acFromRsc);
310
311         var command = new AcInstanceStateUpdate();
312         command.setDeployOrder(null);
313         command.setLockOrder(null);
314
315         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
316         var resp = invocationBuilder.put(Entity.json(command));
317         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
318     }
319
320     @Test
321     void testDeploy() {
322         var compositionId = createAcDefinitionInDB("Deploy");
323         var automationComposition =
324                 InstantiationUtils.getAutomationCompositionFromResource(AC_INSTANTIATION_CREATE_JSON, "Command");
325         automationComposition.setCompositionId(compositionId);
326         var instResponse = instantiationProvider.createAutomationComposition(compositionId, automationComposition);
327
328         var instantiationUpdate = new AcInstanceStateUpdate();
329         instantiationUpdate.setDeployOrder(DeployOrder.DEPLOY);
330         instantiationUpdate.setLockOrder(null);
331
332         var invocationBuilder = super.sendRequest(getInstanceEndPoint(compositionId, instResponse.getInstanceId()));
333         var resp = invocationBuilder.put(Entity.json(instantiationUpdate));
334         assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
335     }
336
337     private UUID createAcDefinitionInDB(String name) {
338         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
339         serviceTemplateCreate.setName(name);
340         var acmDefinition = CommonTestData.createAcDefinition(serviceTemplate, AcTypeState.PRIMED);
341         acDefinitionProvider.updateAcDefinition(acmDefinition);
342         saveDummyParticipantInDb();
343         return acmDefinition.getCompositionId();
344     }
345
346     private void saveDummyParticipantInDb() {
347         participantProvider.saveParticipant(CommonTestData.createParticipant(CommonTestData.getParticipantId()));
348     }
349 }