6c5417286fa59d74645683fec2fb243d41495949
[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.commissioning.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.junit.jupiter.api.Assertions.assertTrue;
29 import static org.onap.policy.clamp.acm.runtime.util.CommonTestData.TOSCA_SERVICE_TEMPLATE_YAML;
30
31 import jakarta.ws.rs.client.Entity;
32 import jakarta.ws.rs.core.Response;
33 import java.util.HashMap;
34 import java.util.Map;
35 import java.util.UUID;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.junit.jupiter.api.extension.ExtendWith;
40 import org.onap.policy.clamp.acm.runtime.instantiation.InstantiationUtils;
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.AutomationCompositionDefinition;
44 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.AcTypeStateUpdate;
45 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.CommissioningResponse;
46 import org.onap.policy.clamp.models.acm.messages.rest.commissioning.PrimeOrder;
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.models.tosca.authorative.concepts.ToscaDataType;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
51 import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty;
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 @ExtendWith(SpringExtension.class)
61 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
62 @ActiveProfiles({ "test", "default" })
63 class CommissioningControllerTest extends CommonRestController {
64
65     private static final String COMMISSIONING_ENDPOINT = "compositions";
66     private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
67
68     @Autowired
69     private AcDefinitionProvider acDefinitionProvider;
70
71     @Autowired
72     private ParticipantProvider participantProvider;
73     @LocalServerPort
74     private int randomServerPort;
75
76     /**
77      * starts Main and inserts a commissioning template.
78      */
79     @BeforeAll
80     public static void setUpBeforeClass() {
81         serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_SERVICE_TEMPLATE_YAML);
82     }
83
84     @BeforeEach
85     public void setUpPort() {
86         super.setHttpPrefix(randomServerPort);
87     }
88
89     @Test
90     void testSwagger() {
91         super.testSwagger(COMMISSIONING_ENDPOINT);
92     }
93
94     @Test
95     void testUnauthorizedCreate() {
96         assertUnauthorizedPost(COMMISSIONING_ENDPOINT, Entity.json(serviceTemplate));
97     }
98
99     @Test
100     void testUnauthorizedQuery() {
101         assertUnauthorizedGet(COMMISSIONING_ENDPOINT);
102     }
103
104     @Test
105     void testUnauthorizedDelete() {
106         assertUnauthorizedDelete(COMMISSIONING_ENDPOINT);
107     }
108
109     @Test
110     void testCreateBadRequest() {
111         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
112         var resp = invocationBuilder.post(Entity.json("NotToscaServiceTempalte"));
113
114         assertThat(Response.Status.BAD_REQUEST.getStatusCode()).isEqualTo(resp.getStatus());
115         var commissioningResponse = resp.readEntity(CommissioningResponse.class);
116         assertThat(commissioningResponse.getErrorDetails())
117             .isEqualTo("org.springframework.http.converter.HttpMessageNotReadableException "
118                 + "Bad Request Could not read JSON: java.lang.IllegalStateException: "
119                 + "Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $");
120         assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).isNull();
121     }
122
123     @Test
124     void testCreateBadVersion() {
125         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
126         var x = new ToscaNodeTemplate(serviceTemplateCreate
127             .getToscaTopologyTemplate().getNodeTemplates().values().iterator().next());
128         x.setVersion("1.0.wrong");
129         serviceTemplateCreate.getToscaTopologyTemplate().getNodeTemplates().put(x.getName(), x);
130
131         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
132         var resp = invocationBuilder.post(Entity.json(serviceTemplateCreate));
133
134         assertThat(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).isEqualTo(resp.getStatus());
135         var commissioningResponse = resp.readEntity(CommissioningResponse.class);
136         assertThat(commissioningResponse.getErrorDetails())
137             .isEqualTo("java.lang.IllegalArgumentException Internal Server Error parameter "
138                 + "\"version\": value \"1.0.wrong\", does not match regular expression \"^(\\d+.){2}\\d+$\"");
139         assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).isNull();
140     }
141
142     @Test
143     void testCreate() {
144         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
145         serviceTemplateCreate.setName("Create");
146
147         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
148         var resp = invocationBuilder.post(Entity.json(serviceTemplateCreate));
149         assertEquals(Response.Status.CREATED.getStatusCode(), resp.getStatus());
150         var commissioningResponse = resp.readEntity(CommissioningResponse.class);
151         assertNotNull(commissioningResponse);
152         assertNull(commissioningResponse.getErrorDetails());
153         // Response should return the number of node templates present in the service template
154         assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).hasSize(7);
155         for (var nodeTemplateName : serviceTemplateCreate.getToscaTopologyTemplate().getNodeTemplates().keySet()) {
156             assertTrue(commissioningResponse.getAffectedAutomationCompositionDefinitions().stream()
157                     .anyMatch(ac -> ac.getName().equals(nodeTemplateName)));
158         }
159     }
160
161     @Test
162     void testUpdate() {
163         var toscaDataType = new ToscaDataType();
164         toscaDataType.setName("org.onap.datatypes.policy.clamp.Configuration");
165         toscaDataType.setDerivedFrom("tosca.datatypes.Root");
166         toscaDataType.setProperties(new HashMap<>());
167         var toscaProperty = new ToscaProperty();
168         toscaProperty.setName("configurationEntityId");
169         toscaProperty.setType("onap.datatypes.ToscaConceptIdentifier");
170         toscaDataType.getProperties().put(toscaProperty.getName(), toscaProperty);
171
172         var compositionId = createEntryInDB("forUpdate");
173         var serviceTemplateUpdate = new ToscaServiceTemplate(serviceTemplate);
174         serviceTemplateUpdate.getDataTypes().put(toscaDataType.getName(), toscaDataType);
175         serviceTemplateUpdate.setMetadata(Map.of("compositionId", compositionId));
176         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
177         var resp = invocationBuilder.post(Entity.json(serviceTemplateUpdate));
178         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
179         var commissioningResponse = resp.readEntity(CommissioningResponse.class);
180         assertNotNull(commissioningResponse);
181         assertNull(commissioningResponse.getErrorDetails());
182         // Response should return the number of node templates present in the service template
183         assertThat(commissioningResponse.getAffectedAutomationCompositionDefinitions()).hasSize(7);
184         for (var nodeTemplateName : serviceTemplateUpdate.getToscaTopologyTemplate().getNodeTemplates().keySet()) {
185             assertTrue(commissioningResponse.getAffectedAutomationCompositionDefinitions().stream()
186                     .anyMatch(ac -> ac.getName().equals(nodeTemplateName)));
187         }
188
189         invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
190         resp = invocationBuilder.buildGet().invoke();
191         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
192         var entity = resp.readEntity(AutomationCompositionDefinition.class);
193         assertThat(entity.getServiceTemplate().getDataTypes()).containsKey(toscaDataType.getName());
194     }
195
196     @Test
197     void testQuery_NoResultWithThisName() {
198         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "?name=noResultWithThisName");
199         var rawresp = invocationBuilder.buildGet().invoke();
200         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
201         var entityList = rawresp.readEntity(ToscaServiceTemplate.class);
202         assertThat(entityList.getNodeTypes()).isNull();
203     }
204
205     @Test
206     void testQuery() {
207         createEntryInDB("forQuery");
208
209         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT);
210         var rawresp = invocationBuilder.buildGet().invoke();
211         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
212         var entityList = rawresp.readEntity(ToscaServiceTemplate.class);
213         assertNotNull(entityList);
214     }
215
216     @Test
217     void testDeleteBadRequest() {
218         createEntryInDB("DeleteBadRequest");
219
220         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + UUID.randomUUID());
221         // Call delete with no info
222         var resp = invocationBuilder.delete();
223         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
224     }
225
226     @Test
227     void testDelete() {
228         var compositionId = createEntryInDB("forDelete");
229
230         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
231         // Call delete with no info
232         var resp = invocationBuilder.delete();
233         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
234
235         var templatesInDB = acDefinitionProvider.findAcDefinition(compositionId);
236         assertThat(templatesInDB).isEmpty();
237     }
238
239     @Test
240     void testPrimeBadRequest() {
241         var compositionId = createEntryInDB("Prime");
242         var invocationBuilder = super.sendRequest(COMMISSIONING_ENDPOINT + "/" + compositionId);
243         var body = new AcTypeStateUpdate();
244         body.setPrimeOrder(PrimeOrder.PRIME);
245         var resp = invocationBuilder.put(Entity.json(body));
246         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
247     }
248
249     private UUID createEntryInDB(String name) {
250         var serviceTemplateCreate = new ToscaServiceTemplate(serviceTemplate);
251         serviceTemplateCreate.setName(name);
252         var acmDefinition = acDefinitionProvider
253                 .createAutomationCompositionDefinition(serviceTemplateCreate, CommonTestData.TOSCA_ELEMENT_NAME,
254                         CommonTestData.TOSCA_COMP_NAME);
255
256         return acmDefinition.getCompositionId();
257     }
258
259 }