fix for SO-2696
[so.git] / adapters / mso-vnfm-adapter / mso-vnfm-etsi-adapter / src / test / java / org / onap / so / adapters / vnfmadapter / rest / Sol003PackageManagementSubscriptionControllerTest.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
21 package org.onap.so.adapters.vnfmadapter.rest;
22
23 import static org.hamcrest.Matchers.is;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertThat;
29 import static org.junit.Assert.assertTrue;
30 import static org.onap.so.adapters.vnfmadapter.Constants.PACKAGE_MANAGEMENT_BASE_URL;
31 import static org.onap.so.client.RestTemplateConfig.CONFIGURABLE_REST_TEMPLATE;
32 import static org.springframework.test.web.client.match.MockRestRequestMatchers.method;
33 import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
34 import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
35 import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
36 import java.io.File;
37 import java.net.URI;
38 import java.net.URISyntaxException;
39 import java.nio.file.Files;
40 import java.nio.file.Paths;
41 import java.security.GeneralSecurityException;
42 import java.util.ArrayList;
43 import java.util.List;
44 import java.util.Objects;
45 import java.util.UUID;
46 import org.junit.After;
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.junit.runner.RunWith;
50 import org.onap.so.adapters.vnfmadapter.Constants;
51 import org.onap.so.adapters.vnfmadapter.VnfmAdapterApplication;
52 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.BasicAuth;
53 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.LinkSelf;
54 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.NsdmSubscription;
55 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmNotificationsFilter;
56 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscription;
57 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.SubscriptionAuthentication;
58 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.Version;
59 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProducts;
60 import org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.VnfProductsProviders;
61 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.InlineResponse2002;
62 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.PkgmSubscriptionRequest;
63 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsAuthentication;
64 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter;
65 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilter.NotificationTypesEnum;
66 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsFilterVnfProductsFromProviders;
67 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.SubscriptionsLinks;
68 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.packagemanagement.model.VnfPackagesLinksSelf;
69 import org.springframework.beans.factory.annotation.Autowired;
70 import org.springframework.beans.factory.annotation.Qualifier;
71 import org.springframework.boot.test.context.SpringBootTest;
72 import org.springframework.boot.test.web.client.TestRestTemplate;
73 import org.springframework.boot.web.server.LocalServerPort;
74 import org.springframework.cache.Cache;
75 import org.springframework.cache.CacheManager;
76 import org.springframework.http.HttpHeaders;
77 import org.springframework.http.HttpMethod;
78 import org.springframework.http.HttpStatus;
79 import org.springframework.http.MediaType;
80 import org.springframework.http.ResponseEntity;
81 import org.springframework.test.context.ActiveProfiles;
82 import org.springframework.test.context.junit4.SpringRunner;
83 import org.springframework.test.web.client.MockRestServiceServer;
84 import org.springframework.test.web.client.match.MockRestRequestMatchers;
85 import org.springframework.web.client.RestTemplate;
86 import com.google.gson.Gson;
87
88 /**
89  * @author Ronan Kenny (ronan.kenny@est.tech)
90  * @author Gareth Roper (gareth.roper@est.tech)
91  */
92 @RunWith(SpringRunner.class)
93 @SpringBootTest(classes = VnfmAdapterApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
94 @ActiveProfiles("test")
95 public class Sol003PackageManagementSubscriptionControllerTest {
96
97     private final Gson gson = new Gson();
98     private final URI msbEndpoint = URI.create("http://msb-iag.onap:80/api/vnfpkgm/v1/subscriptions");
99     private static final String _NOTIFICATION_CALLBACK_URI =
100             "https://so-vnfm-adapter.onap:30406" + Constants.ETSI_SUBSCRIPTION_NOTIFICATION_BASE_URL;
101     private static final String LOCALHOST_URL = "http://localhost:";
102
103     @Autowired
104     @Qualifier(CONFIGURABLE_REST_TEMPLATE)
105     private RestTemplate restTemplate;
106     private MockRestServiceServer mockRestServiceServer;
107     @Autowired
108     private CacheManager cacheServiceProvider;
109     @Autowired
110     private Sol003PackageManagementSubscriptionController sol003PackageManagementSubscriptionController;
111
112     @Autowired
113     private TestRestTemplate testRestTemplate;
114
115     @LocalServerPort
116     private int port;
117
118     private static final String ID = UUID.randomUUID().toString();
119
120     @Before
121     public void setUp() {
122         mockRestServiceServer = MockRestServiceServer.bindTo(restTemplate).build();
123         final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
124         cache.clear();
125     }
126
127     @After
128     public void after() {
129         mockRestServiceServer.reset();
130     }
131
132     @Test
133     public void testSuccessPostSubscription() throws GeneralSecurityException, URISyntaxException {
134         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
135         final ResponseEntity<InlineResponse2002> response =
136                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
137                         .postSubscriptionRequest(pkgmSubscriptionRequest);
138
139         final HttpHeaders headers = buildHttpHeaders(Objects.requireNonNull(response.getBody()).getCallbackUri());
140
141         final SubscriptionsLinks subscriptionsLinks = new SubscriptionsLinks();
142         final VnfPackagesLinksSelf vnfPackagesLinksSelf = new VnfPackagesLinksSelf();
143         vnfPackagesLinksSelf.setHref("https://so-vnfm-adapter.onap:30406" + PACKAGE_MANAGEMENT_BASE_URL
144                 + "/subscriptions/" + response.getBody().getId());
145         subscriptionsLinks.setSelf(vnfPackagesLinksSelf);
146
147         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
148         assertEquals(subscriptionsLinks, response.getBody().getLinks());
149         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
150         assert (response.getHeaders().equals(headers));
151         assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
152         assertNotNull(response.getBody().getCallbackUri());
153     }
154
155     @Test
156     public void testFailPostSubscriptionAlreadyExists() throws GeneralSecurityException {
157         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
158
159         final ResponseEntity<InlineResponse2002> response =
160                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
161                         .postSubscriptionRequest(pkgmSubscriptionRequest);
162
163         // Create duplicate entry
164         final PkgmSubscriptionRequest pkgmSubscriptionRequest2 = buildPkgmSubscriptionRequest();
165
166         final ResponseEntity<InlineResponse2002> response2002 =
167                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
168                         .postSubscriptionRequest(pkgmSubscriptionRequest2);
169
170         assertEquals(HttpStatus.SEE_OTHER, response2002.getStatusCode());
171     }
172
173     @Test
174     public void testSuccessGetSubscriptionWithSubscriptionId() throws GeneralSecurityException, URISyntaxException {
175
176         final PkgmSubscriptionRequest pkgmSubscriptionRequest = postSubscriptionForTest();
177
178         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
179                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
180
181         final ResponseEntity<InlineResponse2002> response =
182                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
183                         .postSubscriptionRequest(pkgmSubscriptionRequest);
184         final String subscriptionId = response.getBody().getId();
185
186
187
188         final ResponseEntity<InlineResponse2002> response2002 =
189                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
190                         .getSubscription(subscriptionId);
191
192         final HttpHeaders headers = buildHttpHeaders(response.getBody().getCallbackUri());
193
194         assertEquals(response.getBody().getFilter(), pkgmSubscriptionRequest.getFilter());
195         assertEquals(response.getHeaders(), headers);
196         assertEquals(HttpStatus.OK, response2002.getStatusCode());
197         assertEquals(pkgmSubscriptionRequest.getFilter(), response.getBody().getFilter());
198         // Ensure CallBackUri is set to new URI
199         assertNotEquals(pkgmSubscriptionRequest.getCallbackUri(), response.getBody().getCallbackUri());
200     }
201
202     @Test
203     public void testFailGetSubscriptionWithInvalidSubscriptionId() {
204         final String invalidId = "invalidSubscriptionId";
205         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + invalidId)).andExpect(method(HttpMethod.GET))
206                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
207         final ResponseEntity<InlineResponse2002> response =
208                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
209                         .getSubscription(invalidId);
210         assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
211     }
212
213     @Test
214     public void testSuccessGetSubscriptions() throws GeneralSecurityException {
215         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
216         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
217
218         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
219                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
220         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.GET))
221                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(ID)), MediaType.APPLICATION_JSON));
222
223         sol003PackageManagementSubscriptionController.postSubscriptionRequest(pkgmSubscriptionRequest);
224         final ResponseEntity<List<InlineResponse2002>> response =
225                 sol003PackageManagementSubscriptionController.getSubscriptions();
226
227         final List<InlineResponse2002> subscriptionsList = response.getBody();
228
229         assertEquals(Objects.requireNonNull(response.getBody()).get(0).getFilter(),
230                 pkgmSubscriptionRequest.getFilter());
231         assert (subscriptionsList != null);
232         assertNotEquals('0', subscriptionsList.size());
233         assertEquals(HttpStatus.OK, response.getStatusCode());
234     }
235
236     @Test
237     public void testSuccessDeleteSubscriptionWithSubscriptionId() throws GeneralSecurityException {
238         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
239         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
240         final String subscriptionId = pkgmSubscription.getId();
241
242         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
243                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
244
245         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.DELETE))
246                 .andRespond(withStatus(HttpStatus.NO_CONTENT));
247         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + subscriptionId)).andExpect(method(HttpMethod.GET))
248                 .andRespond(withSuccess(gson.toJson(new NsdmSubscription().id(subscriptionId)),
249                         MediaType.APPLICATION_JSON));
250
251         final ResponseEntity<InlineResponse2002> responsePost =
252                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
253                         .postSubscriptionRequest(pkgmSubscriptionRequest);
254
255         final ResponseEntity responseDelete =
256                 sol003PackageManagementSubscriptionController.deleteSubscription(subscriptionId);
257
258         // Attempt to retrieve the subscription after delete
259         final ResponseEntity<InlineResponse2002> responseGetSubscription =
260                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
261                         .getSubscription(subscriptionId);
262
263         assertEquals(HttpStatus.NOT_FOUND, responseGetSubscription.getStatusCode());
264         assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
265     }
266
267     @Test
268     public void testDeleteSubscription_SubscripitonNotFoundInEtsiCatalogManager_SubscriptionDeletedFromLocalCache()
269             throws GeneralSecurityException {
270         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
271         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
272
273         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
274                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
275
276         mockRestServiceServer.expect(requestTo(msbEndpoint + "/" + ID)).andExpect(method(HttpMethod.DELETE))
277                 .andRespond(withStatus(HttpStatus.NOT_FOUND));
278
279         final ResponseEntity<InlineResponse2002> responsePost =
280                 (ResponseEntity<InlineResponse2002>) sol003PackageManagementSubscriptionController
281                         .postSubscriptionRequest(pkgmSubscriptionRequest);
282
283         final Cache cache = cacheServiceProvider.getCache(Constants.PACKAGE_MANAGEMENT_SUBSCRIPTION_CACHE);
284         assertNotNull(cache.get(ID));
285
286         final ResponseEntity responseDelete = sol003PackageManagementSubscriptionController.deleteSubscription(ID);
287
288         assertEquals(HttpStatus.NO_CONTENT, responseDelete.getStatusCode());
289         assertNull(cache.get(ID));
290
291     }
292
293     @Test
294     public void testFailDeleteSubscriptionWithInvalidSubscriptionId() throws URISyntaxException, InterruptedException {
295         final ResponseEntity<Void> responseDelete = (ResponseEntity<Void>) sol003PackageManagementSubscriptionController
296                 .deleteSubscription("invalidSubscriptionId");
297         assertEquals(HttpStatus.NOT_FOUND, responseDelete.getStatusCode());
298     }
299
300
301     @Test
302     public void testSuccessPostSubscriptionWithValidNotificationTypes() throws Exception {
303
304         final String file = getAbsolutePath("src/test/resources/requests/SubscriptionRequest.json");
305         final String json = new String(Files.readAllBytes(Paths.get(file)));
306         final PkgmSubscriptionRequest request = gson.fromJson(json, PkgmSubscriptionRequest.class);
307
308         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
309                 .andExpect(MockRestRequestMatchers.content().json(gson.toJson(getEtsiCatalogPkgmSubscriptionRequest())))
310                 .andRespond(withSuccess(gson.toJson(buildPkgmSubscription()), MediaType.APPLICATION_JSON));
311
312
313         final ResponseEntity<InlineResponse2002> responseEntity = testRestTemplate.postForEntity(
314                 LOCALHOST_URL + port + Constants.PACKAGE_MANAGEMENT_BASE_URL + "/subscriptions", request,
315                 InlineResponse2002.class);
316
317         assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
318         assertTrue(responseEntity.hasBody());
319         final InlineResponse2002 actual = responseEntity.getBody();
320         assertEquals(ID, actual.getId());
321
322
323     }
324
325     private org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest getEtsiCatalogPkgmSubscriptionRequest() {
326         return new org.onap.so.adapters.vnfmadapter.extclients.etsicatalog.model.PkgmSubscriptionRequest()
327                 .filters(new PkgmNotificationsFilter()
328                         .addNotificationTypesItem(
329                                 PkgmNotificationsFilter.NotificationTypesEnum.VNFPACKAGEONBOARDINGNOTIFICATION)
330                         .addVnfdIdItem("VNFDID").addVnfPkgIdItem("VNFPKGID")
331                         .addOperationalStateItem(PkgmNotificationsFilter.OperationalStateEnum.ENABLED)
332                         .addVnfProductsFromProvidersItem(new VnfProductsProviders().vnfProvider("EST")
333                                 .addVnfProductsItem(new VnfProducts().vnfProductName("VnfProducts")
334                                         .addVersionsItem(new Version().vnfSoftwareVersion("vnfSoftwareVersion")
335                                                 .addVnfdVersionsItem("version1")))))
336                 .callbackUri(_NOTIFICATION_CALLBACK_URI).authentication(
337                         new SubscriptionAuthentication().addAuthTypeItem(SubscriptionAuthentication.AuthTypeEnum.BASIC)
338                                 .paramsBasic(new BasicAuth().userName("vnfm").password("password1$")));
339     }
340
341     private PkgmSubscriptionRequest buildPkgmSubscriptionRequest() {
342         final PkgmSubscriptionRequest pkgmSubscriptionRequest = new PkgmSubscriptionRequest();
343         final SubscriptionsFilter sub = buildSubscriptionsFilter();
344         final SubscriptionsAuthentication auth = new SubscriptionsAuthentication();
345         pkgmSubscriptionRequest.setFilter(sub);
346         pkgmSubscriptionRequest.setCallbackUri(msbEndpoint.toString());
347         pkgmSubscriptionRequest.setAuthentication(auth);
348         return pkgmSubscriptionRequest;
349     }
350
351     private SubscriptionsFilter buildSubscriptionsFilter() {
352         final SubscriptionsFilter sub = new SubscriptionsFilter();
353         final List<String> vnfdIdList = new ArrayList<>();
354         final List<String> vnfPkgIdList = new ArrayList<>();
355         final List<NotificationTypesEnum> notificationTypes = new ArrayList<>();
356         final SubscriptionsFilterVnfProductsFromProviders subscriptionsFilterVnfProductsFromProviders =
357                 new SubscriptionsFilterVnfProductsFromProviders();
358         final List<SubscriptionsFilterVnfProductsFromProviders> vnfProductsFromProviders = new ArrayList<>();
359
360         vnfProductsFromProviders.add(subscriptionsFilterVnfProductsFromProviders);
361         sub.setVnfdId(vnfdIdList);
362         sub.setNotificationTypes(notificationTypes);
363         sub.setVnfPkgId(vnfPkgIdList);
364         sub.setVnfProductsFromProviders(vnfProductsFromProviders);
365         return sub;
366     }
367
368     private PkgmSubscription buildPkgmSubscription() {
369         final PkgmSubscription pkgmSubscription = new PkgmSubscription();
370         final PkgmNotificationsFilter pkgmNotificationsFilter = new PkgmNotificationsFilter();
371         final LinkSelf linkSelf = new LinkSelf();
372
373         pkgmSubscription.setId(ID);
374         pkgmSubscription.setCallbackUri(msbEndpoint + "/" + pkgmSubscription.getId().toString());
375         pkgmSubscription.setFilter(pkgmNotificationsFilter);
376         pkgmSubscription.setLinks(linkSelf);
377         return pkgmSubscription;
378     }
379
380     private PkgmSubscriptionRequest postSubscriptionForTest() {
381         final PkgmSubscriptionRequest pkgmSubscriptionRequest = buildPkgmSubscriptionRequest();
382         final PkgmSubscription pkgmSubscription = buildPkgmSubscription();
383
384         mockRestServiceServer.expect(requestTo(msbEndpoint)).andExpect(method(HttpMethod.POST))
385                 .andRespond(withSuccess(gson.toJson(pkgmSubscription), MediaType.APPLICATION_JSON));
386         return pkgmSubscriptionRequest;
387     }
388
389     private HttpHeaders buildHttpHeaders(final String uri) throws URISyntaxException {
390         final HttpHeaders headers = new HttpHeaders();
391         final URI myUri = new URI(uri);
392         headers.setLocation(myUri);
393         return headers;
394     }
395
396     private String getAbsolutePath(final String path) {
397         final File file = new File(path);
398         return file.getAbsolutePath();
399     }
400
401 }