diff options
Diffstat (limited to 'adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java')
-rw-r--r-- | adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java | 116 |
1 files changed, 73 insertions, 43 deletions
diff --git a/adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java b/adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java index 672e0df67..1fbf20633 100644 --- a/adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java +++ b/adaptors/ansible-adapter/ansible-adapter-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/ansible/impl/ConnectionBuilder.java @@ -1,13 +1,9 @@ /*- * ============LICENSE_START======================================================= - * ONAP : APPC + * ONAP : SLI * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ - * Copyright (C) 2017 Amdocs - * ================================================================================ - * Modifications Copyright © 2018 IBM. - * ============================================================================= * 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 @@ -26,6 +22,9 @@ package org.onap.ccsdk.sli.adaptors.ansible.impl; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.Closeable; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyManagementException; @@ -36,13 +35,16 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; +import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; @@ -51,13 +53,11 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; +import org.json.JSONObject; import org.onap.ccsdk.sli.adaptors.ansible.model.AnsibleResult; import org.onap.ccsdk.sli.adaptors.ansible.model.AnsibleResultCodes; import org.onap.ccsdk.sli.core.utils.PathValidator; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - /** * Returns a custom http client * - based on options @@ -67,35 +67,36 @@ import com.att.eelf.configuration.EELFManager; * option **/ -public class ConnectionBuilder { - +public class ConnectionBuilder implements Closeable { + private static final String STATUS_CODE_KEY = "StatusCode"; private static final EELFLogger logger = EELFManager.getInstance().getLogger(ConnectionBuilder.class); - private CloseableHttpClient httpClient = null; - private HttpClientContext httpContext = new HttpClientContext(); + private final CloseableHttpClient httpClient; + private final HttpClientContext httpContext = new HttpClientContext(); /** * Constructor that initializes an http client based on certificate **/ - public ConnectionBuilder(String certFile) throws KeyStoreException, CertificateException, IOException, + public ConnectionBuilder(String certFile, int timeout) throws KeyStoreException, CertificateException, IOException, KeyManagementException, NoSuchAlgorithmException { /* Point to the certificate */ - try(FileInputStream fs = new FileInputStream(certFile)){ - /* Generate a certificate from the X509 */ - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate cert = (X509Certificate) cf.generateCertificate(fs); + try (FileInputStream fs = new FileInputStream(certFile)) { + /* Generate a certificate from the X509 */ + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate) cf.generateCertificate(fs); - /* Create a keystore object and load the certificate there */ - KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); - keystore.load(null, null); - keystore.setCertificateEntry("cacert", cert); + /* Create a keystore object and load the certificate there */ + KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); + keystore.load(null, null); + keystore.setCertificateEntry("cacert", cert); - SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(keystore).build(); - SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, - SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(keystore).build(); + SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - httpClient = HttpClients.custom().setSSLSocketFactory(factory).build(); + RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).build(); + httpClient = HttpClients.custom().setDefaultRequestConfig(config).setSSLSocketFactory(factory).build(); } } @@ -103,9 +104,9 @@ public class ConnectionBuilder { * Constructor which trusts all certificates in a specific java keystore file (assumes a JKS * file) **/ - public ConnectionBuilder(String trustStoreFile, char[] trustStorePasswd) throws KeyStoreException, IOException, - KeyManagementException, NoSuchAlgorithmException, CertificateException { - + public ConnectionBuilder(String trustStoreFile, char[] trustStorePasswd, int timeout, String serverIP) + throws KeyStoreException, IOException, KeyManagementException, NoSuchAlgorithmException, + CertificateException { if (!PathValidator.isValidFilePath(trustStoreFile)) { throw new IOException("Invalid trust store file path"); } @@ -114,37 +115,45 @@ public class ConnectionBuilder { KeyStore keystore = KeyStore.getInstance("JKS"); FileInputStream readStream = new FileInputStream(trustStoreFile); keystore.load(readStream, trustStorePasswd); + if (StringUtils.isNotBlank(serverIP)) { + SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(); + SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier()); - SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(keystore).build(); - SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, - SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - - httpClient = HttpClients.custom().setSSLSocketFactory(factory).build(); + RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).build(); + httpClient = HttpClients.custom().setDefaultRequestConfig(config).setSSLSocketFactory(factory).build(); + } else { + SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(keystore).build(); + SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).build(); + httpClient = HttpClients.custom().setDefaultRequestConfig(config).setSSLSocketFactory(factory).build(); + } } /** * Constructor that trusts ALL SSl certificates (NOTE : ONLY FOR DEV TESTING) if Mode == 1 or * Default if Mode == 0 */ - public ConnectionBuilder(int mode) + public ConnectionBuilder(int mode, int timeout) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).build(); if (mode == 1) { SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(); SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - httpClient = HttpClients.custom().setSSLSocketFactory(factory).build(); + httpClient = HttpClients.custom().setDefaultRequestConfig(config).setSSLSocketFactory(factory).build(); } else { - httpClient = HttpClients.createDefault(); + httpClient = HttpClients.custom().setDefaultRequestConfig(config).build(); } } // Use to create an http context with auth headers - public void setHttpContext(String user, String myPassword) { + public void setHttpContext(String user, String pswd) { // Are credential provided ? If so, set the context to be used - if (user != null && !user.isEmpty() && myPassword != null && !myPassword.isEmpty()) { - UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, myPassword); + if (user != null && !user.isEmpty() && pswd != null && !pswd.isEmpty()) { + UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, pswd); AuthScope authscope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT); BasicCredentialsProvider credsprovider = new BasicCredentialsProvider(); credsprovider.setCredentials(authscope, credentials); @@ -165,7 +174,6 @@ public class ConnectionBuilder { postObj.addHeader("Content-type", "application/json"); HttpResponse response = httpClient.execute(postObj, httpContext); - HttpEntity entity = response.getEntity(); String responseOutput = entity != null ? EntityUtils.toString(entity) : null; int responseCode = response.getStatusLine().getStatusCode(); @@ -189,11 +197,21 @@ public class ConnectionBuilder { try { HttpGet getObj = new HttpGet(agentUrl); HttpResponse response = httpClient.execute(getObj, httpContext); - HttpEntity entity = response.getEntity(); String responseOutput = entity != null ? EntityUtils.toString(entity) : null; int responseCode = response.getStatusLine().getStatusCode(); - result.setStatusCode(responseCode); + logger.info("GetResult response for ansible GET URL" + agentUrl + " returned " + responseOutput); + JSONObject postResponse = new JSONObject(responseOutput); + if (postResponse.has(STATUS_CODE_KEY)) { + int codeStatus = postResponse.getInt(STATUS_CODE_KEY); + if (codeStatus == AnsibleResultCodes.PENDING.getValue()) { + result.setStatusCode(codeStatus); + } else { + result.setStatusCode(responseCode); + } + } else { + result.setStatusCode(responseCode); + } result.setStatusMessage(responseOutput); } catch (IOException io) { result.setStatusCode(AnsibleResultCodes.IO_EXCEPTION.getValue()); @@ -202,4 +220,16 @@ public class ConnectionBuilder { } return result; } + + @Override + public void close() { + try { + if (httpClient != null) { + httpClient.close(); + } + } catch (IOException e) { + logger.error("Caught IOException during httpClient close", e); + } + } + } |