From 19ff70fb04bf4fa6fc01d89c4de02e0c4d60300e Mon Sep 17 00:00:00 2001 From: micdzied Date: Mon, 3 Dec 2018 11:01:37 +0100 Subject: SDK integration: use aai in PRH Change-Id: I68c9a5323e05a27de463bef9dd368f8a092559ae Issue-ID: DCAEGEN2-1013 Signed-off-by: micdzied --- .../prh/config/AaiClientConfiguration.java | 80 ------------- .../prh/service/AaiReactiveWebClientFactory.java | 128 -------------------- .../producer/AaiProducerReactiveHttpClient.java | 90 -------------- .../service/AaiReactiveWebClientFactoryTest.java | 70 ----------- .../AaiProducerReactiveHttpClientTest.java | 133 --------------------- prh-aai-client/src/test/resources/logback-test.xml | 21 ---- 6 files changed, 522 deletions(-) delete mode 100644 prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/config/AaiClientConfiguration.java delete mode 100644 prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactory.java delete mode 100644 prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClient.java delete mode 100644 prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactoryTest.java delete mode 100644 prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClientTest.java delete mode 100644 prh-aai-client/src/test/resources/logback-test.xml (limited to 'prh-aai-client/src') diff --git a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/config/AaiClientConfiguration.java b/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/config/AaiClientConfiguration.java deleted file mode 100644 index 23e621fe..00000000 --- a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/config/AaiClientConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcaegen2.services.prh.config; - -import java.io.Serializable; -import java.util.Map; -import org.immutables.gson.Gson; -import org.immutables.value.Value; -import org.springframework.stereotype.Component; - - -@Component -@Value.Immutable(prehash = true) -@Value.Style(builder = "new") -@Gson.TypeAdapters -public abstract class AaiClientConfiguration implements Serializable { - - private static final long serialVersionUID = 1L; - - @Value.Parameter - public abstract String aaiHost(); - - @Value.Parameter - public abstract Integer aaiPort(); - - @Value.Parameter - public abstract String aaiProtocol(); - - @Value.Parameter - public abstract String aaiUserName(); - - @Value.Parameter - public abstract String aaiUserPassword(); - - @Value.Parameter - public abstract Boolean aaiIgnoreSslCertificateErrors(); - - @Value.Parameter - public abstract String aaiBasePath(); - - @Value.Parameter - public abstract String aaiPnfPath(); - - @Value.Parameter - public abstract Map aaiHeaders(); - - @Value.Parameter - public abstract String trustStorePath(); - - @Value.Parameter - public abstract String trustStorePasswordPath(); - - @Value.Parameter - public abstract String keyStorePath(); - - @Value.Parameter - public abstract String keyStorePasswordPath(); - - @Value.Parameter - public abstract Boolean enableAaiCertAuth(); - -} diff --git a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactory.java b/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactory.java deleted file mode 100644 index e4f330e0..00000000 --- a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactory.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcaegen2.services.prh.service; - -import static org.onap.dcaegen2.services.prh.model.logging.MdcVariables.RESPONSE_CODE; -import static org.onap.dcaegen2.services.prh.model.logging.MdcVariables.SERVICE_NAME; -import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication; - -import io.netty.handler.ssl.SslContext; -import java.util.Map; -import javax.net.ssl.SSLException; -import org.onap.dcaegen2.services.prh.config.AaiClientConfiguration; -import org.onap.dcaegen2.services.prh.ssl.SslFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.springframework.http.client.reactive.ClientHttpConnector; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.ExchangeFilterFunction; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import reactor.netty.http.client.HttpClient; - - -public class AaiReactiveWebClientFactory { - - private static final Logger LOGGER = LoggerFactory.getLogger(AaiReactiveWebClientFactory.class); - - private final String aaiUserName; - private final String aaiUserPassword; - private final Map aaiHeaders; - private final Boolean enableAaiCertAuth; - private final String trustStorePath; - private final String trustStorePasswordPath; - private final String keyStorePath; - private final String keyStorePasswordPath; - private final SslFactory sslFactory; - - /** - * Creating AaiReactiveWebClientFactory. - * - * @param configuration - configuration object - * @param sslFactory - factory for ssl setup - */ - public AaiReactiveWebClientFactory(SslFactory sslFactory, AaiClientConfiguration configuration) { - this.aaiUserName = configuration.aaiUserName(); - this.aaiUserPassword = configuration.aaiUserPassword(); - this.aaiHeaders = configuration.aaiHeaders(); - this.trustStorePath = configuration.trustStorePath(); - this.trustStorePasswordPath = configuration.trustStorePasswordPath(); - this.keyStorePath = configuration.keyStorePath(); - this.keyStorePasswordPath = configuration.keyStorePasswordPath(); - this.enableAaiCertAuth = configuration.enableAaiCertAuth(); - this.sslFactory = sslFactory; - } - - /** - * Construct Reactive WebClient with appropriate settings. - * - * @return WebClient - */ - public WebClient build() throws SSLException { - LOGGER.debug("Setting ssl context"); - - SslContext sslContext = createSslContext(); - - ClientHttpConnector reactorClientHttpConnector = new ReactorClientHttpConnector( - HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext))); - - return WebClient.builder() - .clientConnector(reactorClientHttpConnector) - .defaultHeaders(httpHeaders -> httpHeaders.setAll(aaiHeaders)) - .filter(basicAuthentication(aaiUserName, aaiUserPassword)) - .filter(logRequest()) - .filter(logResponse()) - .build(); - } - - private SslContext createSslContext() throws SSLException { - if (enableAaiCertAuth) { - return sslFactory.createSecureContext( - keyStorePath, - keyStorePasswordPath, - trustStorePath, - trustStorePasswordPath - ); - } - return sslFactory.createInsecureContext(); - } - - private ExchangeFilterFunction logRequest() { - return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - MDC.put(SERVICE_NAME, String.valueOf(clientRequest.url())); - LOGGER.info("Request: {} {}", clientRequest.method(), clientRequest.url()); - clientRequest.headers() - .forEach((name, values) -> values.forEach(value -> LOGGER.info("{}={}", name, value))); - MDC.remove(SERVICE_NAME); - return Mono.just(clientRequest); - }); - } - - private ExchangeFilterFunction logResponse() { - return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { - MDC.put(RESPONSE_CODE, String.valueOf(clientResponse.statusCode())); - LOGGER.info("Response Status {}", clientResponse.statusCode()); - MDC.remove(RESPONSE_CODE); - return Mono.just(clientResponse); - }); - } -} diff --git a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClient.java b/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClient.java deleted file mode 100644 index 43f6ce91..00000000 --- a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClient.java +++ /dev/null @@ -1,90 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcaegen2.services.prh.service.producer; - -import static org.onap.dcaegen2.services.prh.model.CommonFunctions.createJsonBody; -import static org.onap.dcaegen2.services.prh.model.logging.MdcVariables.REQUEST_ID; -import static org.onap.dcaegen2.services.prh.model.logging.MdcVariables.X_INVOCATION_ID; -import static org.onap.dcaegen2.services.prh.model.logging.MdcVariables.X_ONAP_REQUEST_ID; - -import java.net.URI; -import java.util.UUID; -import org.onap.dcaegen2.services.prh.config.AaiClientConfiguration; -import org.onap.dcaegen2.services.prh.model.ConsumerDmaapModel; -import org.slf4j.MDC; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.util.DefaultUriBuilderFactory; -import reactor.core.publisher.Mono; - - -public class AaiProducerReactiveHttpClient { - - private WebClient webClient; - private final String aaiHost; - private final String aaiProtocol; - private final Integer aaiHostPortNumber; - private final String aaiBasePath; - private final String aaiPnfPath; - - /** - * Constructor of AaiProducerReactiveHttpClient. - * - * @param configuration - AAI producer configuration object - */ - public AaiProducerReactiveHttpClient(AaiClientConfiguration configuration) { - this.aaiHost = configuration.aaiHost(); - this.aaiProtocol = configuration.aaiProtocol(); - this.aaiHostPortNumber = configuration.aaiPort(); - this.aaiBasePath = configuration.aaiBasePath(); - this.aaiPnfPath = configuration.aaiPnfPath(); - } - - /** - * Function for calling AAI Http producer - patch request to AAI database. - * - * @param consumerDmaapModelMono - object which will be sent to AAI database - * @return status code of operation - */ - public Mono getAaiProducerResponse(ConsumerDmaapModel consumerDmaapModelMono) { - return patchAaiRequest(consumerDmaapModelMono); - } - - public AaiProducerReactiveHttpClient createAaiWebClient(WebClient webClient) { - this.webClient = webClient; - return this; - } - - private Mono patchAaiRequest(ConsumerDmaapModel dmaapModel) { - return - webClient.patch() - .uri(getUri(dmaapModel.getCorrelationId())) - .header(X_ONAP_REQUEST_ID, MDC.get(REQUEST_ID)) - .header(X_INVOCATION_ID, UUID.randomUUID().toString()) - .body(Mono.just(createJsonBody(dmaapModel)), String.class) - .exchange(); - } - - URI getUri(String pnfName) { - return new DefaultUriBuilderFactory().builder().scheme(aaiProtocol).host(aaiHost).port(aaiHostPortNumber) - .path(aaiBasePath + aaiPnfPath + "/" + pnfName).build(); - } -} \ No newline at end of file diff --git a/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactoryTest.java b/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactoryTest.java deleted file mode 100644 index bd976ab4..00000000 --- a/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/AaiReactiveWebClientFactoryTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcaegen2.services.prh.service; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import javax.net.ssl.SSLException; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.onap.dcaegen2.services.prh.config.AaiClientConfiguration; -import org.onap.dcaegen2.services.prh.ssl.SslFactory; - - -class AaiReactiveWebClientFactoryTest { - - private static final String TRUST_STORE_PATH = "trust_store_path"; - private static final String TRUST_STORE_PASS_PATH = "trust_store_pass_path"; - private static final String KEY_STORE_PATH = "key_store_path"; - private static final String KEY_STORE_PASS_PATH = "key_store_pass_path"; - private SslFactory sslFactory = mock(SslFactory.class); - private AaiClientConfiguration aaiClientConfiguration = mock(AaiClientConfiguration.class); - private AaiReactiveWebClientFactory aaiReactiveWebClientFactory; - - @Test - void shouldCreateWebClientWithSecureSslContext() throws SSLException { - givenEnabledAaiCertAuthConfiguration(); - aaiReactiveWebClientFactory = new AaiReactiveWebClientFactory(sslFactory, aaiClientConfiguration); - - Assertions.assertNotNull(aaiReactiveWebClientFactory.build()); - verify(sslFactory).createSecureContext(KEY_STORE_PATH, KEY_STORE_PASS_PATH, - TRUST_STORE_PATH, TRUST_STORE_PASS_PATH); - } - - @Test - void shouldCreateWebClientWithInsecureSslContext() throws SSLException { - when(aaiClientConfiguration.enableAaiCertAuth()).thenReturn(false); - aaiReactiveWebClientFactory = new AaiReactiveWebClientFactory(sslFactory, aaiClientConfiguration); - - Assertions.assertNotNull(aaiReactiveWebClientFactory.build()); - verify(sslFactory).createInsecureContext(); - } - - private void givenEnabledAaiCertAuthConfiguration() { - when(aaiClientConfiguration.enableAaiCertAuth()).thenReturn(true); - when(aaiClientConfiguration.trustStorePath()).thenReturn(TRUST_STORE_PATH); - when(aaiClientConfiguration.trustStorePasswordPath()).thenReturn(TRUST_STORE_PASS_PATH); - when(aaiClientConfiguration.keyStorePath()).thenReturn(KEY_STORE_PATH); - when(aaiClientConfiguration.keyStorePasswordPath()).thenReturn(KEY_STORE_PASS_PATH); - } -} \ No newline at end of file diff --git a/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClientTest.java b/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClientTest.java deleted file mode 100644 index de02d62e..00000000 --- a/prh-aai-client/src/test/java/org/onap/dcaegen2/services/prh/service/producer/AaiProducerReactiveHttpClientTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * PNF-REGISTRATION-HANDLER - * ================================================================================ - * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved. - * ================================================================================ - * 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. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.dcaegen2.services.prh.service.producer; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; -import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication; - -import java.net.URI; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.onap.dcaegen2.services.prh.config.AaiClientConfiguration; -import org.onap.dcaegen2.services.prh.model.ConsumerDmaapModel; -import org.onap.dcaegen2.services.prh.model.ConsumerDmaapModelForUnitTest; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClient.ResponseSpec; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -class AaiProducerReactiveHttpClientTest { - - private static final Integer SUCCESS_RESPONSE = 200; - private static AaiClientConfiguration aaiConfigurationMock = mock(AaiClientConfiguration.class); - - - private AaiProducerReactiveHttpClient aaiProducerReactiveHttpClient; - private WebClient webClient = mock(WebClient.class); - private ConsumerDmaapModel dmaapModel = spy(new ConsumerDmaapModelForUnitTest()); - private WebClient.RequestBodyUriSpec requestBodyUriSpec; - private ResponseSpec responseSpec; - - private Map aaiHeaders; - private ClientResponse clientResponse; - private Mono clientResponseMono; - - @BeforeEach - void setUp() { - setupHeaders(); - clientResponse = mock(ClientResponse.class); - clientResponseMono = Mono.just(clientResponse); - when(dmaapModel.getCorrelationId()).thenReturn("NOKnhfsadhff"); - when(aaiConfigurationMock.aaiHost()).thenReturn("54.45.33.2"); - when(aaiConfigurationMock.aaiProtocol()).thenReturn("https"); - when(aaiConfigurationMock.aaiPort()).thenReturn(1234); - when(aaiConfigurationMock.aaiUserName()).thenReturn("PRH"); - when(aaiConfigurationMock.aaiUserPassword()).thenReturn("PRH"); - when(aaiConfigurationMock.aaiBasePath()).thenReturn("/aai/v11"); - when(aaiConfigurationMock.aaiPnfPath()).thenReturn("/network/pnfs/pnf"); - when(aaiConfigurationMock.aaiHeaders()).thenReturn(aaiHeaders); - - aaiProducerReactiveHttpClient = new AaiProducerReactiveHttpClient(aaiConfigurationMock); - - webClient = spy(WebClient.builder() - .defaultHeaders(httpHeaders -> httpHeaders.setAll(aaiHeaders)) - .filter(basicAuthentication(aaiConfigurationMock.aaiUserName(), aaiConfigurationMock.aaiUserPassword())) - .build()); - - requestBodyUriSpec = mock(WebClient.RequestBodyUriSpec.class); - responseSpec = mock(ResponseSpec.class); - } - - @Test - void getAaiProducerResponse_shouldReturn200() { - //given - Mono expectedResult = Mono.just(SUCCESS_RESPONSE); - - //when - mockWebClientDependantObject(); - doReturn(expectedResult).when(responseSpec).bodyToMono(Integer.class); - aaiProducerReactiveHttpClient.createAaiWebClient(webClient); - - //then - StepVerifier.create(aaiProducerReactiveHttpClient.getAaiProducerResponse(dmaapModel)).expectSubscription() - .expectNextMatches(results -> { - Assertions.assertEquals(results, clientResponse); - return true; - }).verifyComplete(); - } - - - @Test - void getAppropriateUri_whenPassingCorrectedPathForPnf() { - Assertions.assertEquals(aaiProducerReactiveHttpClient.getUri("NOKnhfsadhff"), - URI.create("https://54.45.33.2:1234/aai/v11/network/pnfs/pnf/NOKnhfsadhff")); - } - - - private void setupHeaders() { - aaiHeaders = new HashMap<>(); - aaiHeaders.put("X-FromAppId", "PRH"); - aaiHeaders.put("X-TransactionId", "vv-temp"); - aaiHeaders.put("Accept", "application/json"); - aaiHeaders.put("Real-Time", "true"); - aaiHeaders.put("Content-Type", "application/merge-patch+json"); - } - - private void mockWebClientDependantObject() { - WebClient.RequestHeadersSpec requestHeadersSpec = mock(WebClient.RequestHeadersSpec.class); - when(webClient.patch()).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.uri((URI) any())).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.header(any(), any())).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.body(any(), (Class) any())).thenReturn(requestHeadersSpec); - when(requestHeadersSpec.exchange()).thenReturn(clientResponseMono); - } -} - diff --git a/prh-aai-client/src/test/resources/logback-test.xml b/prh-aai-client/src/test/resources/logback-test.xml deleted file mode 100644 index c1f00665..00000000 --- a/prh-aai-client/src/test/resources/logback-test.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -- cgit 1.2.3-korg