From 44a205e0d5fd357bd24c4298a01c74197b79efe3 Mon Sep 17 00:00:00 2001 From: MichaelMorris Date: Tue, 2 Apr 2019 13:46:47 +0000 Subject: Check for existing VNF in VNFM Issue-ID: SO-1622 Change-Id: I6aa6af3c6988032f436c5da79c0140370469439e Signed-off-by: MichaelMorris --- .../onap/so/client/aai/AAINamespaceConstants.java | 14 ++-- .../java/org/onap/so/client/aai/AAIObjectType.java | 7 ++ .../so/rest/service/HttpRestServiceProvider.java | 39 ++++++++--- .../rest/service/HttpRestServiceProviderImpl.java | 81 ++++++++++------------ .../service/HttpRestServiceProviderImplTest.java | 45 ++++++++++-- 5 files changed, 121 insertions(+), 65 deletions(-) (limited to 'common') diff --git a/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java b/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java index 9d2c3a8b1b..1225bb3fd5 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java +++ b/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,10 +22,10 @@ package org.onap.so.client.aai; public class AAINamespaceConstants { - public static final String CLOUD_INFRASTRUCTURE = "/cloud-infrastructure"; - public static final String NETWORK = "/network"; - public static final String BUSINESS = "/business"; - public static final String SERVICE_DESIGN_AND_CREATION = "/service-design-and-creation"; - + public static final String CLOUD_INFRASTRUCTURE = "/cloud-infrastructure"; + public static final String NETWORK = "/network"; + public static final String BUSINESS = "/business"; + public static final String SERVICE_DESIGN_AND_CREATION = "/service-design-and-creation"; + public static final String EXTERNAL_SYSTEM = "/external-system"; } diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java index 34d560210c..f6aa2fdb19 100644 --- a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java @@ -37,6 +37,9 @@ import org.onap.aai.domain.yang.Configuration; import org.onap.aai.domain.yang.Connector; import org.onap.aai.domain.yang.Customer; import org.onap.aai.domain.yang.Device; +import org.onap.aai.domain.yang.EsrSystemInfoList; +import org.onap.aai.domain.yang.EsrVnfm; +import org.onap.aai.domain.yang.EsrVnfmList; import org.onap.aai.domain.yang.ExtAaiNetwork; import org.onap.aai.domain.yang.Flavor; import org.onap.aai.domain.yang.GenericVnf; @@ -139,6 +142,10 @@ public class AAIObjectType implements GraphInventoryObjectType, Serializable { public static final AAIObjectType FLAVOR = new AAIObjectType(AAIObjectType.CLOUD_REGION.uriTemplate(), Flavor.class); public static final AAIObjectType UNKNOWN = new AAIObjectType("", "", "unknown"); public static final AAIObjectType DSL = new AAIObjectType("/dsl", "", "dsl"); + public static final AAIObjectType VNFM = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM + "/esr-vnfm-list/esr-vnfm/{vnfm-id}", EsrVnfm.class); + public static final AAIObjectType VNFM_LIST = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM, "/esr-vnfm-list", "vnfm-list"); + public static final AAIObjectType VNFM_ESR_SYSTEM_INFO_LIST = new AAIObjectType(AAINamespaceConstants.EXTERNAL_SYSTEM + "/esr-vnfm-list", "/esr-vnfm/{vnfm-id}/esr-system-info-list", "vnfm-esr-system-info-list"); + private final String uriTemplate; private final String parentUri; diff --git a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProvider.java b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProvider.java index 43b2fb4292..7fb5adcb5b 100644 --- a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProvider.java +++ b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProvider.java @@ -20,9 +20,8 @@ package org.onap.so.rest.service; -import org.springframework.http.ResponseEntity; - import com.google.common.base.Optional; +import org.springframework.http.ResponseEntity; /** * @author waqas.ikram@est.tech @@ -31,42 +30,62 @@ public interface HttpRestServiceProvider { /** * Execute the HTTP GET to the given URI template - * + * * @param url the URL * @param clazz the type of the return value * @return Returns the body of this entity. */ - public Optional get(final String url, final Class clazz); + Optional get(final String url, final Class clazz); /** * Execute the HTTP GET to the given URI template - * + * * @param url the URL * @param clazz the type of the return value * @return Returns the {@link ResponseEntity}. */ - public ResponseEntity getHttpResponse(final String url, final Class clazz); + ResponseEntity getHttpResponse(final String url, final Class clazz); /** * Execute the HTTP POST to the given URI template - * + * * @param object the entity (i.e. body) to write to the request * @param url the URL * @param clazz the type of the return value * @return Returns the body of this entity. */ - public Optional post(final Object object, final String url, final Class clazz); + Optional post(final Object object, final String url, final Class clazz); /** * Execute the HTTP POST to the given URI template - * + * + * @param object the entity (i.e. body) to write to the request + * @param url the URL + * @param clazz the type of the return value + * @return Returns the {@link ResponseEntity}. + */ + ResponseEntity postHttpRequest(final Object object, final String url, final Class clazz); + + /** + * Execute the HTTP PUT to the given URI template + * + * @param object the entity (i.e. body) to write to the request + * @param url the URL + * @param clazz the type of the return value + * @return Returns the body of this entity. + */ + Optional put(final Object object, final String url, final Class clazz); + + /** + * Execute the HTTP PUT to the given URI template + * * @param object the entity (i.e. body) to write to the request * @param url the URL * @param clazz the type of the return value * @return Returns the {@link ResponseEntity}. */ - public ResponseEntity postHttpRequest(final Object object, final String url, final Class clazz); + ResponseEntity putHttpRequest(final Object object, final String url, final Class clazz); } diff --git a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java index 032df84a98..d3cc1747a3 100644 --- a/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java +++ b/common/src/main/java/org/onap/so/rest/service/HttpRestServiceProviderImpl.java @@ -20,6 +20,7 @@ package org.onap.so.rest.service; +import com.google.common.base.Optional; import org.onap.so.configuration.rest.BasicHttpHeadersProvider; import org.onap.so.configuration.rest.HttpHeadersProvider; import org.onap.so.rest.exceptions.InvalidRestRequestException; @@ -35,11 +36,9 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import com.google.common.base.Optional; - /** * A Service to perform HTTP requests - * + * * @author waqas.ikram@est.tech */ public class HttpRestServiceProviderImpl implements HttpRestServiceProvider { @@ -61,49 +60,45 @@ public class HttpRestServiceProviderImpl implements HttpRestServiceProvider { @Override public Optional get(final String url, final Class clazz) { final ResponseEntity response = getHttpResponse(url, clazz); - if (!response.getStatusCode().equals(HttpStatus.OK)) { - final String message = - "Unable to invoke HTTP GET using URL: " + url + ", Response Code: " + response.getStatusCode(); - LOGGER.error(message); - return Optional.absent(); - } - - if (response.hasBody()) { - return Optional.of(response.getBody()); - } - return Optional.absent(); + return createOptional(response, url, HttpMethod.GET); } @Override public ResponseEntity getHttpResponse(final String url, final Class clazz) { - LOGGER.trace("Will invoke HTTP GET using URL: {}", url); - try { - final HttpEntity request = new HttpEntity<>(getHttpHeaders()); - return restTemplate.exchange(url, HttpMethod.GET, request, clazz); - - } catch (final HttpClientErrorException httpClientErrorException) { - final String message = "Unable to invoke HTTP GET using url: " + url + ", Response: " - + httpClientErrorException.getRawStatusCode(); - LOGGER.error(message, httpClientErrorException); - final int rawStatusCode = httpClientErrorException.getRawStatusCode(); - if (rawStatusCode == HttpStatus.BAD_REQUEST.value() || rawStatusCode == HttpStatus.NOT_FOUND.value()) { - throw new InvalidRestRequestException("No result found for given url: " + url); - } - throw new RestProcessingException("Unable to invoke HTTP GET using URL: " + url); - - } catch (final RestClientException restClientException) { - LOGGER.error("Unable to invoke HTTP GET using url: {}", url, restClientException); - throw new RestProcessingException("Unable to invoke HTTP GET using URL: " + url, restClientException); - } + final HttpEntity request = new HttpEntity<>(getHttpHeaders()); + return invokeHttpRequest(request, HttpMethod.GET, url, clazz); } @Override public Optional post(final Object object, final String url, final Class clazz) { final ResponseEntity response = postHttpRequest(object, url, clazz); + return createOptional(response, url, HttpMethod.POST); + } + + @Override + public ResponseEntity postHttpRequest(final Object object, final String url, final Class clazz) { + final HttpEntity request = new HttpEntity<>(object, getHttpHeaders()); + return invokeHttpRequest(request, HttpMethod.POST, url, clazz); + } + + @Override + public Optional put(final Object object, final String url, final Class clazz) { + final ResponseEntity response = putHttpRequest(object, url, clazz); + return createOptional(response, url, HttpMethod.PUT); + } + + @Override + public ResponseEntity putHttpRequest(final Object object, final String url, final Class clazz) { + final HttpEntity request = new HttpEntity<>(object, getHttpHeaders()); + return invokeHttpRequest(request, HttpMethod.PUT, url, clazz); + } + + private Optional createOptional(final ResponseEntity response, final String url, + final HttpMethod httpMethod) { if (!response.getStatusCode().equals(HttpStatus.OK)) { - final String message = - "Unable to invoke HTTP GET using URL: " + url + ", Response Code: " + response.getStatusCode(); + final String message = "Unable to invoke HTTP " + httpMethod + " using URL: " + url + ", Response Code: " + + response.getStatusCode(); LOGGER.error(message); return Optional.absent(); } @@ -115,26 +110,26 @@ public class HttpRestServiceProviderImpl implements HttpRestServiceProvider { return Optional.absent(); } - - @Override - public ResponseEntity postHttpRequest(final Object object, final String url, final Class clazz) { + private ResponseEntity invokeHttpRequest(final HttpEntity request, final HttpMethod httpMethod, + final String url, final Class clazz) { + LOGGER.trace("Will invoke HTTP {} using URL: {}", httpMethod, url); try { - final HttpEntity request = new HttpEntity<>(object, getHttpHeaders()); - return restTemplate.exchange(url, HttpMethod.POST, request, clazz); + return restTemplate.exchange(url, httpMethod, request, clazz); } catch (final HttpClientErrorException httpClientErrorException) { - final String message = "Unable to invoke HTTP POST using url: " + url + ", Response: " + final String message = "Unable to invoke HTTP " + httpMethod + " using url: " + url + ", Response: " + httpClientErrorException.getRawStatusCode(); LOGGER.error(message, httpClientErrorException); final int rawStatusCode = httpClientErrorException.getRawStatusCode(); if (rawStatusCode == HttpStatus.BAD_REQUEST.value() || rawStatusCode == HttpStatus.NOT_FOUND.value()) { throw new InvalidRestRequestException("No result found for given url: " + url); } - throw new RestProcessingException("Unable to invoke HTTP GET using URL: " + url); + throw new RestProcessingException("Unable to invoke HTTP " + httpMethod + " using URL: " + url); } catch (final RestClientException restClientException) { LOGGER.error("Unable to invoke HTTP POST using url: {}", url, restClientException); - throw new RestProcessingException("Unable to invoke HTTP GET using URL: " + url, restClientException); + throw new RestProcessingException("Unable to invoke HTTP " + httpMethod + " using URL: " + url, + restClientException); } } diff --git a/common/src/test/java/org/onap/so/rest/service/HttpRestServiceProviderImplTest.java b/common/src/test/java/org/onap/so/rest/service/HttpRestServiceProviderImplTest.java index a738afe565..978c016dec 100644 --- a/common/src/test/java/org/onap/so/rest/service/HttpRestServiceProviderImplTest.java +++ b/common/src/test/java/org/onap/so/rest/service/HttpRestServiceProviderImplTest.java @@ -27,7 +27,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; - +import com.google.common.base.Optional; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -42,8 +42,6 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import com.google.common.base.Optional; - /** * @author waqas.ikram@est.tech @@ -180,6 +178,43 @@ public class HttpRestServiceProviderImplTest { eq(String.class)); } + @Test + public void test_put_returnOptionalPresentIfResponseIsOKAndHasBody() { + + final HttpRestServiceProvider objUnderTest = new HttpRestServiceProviderImpl(mockRestTemplate); + + when(mockRestTemplate.exchange(eq(DUMMY_URL), eq(HttpMethod.PUT), any(HttpEntity.class), eq(String.class))) + .thenReturn(mockEntity); + + when(mockEntity.getStatusCode()).thenReturn(HttpStatus.OK); + when(mockEntity.hasBody()).thenReturn(true); + when(mockEntity.getBody()).thenReturn(BODY); + + final Optional actual = objUnderTest.put(BODY, DUMMY_URL, String.class); + + assertTrue(actual.isPresent()); + verify(mockRestTemplate, atLeastOnce()).exchange(eq(DUMMY_URL), eq(HttpMethod.PUT), any(HttpEntity.class), + eq(String.class)); + } + + @Test + public void test_put_returnOptionalPresentIfResponseIsOKAndHasNoBody() { + + final HttpRestServiceProvider objUnderTest = new HttpRestServiceProviderImpl(mockRestTemplate); + + when(mockRestTemplate.exchange(eq(DUMMY_URL), eq(HttpMethod.PUT), any(HttpEntity.class), eq(String.class))) + .thenReturn(mockEntity); + + when(mockEntity.getStatusCode()).thenReturn(HttpStatus.OK); + when(mockEntity.hasBody()).thenReturn(false); + + final Optional actual = objUnderTest.put(BODY, DUMMY_URL, String.class); + + assertFalse(actual.isPresent()); + verify(mockRestTemplate, atLeastOnce()).exchange(eq(DUMMY_URL), eq(HttpMethod.PUT), any(HttpEntity.class), + eq(String.class)); + } + @Test public void test_post_returnOptionalPresentIfResponseIsNotOKAndHasBody() { @@ -197,7 +232,7 @@ public class HttpRestServiceProviderImplTest { verify(mockRestTemplate, atLeastOnce()).exchange(eq(DUMMY_URL), eq(HttpMethod.POST), any(HttpEntity.class), eq(String.class)); } - + @Test(expected = InvalidRestRequestException.class) public void test_post_ThrowsInvalidRestRequestExceptionifHttpClientErrorExceptionWithHttpStatusBadRequest() { assertPostErrorScenario(HttpStatus.BAD_REQUEST); @@ -208,7 +243,7 @@ public class HttpRestServiceProviderImplTest { public void test_post_ThrowsInvalidRestRequestExceptionifHttpClientErrorExceptionWithHttpStatusNotFoundHttpStatus() { assertPostErrorScenario(HttpStatus.NOT_FOUND); } - + @Test(expected = RestProcessingException.class) public void test_post_ThrowsInvalidRestRequestExceptionifHttpClientErrorExceptionOccured() { final HttpRestServiceProvider objUnderTest = new HttpRestServiceProviderImpl(mockRestTemplate); -- cgit 1.2.3-korg