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