Add send requests to VES via HTTPS in Mass PNF Simulator 63/116063/4
authorEli Halych <eli.halych@gmail.com>
Thu, 3 Dec 2020 09:56:50 +0000 (09:56 +0000)
committerEli Halych <illia.halych@t-mobile.pl>
Fri, 4 Dec 2020 00:42:11 +0000 (00:42 +0000)
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:
test/mocks/masspnfsim/MassPnfSim.py
test/mocks/masspnfsim/conftest.py
test/mocks/masspnfsim/pnf-sim-lightweight/pom.xml
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/logging/MDCVariables.java
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/rest/SimulatorController.java
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/Simulator.java
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImpl.java [deleted file]
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapter.java [moved from test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapter.java with 96% similarity]
test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java [new file with mode: 0644]
test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/rest/SimulatorControllerTest.java
test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/SimulatorTest.java
test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/HttpClientAdapterImplTest.java [deleted file]
test/mocks/masspnfsim/pnf-sim-lightweight/src/test/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImplTest.java [new file with mode: 0644]
test/mocks/masspnfsim/test_lifecycle.py
test/mocks/masspnfsim/test_settings.py

index 01b2489..c9c84e8 100755 (executable)
@@ -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:
index e6ee056..3d9dbcc 100644 (file)
@@ -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):
index abfa615..eab5af2 100644 (file)
@@ -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>
index 8f6fe3b..e479b4a 100644 (file)
@@ -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() {
     }
index 2a685ea..7bb646c 100644 (file)
@@ -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");
index ba11476..725fe43 100644 (file)
@@ -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 (file)
index f0c9917..0000000
+++ /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/RestTemplateAdapterImpl.java b/test/mocks/masspnfsim/pnf-sim-lightweight/src/main/java/org/onap/pnfsimulator/simulator/client/RestTemplateAdapterImpl.java
new file mode 100644 (file)
index 0000000..e082637
--- /dev/null
@@ -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
index d1db8d5..215cee0 100644 (file)
@@ -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)
index fb812b5..1f15c01 100644 (file)
@@ -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 (file)
index a4fb9eb..0000000
+++ /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 (file)
index 0000000..d423222
--- /dev/null
@@ -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();
+    }
+}
index 1309ef0..1e040d3 100644 (file)
@@ -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'])
index c8c2353..fe88e31 100644 (file)
@@ -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-'