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