aboutsummaryrefslogtreecommitdiffstats
path: root/test/mocks
diff options
context:
space:
mode:
authorEli Halych <eli.halych@gmail.com>2020-12-03 09:56:50 +0000
committerEli Halych <illia.halych@t-mobile.pl>2020-12-04 00:42:11 +0000
commita579a48948f0b61bb9d98e1591d1fe727a550dbb (patch)
tree7abd52518d5f5233a8e48440b7c6f952edbe7d72 /test/mocks
parent59305b4e52464023a6350a1d69ced2eb23dee73e (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')
-rwxr-xr-xtest/mocks/masspnfsim/MassPnfSim.py23
-rw-r--r--test/mocks/masspnfsim/conftest.py13
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml2
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java1
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java3
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java12
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java89
-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.java155
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java4
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java12
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImplTest.java71
-rw-r--r--test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImplTest.java134
-rw-r--r--test/mocks/masspnfsim/test_lifecycle.py4
-rw-r--r--test/mocks/masspnfsim/test_settings.py4
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-'