diff options
author | Eli Halych <eli.halych@gmail.com> | 2020-12-03 09:56:50 +0000 |
---|---|---|
committer | Eli Halych <illia.halych@t-mobile.pl> | 2020-12-04 00:42:11 +0000 |
commit | a579a48948f0b61bb9d98e1591d1fe727a550dbb (patch) | |
tree | 7abd52518d5f5233a8e48440b7c6f952edbe7d72 | |
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
15 files changed, 343 insertions, 186 deletions
diff --git a/test/mocks/masspnfsim/MassPnfSim.py b/test/mocks/masspnfsim/MassPnfSim.py index 01b2489c1..c9c84e8c9 100755 --- a/test/mocks/masspnfsim/MassPnfSim.py +++ b/test/mocks/masspnfsim/MassPnfSim.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 import logging +import base64 from subprocess import run, CalledProcessError import argparse import ipaddress @@ -35,6 +36,14 @@ def validate_ip(ip): else: return ip_valid +def get_auth_token_base64(plain): + '''Converts user:password to Base64.''' + basic_auth_plain = plain + basic_auth_bytes = basic_auth_plain.encode('ascii') + basic_auth_base64_bytes = base64.b64encode(basic_auth_bytes) + basic_auth_base64 = basic_auth_base64_bytes.decode('ascii') + return basic_auth_base64 + def get_parser(): '''Process input arguments''' @@ -62,6 +71,8 @@ def get_parser(): # Trigger command parser parser_trigger = subparsers.add_parser('trigger', help='Trigger one single VES event from each simulator') parser_trigger.add_argument('--count', help='Instance count to trigger', type=int, metavar='INT', default=0) + parser_trigger.add_argument('--user', help='VES auth username', type=str, metavar='USERNAME') + parser_trigger.add_argument('--password', help='VES auth password', type=str, metavar='PASSWORD') # Stop-simulator command parser parser_stopsimulator = subparsers.add_parser('stop_simulator', help='Stop sending PNF registration messages') parser_stopsimulator.add_argument('--count', help='Instance count to stop', type=int, metavar='INT', default=0) @@ -71,6 +82,8 @@ def get_parser(): metavar='INT', required=True) parser_triggerstart.add_argument('--triggerend', help='Last simulator id to trigger', type=int, metavar='INT', required=True) + parser_triggerstart.add_argument('--user', help='VES auth username', type=str, metavar='USERNAME') + parser_triggerstart.add_argument('--password', help='VES auth password', type=str, metavar='PASSWORD') # Status command parser parser_status = subparsers.add_parser('status', help='Status') parser_status.add_argument('--count', help='Instance count to show status for', type=int, metavar='INT', default=0) @@ -137,7 +150,7 @@ class MassPnfSim: self.logger = logging.getLogger(__name__) self.logger.setLevel(self.log_lvl) self.sim_dirname_pattern = "pnf-sim-lw-" - self.mvn_build_cmd = 'mvn clean package docker:build -Dcheckstyle.skip' + self.mvn_build_cmd = 'mvn clean package docker:build -Dcheckstyle.skip ' self.docker_compose_status_cmd = 'docker-compose ps' def _run_cmd(self, cmd, dir_context='.'): @@ -418,11 +431,17 @@ class MassPnfSim: sim_ip = self._get_sim_instance_data(i) self.logger.info(f'Triggering {self.sim_dirname_pattern}{i} instance:') self.logger.info(f' PNF-Sim IP: {sim_ip}') + # create a Basic auth token + plaintext_auth = f"{args.user}:{args.password}" + basic_auth_base64 = get_auth_token_base64(plaintext_auth) + basic_auth_token = f"Basic {basic_auth_base64}" + self.logger.info((basic_auth_base64)) # setup req headers req_headers = { "Content-Type": "application/json", "X-ONAP-RequestID": "123", - "X-InvocationID": "456" + "X-InvocationID": "456", + "Authorization": basic_auth_token } self.logger.debug(f' Request headers: {req_headers}') try: diff --git a/test/mocks/masspnfsim/conftest.py b/test/mocks/masspnfsim/conftest.py index e6ee05667..3d9dbcc2a 100644 --- a/test/mocks/masspnfsim/conftest.py +++ b/test/mocks/masspnfsim/conftest.py @@ -12,8 +12,8 @@ def args_bootstrap(parser): return parser.parse_args(['bootstrap', '--count', str(SIM_INSTANCES), '--urlves', URLVES, '--ipfileserver', IPFILESERVER, '--typefileserver', TYPEFILESERVER, '--ipstart', - IPSTART, '--user', FILESERVER_USER, '--password', - FILESERVER_PASSWORD]) + IPSTART, '--user', USER, '--password', + PASSWORD]) @pytest.fixture(scope="module") def args_start(parser): @@ -29,11 +29,16 @@ def args_status(parser): @pytest.fixture(scope="module") def args_trigger(parser): - return parser.parse_args(['trigger']) + return parser.parse_args(['trigger', '--user', USER, '--password', PASSWORD]) @pytest.fixture(scope="module") def args_trigger_custom(parser): - return parser.parse_args(['trigger_custom', '--triggerstart', '0', '--triggerend', str(SIM_INSTANCES-1)]) + return parser.parse_args([ + 'trigger_custom', + '--triggerstart', '0', + '--triggerend', str(SIM_INSTANCES-1), + '--user', USER, + '--password', PASSWORD]) @pytest.fixture(scope="module") def args_stop_simulator(parser): diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml b/test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml index abfa615cc..eab5af27b 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml @@ -57,7 +57,7 @@ <artifactId>jackson-dataformat-yaml</artifactId> <version>2.9.8</version> </dependency> - + <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> 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 diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java index d1db8d55c..215cee0b0 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java @@ -46,7 +46,7 @@ import org.mockito.MockitoAnnotations; import org.onap.pnfsimulator.FileProvider; import org.onap.pnfsimulator.simulator.Simulator; import org.onap.pnfsimulator.simulator.SimulatorFactory; -import org.onap.pnfsimulator.simulator.client.HttpClientAdapter; +import org.onap.pnfsimulator.simulator.client.RestTemplateAdapter; import org.onap.pnfsimulator.simulator.validation.JSONValidator; import org.onap.pnfsimulator.simulator.validation.NoRopFilesException; import org.onap.pnfsimulator.simulator.validation.ValidationException; @@ -137,7 +137,7 @@ class SimulatorControllerTest { private Simulator createEndlessSimulator() { return spy(Simulator.builder() - .withCustomHttpClientAdapter(mock(HttpClientAdapter.class)) + .withCustomRestTemplateAdapter(mock(RestTemplateAdapter.class)) .withCommonEventHeaderParams(VALID_COMMON_EVENT_HEADER_PARAMS) .withPnfRegistrationParams(Optional.empty()) .withNotificationParams(VALID_NOTIFICATION_PARAMS) diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java index fb812b598..1f15c018d 100644 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java @@ -45,7 +45,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import org.mockito.Mockito; import org.onap.pnfsimulator.FileProvider; -import org.onap.pnfsimulator.simulator.client.HttpClientAdapter; +import org.onap.pnfsimulator.simulator.client.RestTemplateAdapter; import org.onap.pnfsimulator.simulator.validation.NoRopFilesException; import org.onap.pnfsimulator.simulator.validation.ValidationException; @@ -87,16 +87,16 @@ public class SimulatorTest { void simulator_should_stop_when_interrupted() { createSampleFileList(); - HttpClientAdapter httpClientMock = Mockito.mock(HttpClientAdapter.class); + RestTemplateAdapter httpClientMock = Mockito.mock(RestTemplateAdapter.class); Simulator simulator = Simulator.builder() .withInterval(Duration.ofSeconds(1)) - .withCustomHttpClientAdapter(httpClientMock) + .withCustomRestTemplateAdapter(httpClientMock) .withCommonEventHeaderParams(VALID_COMMON_EVENT_HEADER_PARAMS) .withPnfRegistrationParams(Optional.empty()) .withNotificationParams(VALID_NOTIFICATION_PARAMS) .withVesUrl(TEST_VES_URL) .withXnfUrl(TEST_XNF_URL) - .withCustomHttpClientAdapter(httpClientMock) + .withCustomRestTemplateAdapter(httpClientMock) .withFileProvider(fileProvider).build(); simulator.start(); @@ -182,7 +182,7 @@ public class SimulatorTest { void simulator_should_send_fileready_message() { createSampleFileList(); - HttpClientAdapter httpClientMock = Mockito.mock(HttpClientAdapter.class); + RestTemplateAdapter httpClientMock = Mockito.mock(RestTemplateAdapter.class); Simulator simulator = Simulator.builder() .withDuration(Duration.ofMillis(100)) .withInterval(Duration.ofMillis(100)) @@ -191,7 +191,7 @@ public class SimulatorTest { .withNotificationParams(VALID_NOTIFICATION_PARAMS) .withVesUrl(TEST_VES_URL) .withXnfUrl(TEST_XNF_URL) - .withCustomHttpClientAdapter(httpClientMock) + .withCustomRestTemplateAdapter(httpClientMock) .withFileProvider(fileProvider).build(); simulator.run(); Exception e = simulator.getThrownException(); diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImplTest.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImplTest.java deleted file mode 100644 index a4fb9eb04..000000000 --- a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImplTest.java +++ /dev/null @@ -1,71 +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.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.MockitoAnnotations.initMocks; - -import java.io.IOException; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; - -class HttpClientAdapterImplTest { - - private HttpClientAdapter adapter; - - @Mock - private HttpClient httpClient; - @Mock - private HttpResponse httpResponse; - - @BeforeEach - void setup() { - initMocks(this); - adapter = new HttpClientAdapterImpl(httpClient); - } - - @Test - void send_should_successfully_send_request_given_valid_url() throws IOException { - doReturn(httpResponse).when(httpClient).execute(any()); - - adapter.send("test-msg", "http://valid-url"); - - verify(httpClient).execute(any()); - verify(httpResponse).getStatusLine(); - } - - @Test - void send_should_not_send_request_given_invalid_url() throws IOException { - doThrow(new IOException("test")).when(httpClient).execute(any()); - - adapter.send("test-msg", "http://invalid-url"); - - verify(httpClient).execute(any()); - verify(httpResponse, never()).getStatusLine(); - } -} diff --git a/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImplTest.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImplTest.java new file mode 100644 index 000000000..d42322232 --- /dev/null +++ b/test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImplTest.java @@ -0,0 +1,134 @@ +/* + * ============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 org.mockito.Mock; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.notNull; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; + +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class RestTemplateAdapterImplTest { + + private RestTemplateAdapter adapter; + + @Mock + private RestTemplate restTemplate; + @Mock + ResponseEntity<String> response; + + @BeforeEach + void setup() { + initMocks(this); + adapter = new RestTemplateAdapterImpl(restTemplate); + } + + @Test + void send_should_successfully_send_request_given_valid_http_url() + throws HttpClientErrorException { + + String content = "test-msg"; + String urlHttp = "http://valid-url"; + + when( + restTemplate.postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ) + ).thenReturn(response); + + adapter.send(content, urlHttp); + + verify( + restTemplate, times(1)).postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ); + verify(response).getStatusCode(); + } + + @Test + void send_should_successfully_send_request_given_valid_https_url() + throws HttpClientErrorException { + + String content = "test-msg"; + String urlHttps = "https://valid-url"; + + when( + restTemplate.postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ) + ).thenReturn(response); + + adapter.send(content, urlHttps); + + verify( + restTemplate, times(1)).postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ); + verify(response).getStatusCode(); + } + + @Test + void send_should_not_send_request_given_invalid_url() + throws HttpClientErrorException { + + String content = "test-msg"; + String url = "http://invalid-url"; + + doThrow( + new HttpClientErrorException(HttpStatus.BAD_REQUEST)).when( + restTemplate).postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ); + + adapter.send(content, url); + + verify( + restTemplate, times(1)).postForEntity( + (String) notNull(), + (HttpEntity) notNull(), + eq(String.class) + ); + verify(response, never()).getStatusCode(); + } +} diff --git a/test/mocks/masspnfsim/test_lifecycle.py b/test/mocks/masspnfsim/test_lifecycle.py index 1309ef077..1e040d32e 100644 --- a/test/mocks/masspnfsim/test_lifecycle.py +++ b/test/mocks/masspnfsim/test_lifecycle.py @@ -50,8 +50,8 @@ def test_bootstrap(args_bootstrap, caplog): yml = load(f, Loader=SafeLoader) assert URLVES == yml['urlves'] assert TYPEFILESERVER == yml['typefileserver'] - assert f'sftp://{FILESERVER_USER}:{FILESERVER_PASSWORD}@{IPFILESERVER}:{start_port + 1}' in yml['urlsftp'] - assert f'ftps://{FILESERVER_USER}:{FILESERVER_PASSWORD}@{IPFILESERVER}:{start_port + 2}' in yml['urlftps'] + assert f'sftp://{USER}:{PASSWORD}@{IPFILESERVER}:{start_port + 1}' in yml['urlsftp'] + assert f'ftps://{USER}:{PASSWORD}@{IPFILESERVER}:{start_port + 2}' in yml['urlftps'] assert str(ip_address(IPSTART) + ip_offset + instance_ip_offset) == yml['ippnfsim'] start_port += 2 print(yml['ippnfsim']) diff --git a/test/mocks/masspnfsim/test_settings.py b/test/mocks/masspnfsim/test_settings.py index c8c235367..fe88e319a 100644 --- a/test/mocks/masspnfsim/test_settings.py +++ b/test/mocks/masspnfsim/test_settings.py @@ -2,8 +2,8 @@ SIM_INSTANCES = 2 URLVES = 'http://127.0.0.1:10000/eventListener/v7' IPFILESERVER = '127.0.0.1' TYPEFILESERVER = 'sftp' -FILESERVER_USER = 'testuser' -FILESERVER_PASSWORD = 'testpassword' +USER = 'testuser' +PASSWORD = 'testpassword' IPSTART = '10.11.0.1' INSTANCE_CONFIG = 'config/config.yml' PNF_SIM_CONTAINER_NAME = 'pnf-simulator-' |