Fixed AAI ModelLoader fails to connect to aai-babel

Issue-ID: AAI-3533
Signed-off-by: Niharika Sharma <niharika.sharma@amdocs.com>
Change-Id: I121263b0be39b13109782e0b5db02d3a36650d75
diff --git a/pom.xml b/pom.xml
index d9946df..226429d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
     ============LICENSE_END=========================================================
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
@@ -60,7 +60,7 @@
 		<sdc-distribution-client.version>1.4.1</sdc-distribution-client.version>
 		<logback.version>1.2.3</logback.version>
 		<!-- docker related properties -->
-		<docker.fabric.version>0.28.0</docker.fabric.version>
+		<docker.fabric.version>0.39.0</docker.fabric.version>
 		<aai.docker.version>1.0.0</aai.docker.version>
 		<aai.build.directory>${project.build.directory}/${project.artifactId}-${project.version}-build/</aai.build.directory>
 		<aai.docker.namespace>onap</aai.docker.namespace>
@@ -224,10 +224,10 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 			<exclusions>
-			  <exclusion>
-			    <groupId>org.springframework.boot</groupId>
-			    <artifactId>spring-boot-starter-tomcat</artifactId>
-			  </exclusion>
+				<exclusion>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-starter-tomcat</artifactId>
+				</exclusion>
 			</exclusions>
 		</dependency>
 		<dependency>
@@ -458,143 +458,143 @@
 			     whole section -->
 
 			<plugin>
-			  <groupId>org.jacoco</groupId>
-			  <artifactId>jacoco-maven-plugin</artifactId>
-			  <version>${jacoco.version}</version>
-			  <configuration>
-			    <!-- Note: This exclusion list should match <sonar.exclusions> property
-				 above -->
-			    <excludes>
-			      <exclude>**/gen/**</exclude>
-			      <exclude>**/generated-sources/**</exclude>
-			      <exclude>**/yang-gen/**</exclude>
-			      <exclude>**/pax/**</exclude>
-			    </excludes>
-			  </configuration>
-			  <executions>
-			    <!-- Prepares the property pointing to the JaCoCo runtime agent which
-				 is passed as VM argument when Maven the Surefire plugin is executed. -->
-			    <execution>
-			      <id>pre-unit-test</id>
-			      <goals>
-				<goal>prepare-agent</goal>
-			      </goals>
-			      <configuration>
-				<!-- Sets the path to the file which contains the execution data
-				     . -->
-				<destFile>${project.build.directory}/code-coverage/jacoco-ut.exec</destFile>
-				<!-- Sets the name of the property containing the settings for JaCoCo
-				     runtime agent. -->
-				<propertyName>surefireArgLine</propertyName>
-			      </configuration>
-			    </execution>
-			    <!-- Ensures that the code coverage report for unit tests is created
-				 after unit tests have been run. -->
-			    <execution>
-			      <id>post-unit-test</id>
-			      <phase>test</phase>
-			      <goals>
-				<goal>report</goal>
-			      </goals>
-			      <configuration>
-				<!-- Sets the path to the file which contains the execution data
-				     . -->
-				<dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
-				<!-- Sets the output directory for the code coverage report. -->
-				<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
-			      </configuration>
-			    </execution>
-			    <execution>
-			      <id>pre-integration-test</id>
-			      <phase>pre-integration-test</phase>
-			      <goals>
-				<goal>prepare-agent</goal>
-			      </goals>
-			      <configuration>
-				<!-- Sets the path to the file which contains the execution data
-				     . -->
-				<destFile>${project.build.directory}/code-coverage/jacoco-it.exec</destFile>
-				<!-- Sets the name of the property containing the settings for JaCoCo
-				     runtime agent. -->
-				<propertyName>failsafeArgLine</propertyName>
-			      </configuration>
-			    </execution>
-			    <!-- Ensures that the code coverage report for integration tests after
-				 integration tests have been run. -->
-			    <execution>
-			      <id>post-integration-test</id>
-			      <phase>post-integration-test</phase>
-			      <goals>
-				<goal>report</goal>
-			      </goals>
-			      <configuration>
-				<!-- Sets the path to the file which contains the execution data
-				     . -->
-				<dataFile>${project.build.directory}/code-coverage/jacoco-it.exec</dataFile>
-				<!-- Sets the output directory for the code coverage report. -->
-				<outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
-			      </configuration>
-			    </execution>
-			    <execution>
-			      <id>default-check</id>
-			      <goals>
-				<goal>check</goal>
-			      </goals>
-			      <configuration>
-				<dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
-				<rules>
-				  <rule implementation="org.jacoco.maven.RuleConfiguration">
-				    <element>BUNDLE</element>
-				    <limits>
-				      <limit implementation="org.jacoco.report.check.Limit">
-					<counter>LINE</counter>
-					<value>COVEREDRATIO</value>
-					<minimum>${jacoco.line.coverage.limit}</minimum>
-				      </limit>
-				    </limits>
-				  </rule>
-				</rules>
-			      </configuration>
-			    </execution>
-			  </executions>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>${jacoco.version}</version>
+				<configuration>
+					<!-- Note: This exclusion list should match <sonar.exclusions> property
+                     above -->
+					<excludes>
+						<exclude>**/gen/**</exclude>
+						<exclude>**/generated-sources/**</exclude>
+						<exclude>**/yang-gen/**</exclude>
+						<exclude>**/pax/**</exclude>
+					</excludes>
+				</configuration>
+				<executions>
+					<!-- Prepares the property pointing to the JaCoCo runtime agent which
+                     is passed as VM argument when Maven the Surefire plugin is executed. -->
+					<execution>
+						<id>pre-unit-test</id>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+						<configuration>
+							<!-- Sets the path to the file which contains the execution data
+                                 . -->
+							<destFile>${project.build.directory}/code-coverage/jacoco-ut.exec</destFile>
+							<!-- Sets the name of the property containing the settings for JaCoCo
+                                 runtime agent. -->
+							<propertyName>surefireArgLine</propertyName>
+						</configuration>
+					</execution>
+					<!-- Ensures that the code coverage report for unit tests is created
+                     after unit tests have been run. -->
+					<execution>
+						<id>post-unit-test</id>
+						<phase>test</phase>
+						<goals>
+							<goal>report</goal>
+						</goals>
+						<configuration>
+							<!-- Sets the path to the file which contains the execution data
+                                 . -->
+							<dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
+							<!-- Sets the output directory for the code coverage report. -->
+							<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
+						</configuration>
+					</execution>
+					<execution>
+						<id>pre-integration-test</id>
+						<phase>pre-integration-test</phase>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+						<configuration>
+							<!-- Sets the path to the file which contains the execution data
+                                 . -->
+							<destFile>${project.build.directory}/code-coverage/jacoco-it.exec</destFile>
+							<!-- Sets the name of the property containing the settings for JaCoCo
+                                 runtime agent. -->
+							<propertyName>failsafeArgLine</propertyName>
+						</configuration>
+					</execution>
+					<!-- Ensures that the code coverage report for integration tests after
+                     integration tests have been run. -->
+					<execution>
+						<id>post-integration-test</id>
+						<phase>post-integration-test</phase>
+						<goals>
+							<goal>report</goal>
+						</goals>
+						<configuration>
+							<!-- Sets the path to the file which contains the execution data
+                                 . -->
+							<dataFile>${project.build.directory}/code-coverage/jacoco-it.exec</dataFile>
+							<!-- Sets the output directory for the code coverage report. -->
+							<outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
+						</configuration>
+					</execution>
+					<execution>
+						<id>default-check</id>
+						<goals>
+							<goal>check</goal>
+						</goals>
+						<configuration>
+							<dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
+							<rules>
+								<rule implementation="org.jacoco.maven.RuleConfiguration">
+									<element>BUNDLE</element>
+									<limits>
+										<limit implementation="org.jacoco.report.check.Limit">
+											<counter>LINE</counter>
+											<value>COVEREDRATIO</value>
+											<minimum>${jacoco.line.coverage.limit}</minimum>
+										</limit>
+									</limits>
+								</rule>
+							</rules>
+						</configuration>
+					</execution>
+				</executions>
 			</plugin>
 			<plugin>
-			  <groupId>org.apache.maven.plugins</groupId>
-			  <artifactId>maven-surefire-plugin</artifactId>
-			  <version>3.0.0-M4</version>
-			  <configuration>
-			    <!-- Sets the VM argument line used when unit tests are run. -->
-			    <argLine>${surefireArgLine}</argLine>
-			    <!-- Excludes integration tests when unit tests are run. -->
-			    <excludes>
-			      <exclude>**/IT*.java</exclude>
-			    </excludes>
-			  </configuration>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.0.0-M4</version>
+				<configuration>
+					<!-- Sets the VM argument line used when unit tests are run. -->
+					<argLine>${surefireArgLine}</argLine>
+					<!-- Excludes integration tests when unit tests are run. -->
+					<excludes>
+						<exclude>**/IT*.java</exclude>
+					</excludes>
+				</configuration>
 			</plugin>
 			<plugin>
-			  <groupId>org.apache.maven.plugins</groupId>
-			  <artifactId>maven-failsafe-plugin</artifactId>
-			  <version>3.0.0-M4</version>
-			  <executions>
-			    <!-- Ensures that both integration-test and verify goals of the Failsafe
-				 Maven plugin are executed. -->
-			    <execution>
-			      <id>integration-tests</id>
-			      <goals>
-				<goal>integration-test</goal>
-				<goal>verify</goal>
-			      </goals>
-			      <configuration>
-				<!-- Sets the VM argument line used when integration tests are run. -->
-				<argLine>${failsafeArgLine}</argLine>
-			      </configuration>
-			    </execution>
-			  </executions>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<version>3.0.0-M4</version>
+				<executions>
+					<!-- Ensures that both integration-test and verify goals of the Failsafe
+                     Maven plugin are executed. -->
+					<execution>
+						<id>integration-tests</id>
+						<goals>
+							<goal>integration-test</goal>
+							<goal>verify</goal>
+						</goals>
+						<configuration>
+							<!-- Sets the VM argument line used when integration tests are run. -->
+							<argLine>${failsafeArgLine}</argLine>
+						</configuration>
+					</execution>
+				</executions>
 			</plugin>
 			<plugin>
-			  <groupId>org.sonarsource.scanner.maven</groupId>
-			  <artifactId>sonar-maven-plugin</artifactId>
-			  <version>${sonar.scanner.version}</version>
+				<groupId>org.sonarsource.scanner.maven</groupId>
+				<artifactId>sonar-maven-plugin</artifactId>
+				<version>${sonar.scanner.version}</version>
 			</plugin>
 			<!-- end removable sonar config -->
 
diff --git a/src/main/java/org/onap/aai/modelloader/config/ModelLoaderConfig.java b/src/main/java/org/onap/aai/modelloader/config/ModelLoaderConfig.java
index adc58e5..f8c5d23 100644
--- a/src/main/java/org/onap/aai/modelloader/config/ModelLoaderConfig.java
+++ b/src/main/java/org/onap/aai/modelloader/config/ModelLoaderConfig.java
@@ -86,14 +86,14 @@
     protected static final String PROP_AAI_AUTHENTICATION_USER = PREFIX_AAI + "AUTH_USER";
     protected static final String PROP_AAI_AUTHENTICATION_PASSWORD = PREFIX_AAI + "AUTH_PASSWORD";
     protected static final String PROP_AAI_USE_GIZMO = PREFIX_AAI + "USE_GIZMO";
-
+    protected static final String PROP_AAI_USE_HTTPS = PREFIX_AAI + "USE_HTTPS";
     protected static final String PROP_BABEL_BASE_URL = PREFIX_BABEL + "BASE_URL";
     protected static final String PROP_BABEL_KEYSTORE_FILE = PREFIX_BABEL + SUFFIX_KEYSTORE_FILE;
     protected static final String PROP_BABEL_KEYSTORE_PASSWORD = PREFIX_BABEL + SUFFIX_KEYSTORE_PASS;
     protected static final String PROP_BABEL_TRUSTSTORE_FILE = PREFIX_BABEL + SUFFIX_TRUSTSTORE_FILE;
     protected static final String PROP_BABEL_TRUSTSTORE_PASSWORD = PREFIX_BABEL + SUFFIX_TRUSTSTORE_PASS;
     protected static final String PROP_BABEL_GENERATE_RESOURCE_URL = PREFIX_BABEL + "GENERATE_ARTIFACTS_URL";
-
+    protected static final String PROP_BABEL_USE_HTTPS = PREFIX_BABEL + "USE_HTTPS";
     protected static final String PROP_DEBUG_INGEST_SIMULATOR = PREFIX_DEBUG + "INGEST_SIMULATOR";
     protected static final String FILESEP =
             (System.getProperty("file.separator") == null) ? "/" : System.getProperty("file.separator");
@@ -305,6 +305,16 @@
         return useGizmo != null && useGizmo.equalsIgnoreCase("true");
     }
 
+    public boolean useHttpsWithAAI() {
+        String useHttps = get(PROP_AAI_USE_HTTPS);
+        return useHttps != null && useHttps.equalsIgnoreCase("true");
+    }
+
+    public boolean useHttpsWithBabel() {
+        String useHttps = get(PROP_BABEL_USE_HTTPS);
+        return useHttps != null && useHttps.equalsIgnoreCase("true");
+    }
+
     /**
      * @return password for AAI authentication that has been reverse-engineered from its obfuscated form.
      */
diff --git a/src/main/java/org/onap/aai/modelloader/restclient/AaiRestClient.java b/src/main/java/org/onap/aai/modelloader/restclient/AaiRestClient.java
index a2a4c5b..29c0c70 100644
--- a/src/main/java/org/onap/aai/modelloader/restclient/AaiRestClient.java
+++ b/src/main/java/org/onap/aai/modelloader/restclient/AaiRestClient.java
@@ -157,14 +157,23 @@
     private RestClient setupClient() {
         RestClient restClient = new RestClient();
 
-        // @formatter:off
-        restClient.validateServerHostname(false)
-                .validateServerCertChain(false)
-                .clientCertFile(config.getAaiKeyStorePath())
-                .clientCertPassword(config.getAaiKeyStorePassword())
-                .connectTimeoutMs(120000)
-                .readTimeoutMs(120000);
-        // @formatter:on
+        //Use certs only if SSL is enabled
+        if (config.useHttpsWithAAI())
+        {// @formatter:off
+            restClient.validateServerHostname(false)
+                    .validateServerCertChain(false)
+                    .clientCertFile(config.getAaiKeyStorePath())
+                    .clientCertPassword(config.getAaiKeyStorePassword())
+                    .connectTimeoutMs(120000)
+                    .readTimeoutMs(120000);
+            // @formatter:on
+        }
+        else {
+            restClient.validateServerHostname(false)
+                    .validateServerCertChain(false)
+                    .connectTimeoutMs(120000)
+                    .readTimeoutMs(120000);
+        }
 
         if (useBasicAuth()) {
             restClient.authenticationMode(RestAuthenticationMode.SSL_BASIC);
diff --git a/src/main/java/org/onap/aai/modelloader/restclient/HttpsBabelServiceClient.java b/src/main/java/org/onap/aai/modelloader/restclient/HttpsBabelServiceClient.java
index 805fe34..289015c 100644
--- a/src/main/java/org/onap/aai/modelloader/restclient/HttpsBabelServiceClient.java
+++ b/src/main/java/org/onap/aai/modelloader/restclient/HttpsBabelServiceClient.java
@@ -98,35 +98,37 @@
         this.config = config;
 
         logger.debug(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Creating Babel Service client");
+        //Initialize SSL Context only if SSL is enabled
+        if (config.useHttpsWithBabel()) {
+            SSLContext ctx = SSLContext.getInstance(SSL_PROTOCOL);
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KEYSTORE_ALGORITHM);
+            KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
 
-        SSLContext ctx = SSLContext.getInstance(SSL_PROTOCOL);
-        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KEYSTORE_ALGORITHM);
-        KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
+            String clientCertPassword = config.getBabelKeyStorePassword();
 
-        String clientCertPassword = config.getBabelKeyStorePassword();
+            char[] pwd = null;
+            if (clientCertPassword != null) {
+                pwd = clientCertPassword.toCharArray();
+            }
 
-        char[] pwd = null;
-        if (clientCertPassword != null) {
-            pwd = clientCertPassword.toCharArray();
+            TrustManager[] trustManagers = getTrustManagers();
+
+            String clientCertFileName = config.getBabelKeyStorePath();
+            if (clientCertFileName == null) {
+                ctx.init(null, trustManagers, null);
+            } else {
+                InputStream fin = Files.newInputStream(Paths.get(clientCertFileName));
+                keyStore.load(fin, pwd);
+                kmf.init(keyStore, pwd);
+                ctx.init(kmf.getKeyManagers(), trustManagers, null);
+            }
+
+            logger.debug(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Initialised context");
+
+            HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
+            HttpsURLConnection.setDefaultHostnameVerifier((host, session) -> true);
         }
 
-        TrustManager[] trustManagers = getTrustManagers();
-
-        String clientCertFileName = config.getBabelKeyStorePath();
-        if (clientCertFileName == null) {
-            ctx.init(null, trustManagers, null);
-        } else {
-            InputStream fin = Files.newInputStream(Paths.get(clientCertFileName));
-            keyStore.load(fin, pwd);
-            kmf.init(keyStore, pwd);
-            ctx.init(kmf.getKeyManagers(), trustManagers, null);
-        }
-
-        logger.debug(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Initialised context");
-
-        HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
-        HttpsURLConnection.setDefaultHostnameVerifier((host, session) -> true);
-
         client = Client.create(new DefaultClientConfig());
 
         logger.debug(ModelLoaderMsgs.DISTRIBUTION_EVENT, "Jersey client created");
diff --git a/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java b/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
index 4f99bfc..8da5f89 100644
--- a/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
+++ b/src/test/java/org/onap/aai/modelloader/restclient/TestBabelServiceClient.java
@@ -93,6 +93,21 @@
         assertThat(result.size(), is(equalTo(3)));
     }
 
+    @Test
+    public void testRestClientHttp() throws BabelServiceClientException, IOException, URISyntaxException {
+        Properties configProperties = new Properties();
+        configProperties.put("ml.babel.USE_HTTPS", "false");
+        configProperties.put("ml.babel.BASE_URL", "http://localhost:8080/");
+        configProperties.put("ml.babel.GENERATE_ARTIFACTS_URL", "generate");
+        BabelServiceClient client =
+                new HttpsBabelServiceClientFactory().create(new ModelLoaderConfig(configProperties, "."));
+        List<BabelArtifact> result =
+                client.postArtifact(readBytesFromFile("compressedArtifacts/service-VscpaasTest-csar.csar"),
+                        "service-Vscpass-Test", "1.0", "Test-Transaction-ID-BabelClient");
+        assertThat(result.size(), is(equalTo(3)));
+    }
+
+
     private byte[] readBytesFromFile(String resourceFile) throws IOException, URISyntaxException {
         return Files.readAllBytes(Paths.get(ClassLoader.getSystemResource(resourceFile).toURI()));
     }