Merge "Removing so-monitoring module"
[so.git] / so-etsi-nfvo / so-etsi-nfvo-ns-lcm / so-etsi-nfvo-ns-lcm-service / src / test / java / org / onap / so / etsi / nfvo / ns / lcm / rest / NsLifecycleManagementControllerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2020 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.so.etsi.nfvo.ns.lcm.rest;
21
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertNotNull;
24 import static org.junit.Assert.assertTrue;
25 import static org.mockito.ArgumentMatchers.eq;
26 import static org.mockito.Mockito.doNothing;
27 import static org.mockito.Mockito.doThrow;
28 import static org.mockito.Mockito.when;
29 import java.net.URISyntaxException;
30 import java.util.List;
31 import java.util.UUID;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.junit.runner.RunWith;
35 import org.onap.so.etsi.nfvo.ns.lcm.Constants;
36 import org.onap.so.etsi.nfvo.ns.lcm.TestApplication;
37 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.GsonProvider;
38 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.exceptions.NsRequestProcessingException;
39 import org.onap.so.etsi.nfvo.ns.lcm.bpmn.flows.service.JobExecutorService;
40 import org.onap.so.etsi.nfvo.ns.lcm.model.CreateNsRequest;
41 import org.onap.so.etsi.nfvo.ns.lcm.model.InlineResponse400;
42 import org.onap.so.etsi.nfvo.ns.lcm.model.InstantiateNsRequest;
43 import org.onap.so.etsi.nfvo.ns.lcm.model.NsInstancesNsInstance;
44 import org.onap.so.etsi.nfvo.ns.lcm.model.TerminateNsRequest;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.boot.test.context.SpringBootTest;
47 import org.springframework.boot.test.mock.mockito.MockBean;
48 import org.springframework.boot.test.web.client.TestRestTemplate;
49 import org.springframework.boot.web.client.RestTemplateBuilder;
50 import org.springframework.boot.web.server.LocalServerPort;
51 import org.springframework.http.HttpEntity;
52 import org.springframework.http.HttpHeaders;
53 import org.springframework.http.HttpMethod;
54 import org.springframework.http.HttpStatus;
55 import org.springframework.http.ResponseEntity;
56 import org.springframework.http.converter.json.GsonHttpMessageConverter;
57 import org.springframework.test.context.ActiveProfiles;
58 import org.springframework.test.context.junit4.SpringRunner;
59 import com.google.gson.Gson;
60
61 /**
62  * @author Waqas Ikram (waqas.ikram@est.tech)
63  *
64  */
65 @RunWith(SpringRunner.class)
66 @SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
67 @ActiveProfiles("test")
68 public class NsLifecycleManagementControllerTest {
69     private static final String EXPECTED_BASE_URL =
70             "http://so-etsi-nfvo-ns-lcm.onap:9095/so/so-etsi-nfvo-ns-lcm/v1/api/nslcm/v1";
71     private static final String RANDOM_NS_LCM_OP_OCC_ID = UUID.randomUUID().toString();
72     private static final String RANDOM_NS_INST_ID = UUID.randomUUID().toString();
73     private static final String SERVICE_TYPE = "NetworkService";
74     private static final String GLOBAL_CUSTOMER_ID = UUID.randomUUID().toString();
75     private static final String EXPECTED_CREATE_REQ_LOCATION_URL =
76             EXPECTED_BASE_URL + "/ns_instances/" + RANDOM_NS_INST_ID;
77     private static final String EXPECTED_NS_LCM_OP_OCC_REQ_LOCATION_URL =
78             EXPECTED_BASE_URL + "/ns_lcm_op_occs/" + RANDOM_NS_LCM_OP_OCC_ID;
79
80     @LocalServerPort
81     private int port;
82
83     private TestRestTemplate testRestTemplate;
84
85     @Autowired
86     private GsonProvider gsonProvider;
87
88     @MockBean
89     private JobExecutorService mockedJobExecutorService;
90
91     @Before
92     public void setUp() {
93         final Gson gson = gsonProvider.getGson();
94         testRestTemplate = new TestRestTemplate(
95                 new RestTemplateBuilder().additionalMessageConverters(new GsonHttpMessageConverter(gson)));
96     }
97
98     @Test
99     public void testCreateNs_ValidCreateNsRequest() throws URISyntaxException {
100
101         final CreateNsRequest createNsRequest = getCreateNsRequest();
102
103         when(mockedJobExecutorService.runCreateNsJob(eq(createNsRequest), eq(GLOBAL_CUSTOMER_ID), eq(SERVICE_TYPE)))
104                 .thenReturn(new NsInstancesNsInstance().id(RANDOM_NS_INST_ID));
105
106         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances";
107         final HttpHeaders headers = new HttpHeaders();
108         headers.add(Constants.HTTP_GLOBAL_CUSTOMER_ID_HTTP_HEADER_PARM_NAME, GLOBAL_CUSTOMER_ID);
109         final HttpEntity<?> request = new HttpEntity<>(createNsRequest, headers);
110         final ResponseEntity<NsInstancesNsInstance> responseEntity =
111                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, NsInstancesNsInstance.class);
112         assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
113         assertTrue(responseEntity.hasBody());
114         assertNotNull(responseEntity.getBody());
115
116         final HttpHeaders httpHeaders = responseEntity.getHeaders();
117         assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
118         final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
119         assertEquals(1, actual.size());
120         assertEquals(EXPECTED_CREATE_REQ_LOCATION_URL, actual.get(0));
121     }
122
123     @Test
124     public void testCreateNs_createNsRequest_nsRequestProcessingExceptionThrown_returnInlineResponse400()
125             throws URISyntaxException {
126
127         final CreateNsRequest createNsRequest = getCreateNsRequest();
128
129         final String message = "Unable to process request";
130         when(mockedJobExecutorService.runCreateNsJob(eq(createNsRequest), eq(GLOBAL_CUSTOMER_ID), eq(SERVICE_TYPE)))
131                 .thenThrow(new NsRequestProcessingException(message, new InlineResponse400().detail(message)));
132
133         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances";
134         final HttpHeaders headers = new HttpHeaders();
135         headers.add(Constants.HTTP_GLOBAL_CUSTOMER_ID_HTTP_HEADER_PARM_NAME, GLOBAL_CUSTOMER_ID);
136         final HttpEntity<?> request = new HttpEntity<>(createNsRequest, headers);
137         final ResponseEntity<InlineResponse400> responseEntity =
138                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, InlineResponse400.class);
139         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
140         assertTrue(responseEntity.hasBody());
141         assertNotNull(responseEntity.getBody());
142
143         final InlineResponse400 body = responseEntity.getBody();
144         assertEquals(message, body.getDetail());
145
146     }
147
148     @Test
149     public void testCreateNs_createNsRequest_exceptionThrown_returnInlineResponse400() throws URISyntaxException {
150
151         final CreateNsRequest createNsRequest = getCreateNsRequest();
152
153         final String message = "Unable to process request";
154         when(mockedJobExecutorService.runCreateNsJob(eq(createNsRequest), eq(GLOBAL_CUSTOMER_ID), eq(SERVICE_TYPE)))
155                 .thenThrow(new RuntimeException(message));
156
157         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances";
158         final HttpHeaders headers = new HttpHeaders();
159         headers.add(Constants.HTTP_GLOBAL_CUSTOMER_ID_HTTP_HEADER_PARM_NAME, GLOBAL_CUSTOMER_ID);
160         final HttpEntity<?> request = new HttpEntity<>(createNsRequest, headers);
161         final ResponseEntity<InlineResponse400> responseEntity =
162                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, InlineResponse400.class);
163         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
164         assertTrue(responseEntity.hasBody());
165         assertNotNull(responseEntity.getBody());
166
167         final InlineResponse400 body = responseEntity.getBody();
168         assertEquals(message, body.getDetail());
169
170     }
171
172     @Test
173     public void testDeleteNs_SuccessfulCase() {
174         final String nsInstId = UUID.randomUUID().toString();
175         doNothing().when(mockedJobExecutorService).runDeleteNsJob(eq(nsInstId));
176
177         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + nsInstId;
178         final ResponseEntity<Void> responseEntity =
179                 testRestTemplate.exchange(baseUrl, HttpMethod.DELETE, null, Void.class);
180         assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
181     }
182
183     @Test
184     public void testDeleteNs_nsRequestProcessingExceptionThrown_returnInlineResponse400() {
185         final String nsInstId = UUID.randomUUID().toString();
186         final String message = "Unable to process request";
187         doThrow(new NsRequestProcessingException(message, new InlineResponse400().detail(message)))
188                 .when(mockedJobExecutorService).runDeleteNsJob(eq(nsInstId));
189
190         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + nsInstId;
191         final ResponseEntity<InlineResponse400> responseEntity =
192                 testRestTemplate.exchange(baseUrl, HttpMethod.DELETE, null, InlineResponse400.class);
193
194         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
195         assertTrue(responseEntity.hasBody());
196         assertNotNull(responseEntity.getBody());
197     }
198
199     @Test
200     public void testInstantiateNs_ValidInstantiateNsRequest() {
201
202         final InstantiateNsRequest instantiateNsRequest = getInstantiateNsRequest();
203         when(mockedJobExecutorService.runInstantiateNsJob(eq(RANDOM_NS_INST_ID), eq(instantiateNsRequest)))
204                 .thenReturn(RANDOM_NS_LCM_OP_OCC_ID);
205
206         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + RANDOM_NS_INST_ID + "/instantiate";
207         final HttpEntity<?> request = new HttpEntity<>(instantiateNsRequest);
208         final ResponseEntity<Void> responseEntity =
209                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, Void.class);
210         assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
211
212         final HttpHeaders httpHeaders = responseEntity.getHeaders();
213         assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
214         final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
215         assertEquals(1, actual.size());
216         assertEquals(EXPECTED_NS_LCM_OP_OCC_REQ_LOCATION_URL, actual.get(0));
217     }
218
219     @Test
220     public void testInstantiateNs_instantiateNsRequest_nsRequestProcessingExceptionThrown_returnInlineResponse400() {
221         final String message = "Unable to process request";
222         final InstantiateNsRequest instantiateNsRequest = getInstantiateNsRequest();
223         when(mockedJobExecutorService.runInstantiateNsJob(eq(RANDOM_NS_INST_ID), eq(instantiateNsRequest)))
224                 .thenThrow(new NsRequestProcessingException(message, new InlineResponse400().detail(message)));
225
226         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + RANDOM_NS_INST_ID + "/instantiate";
227         final HttpEntity<?> request = new HttpEntity<>(instantiateNsRequest);
228         final ResponseEntity<InlineResponse400> responseEntity =
229                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, InlineResponse400.class);
230
231         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
232         assertTrue(responseEntity.hasBody());
233         assertNotNull(responseEntity.getBody());
234     }
235
236     @Test
237     public void testTerminateNs_ValidTerminateNsRequest_Success() {
238         final TerminateNsRequest terminateNsRequest = getTerminateNsRequest();
239         when(mockedJobExecutorService.runTerminateNsJob(eq(RANDOM_NS_INST_ID), eq(terminateNsRequest)))
240                 .thenReturn(RANDOM_NS_LCM_OP_OCC_ID);
241
242         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + RANDOM_NS_INST_ID + "/terminate";
243         final HttpEntity<?> request = new HttpEntity<>(terminateNsRequest);
244         final ResponseEntity<Void> responseEntity =
245                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, Void.class);
246         assertEquals(HttpStatus.ACCEPTED, responseEntity.getStatusCode());
247
248         final HttpHeaders httpHeaders = responseEntity.getHeaders();
249         assertTrue(httpHeaders.containsKey(HttpHeaders.LOCATION));
250         final List<String> actual = httpHeaders.get(HttpHeaders.LOCATION);
251         assertEquals(1, actual.size());
252         assertEquals(EXPECTED_NS_LCM_OP_OCC_REQ_LOCATION_URL, actual.get(0));
253     }
254
255     @Test
256     public void testTerminateNs_ValidTerminateNsRequest_nsRequestProcessingExceptionThrown_returnInlineResponse400() {
257         final String errorMessage = "ERROR MESSAGE";
258         final TerminateNsRequest terminateNsRequest = getTerminateNsRequest();
259         when(mockedJobExecutorService.runTerminateNsJob(eq(RANDOM_NS_INST_ID), eq(terminateNsRequest)))
260                 .thenThrow(new NsRequestProcessingException(errorMessage));
261
262         final String baseUrl = getNsLcmBaseUrl() + "/ns_instances/" + RANDOM_NS_INST_ID + "/terminate";
263         final HttpEntity<?> request = new HttpEntity<>(terminateNsRequest);
264         final ResponseEntity<InlineResponse400> responseEntity =
265                 testRestTemplate.exchange(baseUrl, HttpMethod.POST, request, InlineResponse400.class);
266         assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, responseEntity.getStatusCode());
267         assertTrue(responseEntity.hasBody());
268         assertNotNull(responseEntity.getBody());
269     }
270
271     private TerminateNsRequest getTerminateNsRequest() {
272         // Only support for the immediate Terminate request; i.e., terminateTime field is empty (not set)
273         return new TerminateNsRequest();
274     }
275
276     private InstantiateNsRequest getInstantiateNsRequest() {
277         return new InstantiateNsRequest().nsFlavourId("FLAVOUR_ID");
278     }
279
280     private CreateNsRequest getCreateNsRequest() {
281         return new CreateNsRequest().nsdId(RANDOM_NS_INST_ID);
282     }
283
284     private String getNsLcmBaseUrl() {
285         return "http://localhost:" + port + Constants.NS_LIFE_CYCLE_MANAGEMENT_BASE_URL;
286     }
287 }
288