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