diff options
author | 2020-12-03 09:56:50 +0000 | |
---|---|---|
committer | 2020-12-04 00:42:11 +0000 | |
commit | a579a48948f0b61bb9d98e1591d1fe727a550dbb (patch) | |
tree | 7abd52518d5f5233a8e48440b7c6f952edbe7d72 /test/mocks/masspnfsim/pnf-sim-lightweight/src/main | |
parent | 59305b4e52464023a6350a1d69ced2eb23dee73e (diff) |
Add send requests to VES via HTTPS in Mass PNF Simulator
Details:
- Previously allowed only HTTP.
- HTTPS support added since VES accepts HTTPS and throws 400 Bad Request on HTTP.
- Added autogenerating Basic Authorization token based on user:password in Base64 to access real VES together with HTTPS.
- For this reason, simple HttpClient became part of RestTemplate that can ignore certificate checks for HTTPS when connecting to VES.
- Adjusted test cases.
Issue-ID: INT-1799
Signed-off-by: Eli Halych <illia.halych@t-mobile.pl>
Change-Id: I69eaeb4b10f903c3a3aa880dbb787034da4c30bb
Diffstat (limited to 'test/mocks/masspnfsim/pnf-sim-lightweight/src/main')
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java | 1 | ||||
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java | 3 | ||||
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java | 12 | ||||
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java | 89 | ||||
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapter.java (renamed from test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapter.java) | 2 | ||||
-rw-r--r-- | test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java | 155 |
6 files changed, 166 insertions, 96 deletions
diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java index 8f6fe3b66..e479b4a6b 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java @@ -29,6 +29,7 @@ public final class MDCVariables { public static final String INSTANCE_UUID = "InstanceUUID"; public static final String RESPONSE_CODE = "ResponseCode"; public static final String SERVICE_NAME = "ServiceName"; + public static final String AUTHORIZATION = "Authorization"; private MDCVariables() { } diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java index 2a685eac8..7bb646c30 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java @@ -23,6 +23,7 @@ import static org.onap.pnfsimulator.logging.MDCVariables.REQUEST_ID; import static org.onap.pnfsimulator.logging.MDCVariables.RESPONSE_CODE; import static org.onap.pnfsimulator.logging.MDCVariables.SERVICE_NAME; import static org.onap.pnfsimulator.logging.MDCVariables.X_INVOCATION_ID; +import static org.onap.pnfsimulator.logging.MDCVariables.AUTHORIZATION; import static org.onap.pnfsimulator.logging.MDCVariables.X_ONAP_REQUEST_ID; import static org.onap.pnfsimulator.message.MessageConstants.COMMON_EVENT_HEADER_PARAMS; import static org.onap.pnfsimulator.message.MessageConstants.SIMULATOR_PARAMS; @@ -84,6 +85,7 @@ public class SimulatorController { public ResponseEntity start(@RequestHeader HttpHeaders headers, @RequestBody String message) { MDC.put(REQUEST_ID, headers.getFirst(X_ONAP_REQUEST_ID)); MDC.put(INVOCATION_ID, headers.getFirst(X_INVOCATION_ID)); + MDC.put(AUTHORIZATION, headers.getFirst(AUTHORIZATION)); MDC.put(INSTANCE_UUID, UUID.randomUUID().toString()); MDC.put(SERVICE_NAME, "/simulator/start"); LOGGER.info(ENTRY, "Simulator starting"); @@ -142,6 +144,7 @@ public class SimulatorController { public ResponseEntity startmassmode(@RequestHeader HttpHeaders headers, @RequestBody String message) { MDC.put(REQUEST_ID, headers.getFirst(X_ONAP_REQUEST_ID)); MDC.put(INVOCATION_ID, headers.getFirst(X_INVOCATION_ID)); + MDC.put(AUTHORIZATION, headers.getFirst(AUTHORIZATION)); MDC.put(INSTANCE_UUID, UUID.randomUUID().toString()); MDC.put(SERVICE_NAME, "/simulator/start"); LOGGER.info(ENTRY, "Simulator starting"); diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java index ba114760f..725fe4336 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java @@ -27,8 +27,8 @@ import java.util.Optional; import org.json.JSONObject; import org.onap.pnfsimulator.FileProvider; import org.onap.pnfsimulator.message.MessageProvider; -import org.onap.pnfsimulator.simulator.client.HttpClientAdapter; -import org.onap.pnfsimulator.simulator.client.HttpClientAdapterImpl; +import org.onap.pnfsimulator.simulator.client.RestTemplateAdapter; +import org.onap.pnfsimulator.simulator.client.RestTemplateAdapterImpl; import org.onap.pnfsimulator.simulator.validation.JSONValidator; import org.onap.pnfsimulator.simulator.validation.NoRopFilesException; import org.onap.pnfsimulator.simulator.validation.ValidationException; @@ -45,7 +45,7 @@ public class Simulator extends Thread { private Map<String, String> contextMap = MDC.getCopyOfContextMap(); private boolean isEndless; private String vesUrl; - private HttpClientAdapter httpClient; + private RestTemplateAdapter httpClient; private JSONObject messageBody; private Duration duration; private Duration interval; @@ -124,7 +124,7 @@ public class Simulator extends Thread { public static class Builder { private String vesUrl; - private HttpClientAdapter httpClient; + private RestTemplateAdapter httpClient; //private JSONObject messageBody; private Duration duration; private Duration interval; @@ -136,7 +136,7 @@ public class Simulator extends Thread { private Builder() { this.vesUrl = ""; - this.httpClient = new HttpClientAdapterImpl(); + this.httpClient = new RestTemplateAdapterImpl(); //this.messageBody = new JSONObject(); this.duration = Duration.ZERO; this.interval = Duration.ZERO; @@ -148,7 +148,7 @@ public class Simulator extends Thread { return this; } - public Builder withCustomHttpClientAdapter(HttpClientAdapter httpClient) { + public Builder withCustomRestTemplateAdapter(RestTemplateAdapter httpClient) { this.httpClient = httpClient; return this; } diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java deleted file mode 100644 index f0c9917f5..000000000 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java +++ /dev/null @@ -1,89 +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.pnfsimulator.simulator.client; - -import static org.onap.pnfsimulator.logging.MDCVariables.REQUEST_ID; -import static org.onap.pnfsimulator.logging.MDCVariables.X_INVOCATION_ID; -import static org.onap.pnfsimulator.logging.MDCVariables.X_ONAP_REQUEST_ID; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.UUID; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.slf4j.Marker; -import org.slf4j.MarkerFactory; - -public class HttpClientAdapterImpl implements HttpClientAdapter { - - private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientAdapterImpl.class); - private static final String CONTENT_TYPE = "Content-Type"; - private static final String APPLICATION_JSON = "application/json"; - private final Marker INVOKE = MarkerFactory.getMarker("INVOKE"); - private static final RequestConfig CONFIG = RequestConfig.custom() - .setConnectTimeout(1000) - .setConnectionRequestTimeout(1000) - .setSocketTimeout(1000) - .build(); - - private HttpClient client; - - public HttpClientAdapterImpl() { - this.client = HttpClientBuilder - .create() - .setDefaultRequestConfig(CONFIG) - .build(); - } - - @Override - public void send(String content, String url) { - try { - HttpPost request = createRequest(content, url); - HttpResponse response = client.execute(request); - EntityUtils.consumeQuietly(response.getEntity()); - LOGGER.info(INVOKE, "Message sent, ves response code: {}", response.getStatusLine()); - } catch (IOException e) { - LOGGER.warn("Error sending message to ves: {}", e.getMessage()); - } - } - - HttpClientAdapterImpl(HttpClient client) { - this.client = client; - } - - private HttpPost createRequest(String content, String url) throws UnsupportedEncodingException { - HttpPost request = new HttpPost(url); - StringEntity stringEntity = new StringEntity(content); - request.addHeader(CONTENT_TYPE, APPLICATION_JSON); - request.addHeader(X_ONAP_REQUEST_ID, MDC.get(REQUEST_ID)); - request.addHeader(X_INVOCATION_ID, UUID.randomUUID().toString()); - request.setEntity(stringEntity); - return request; - } -}
\ No newline at end of file diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapter.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapter.java index 47f2e3112..92e66b47e 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapter.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapter.java @@ -20,7 +20,7 @@ package org.onap.pnfsimulator.simulator.client; -public interface HttpClientAdapter { +public interface RestTemplateAdapter { void send(String content, String url); } diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java new file mode 100644 index 000000000..e08263745 --- /dev/null +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java @@ -0,0 +1,155 @@ +/* + * ============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.pnfsimulator.simulator.client; + +import static org.onap.pnfsimulator.logging.MDCVariables.REQUEST_ID; +import static org.onap.pnfsimulator.logging.MDCVariables.X_INVOCATION_ID; +import static org.onap.pnfsimulator.logging.MDCVariables.X_ONAP_REQUEST_ID; +import static org.onap.pnfsimulator.logging.MDCVariables.AUTHORIZATION; + +import org.springframework.web.client.ResourceAccessException; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpHeaders; + +import java.util.UUID; +import org.springframework.web.client.HttpClientErrorException; +import org.apache.http.client.config.RequestConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +public class RestTemplateAdapterImpl implements RestTemplateAdapter { + + private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateAdapterImpl.class); + private static final String CONTENT_TYPE = "Content-Type"; + private static final String APPLICATION_JSON = "application/json"; + private final Marker INVOKE = MarkerFactory.getMarker("INVOKE"); + private static final RequestConfig CONFIG = RequestConfig.custom() + .setConnectTimeout(1000) + .setConnectionRequestTimeout(1000) + .setSocketTimeout(1000) + .build(); + + private RestTemplate restTemplate; + + public RestTemplateAdapterImpl() { + try { + this.restTemplate = createRestTemplate(); + } catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException ex) { + LOGGER.warn("Error while creating a RestTemplate object: {}", ex.getMessage()); + } + } + + RestTemplateAdapterImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public void send(String content, String url) { + try { + HttpEntity<String> entity = createPostEntity(content); + ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); + LOGGER.info(INVOKE, "Message sent, ves response code: {}", response.getStatusCode()); + } catch (HttpClientErrorException codeEx) { + LOGGER.warn("Response body: ", codeEx.getResponseBodyAsString()); + LOGGER.warn("Error sending message to ves: {}", codeEx.getMessage()); + LOGGER.warn("URL: {}", url); + } catch (ResourceAccessException ioEx) { + LOGGER.warn("The URL cannot be reached: {}", ioEx.getMessage()); + LOGGER.warn("URL: {}", url); + } + } + + private CloseableHttpClient createClient() + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + + TrustManager[] trustAllCerts = new TrustManager[] { + new X509TrustManager() { + + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, + String authType) {} + + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, + String authType) {} + } + }; + + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init( + null, + trustAllCerts, + new java.security.SecureRandom() + ); + + CloseableHttpClient httpClient = HttpClients + .custom() + .setSSLContext(sslContext) + .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build(); + + return httpClient; + } + + private RestTemplate createRestTemplate() + throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + + CloseableHttpClient client = createClient(); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(client); + + return new RestTemplate(requestFactory); + + } + + private HttpEntity createPostEntity(String content) { + + HttpHeaders headers = new HttpHeaders(); + headers.set(CONTENT_TYPE, APPLICATION_JSON); + headers.set(AUTHORIZATION, MDC.get(AUTHORIZATION)); + headers.set(X_ONAP_REQUEST_ID, MDC.get(REQUEST_ID)); + headers.set(X_INVOCATION_ID, UUID.randomUUID().toString()); + + return new HttpEntity<>(content, headers); + + } +}
\ No newline at end of file |