This is an automated email from the ASF dual-hosted git repository.
krisden pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new f39d0c5 KNOX-2267 - Ambari/CM discovery - Needs to point to
configured truststore
f39d0c5 is described below
commit f39d0c515a87132ac1e3bc649ba4f650bfeea4e9
Author: Kevin Risden <[email protected]>
AuthorDate: Sat Mar 7 09:35:07 2020 -0500
KNOX-2267 - Ambari/CM discovery - Needs to point to configured truststore
Signed-off-by: Kevin Risden <[email protected]>
---
.../discovery/ambari/AmbariClientCommon.java | 5 +-
.../AmbariClusterConfigurationMonitorProvider.java | 6 ++-
.../ambari/AmbariConfigurationMonitor.java | 5 +-
.../discovery/ambari/AmbariServiceDiscovery.java | 6 ++-
.../topology/discovery/ambari/RESTInvoker.java | 25 ++++++----
.../ambari/AmbariConfigurationMonitorTest.java | 2 +-
.../ambari/AmbariServiceDiscoveryTest.java | 2 +-
.../cm/ClouderaManagerServiceDiscovery.java | 6 ++-
.../ClouderaManagerServiceDiscoveryMessages.java | 2 +
.../topology/discovery/cm/DiscoveryApiClient.java | 20 ++++++--
...ClouderaManagerClusterConfigurationMonitor.java | 8 ++--
...ManagerClusterConfigurationMonitorProvider.java | 6 ++-
.../cm/monitor/PollingConfigurationAnalyzer.java | 18 ++++---
.../cm/ClouderaManagerServiceDiscoveryTest.java | 8 ++--
.../monitor/PollingConfigurationAnalyzerTest.java | 4 +-
.../gateway/services/DefaultGatewayServices.java | 1 +
.../DefaultClusterConfigurationMonitorService.java | 9 ++--
.../knox/gateway/i18n/GatewaySpiMessages.java | 3 ++
.../ClusterConfigurationMonitorProvider.java | 4 +-
.../gateway/util/TruststoreSSLContextUtils.java | 55 ++++++++++++++++++++++
20 files changed, 152 insertions(+), 43 deletions(-)
diff --git
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClientCommon.java
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClientCommon.java
index 2784909..7da6710 100644
---
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClientCommon.java
+++
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClientCommon.java
@@ -20,6 +20,7 @@ import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import java.util.HashMap;
@@ -40,8 +41,8 @@ class AmbariClientCommon {
private RESTInvoker restClient;
- AmbariClientCommon(GatewayConfig config, AliasService aliasService) {
- this(new RESTInvoker(config, aliasService));
+ AmbariClientCommon(GatewayConfig config, AliasService aliasService,
KeystoreService keystoreService) {
+ this(new RESTInvoker(config, aliasService, keystoreService));
}
diff --git
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClusterConfigurationMonitorProvider.java
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClusterConfigurationMonitorProvider.java
index c5bbde3..33384b0 100644
---
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClusterConfigurationMonitorProvider.java
+++
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariClusterConfigurationMonitorProvider.java
@@ -18,6 +18,7 @@ package org.apache.knox.gateway.topology.discovery.ambari;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import
org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitorProvider;
@@ -30,7 +31,8 @@ public class AmbariClusterConfigurationMonitorProvider
implements
}
@Override
- public ClusterConfigurationMonitor newInstance(GatewayConfig config,
AliasService aliasService) {
- return new AmbariConfigurationMonitor(config, aliasService);
+ public ClusterConfigurationMonitor newInstance(GatewayConfig config,
AliasService aliasService,
+ KeystoreService
keystoreService) {
+ return new AmbariConfigurationMonitor(config, aliasService,
keystoreService);
}
}
diff --git
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
index 642a84f..6a1a78c 100644
---
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
+++
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
@@ -20,6 +20,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
@@ -80,9 +81,9 @@ class AmbariConfigurationMonitor implements
ClusterConfigurationMonitor {
return TYPE;
}
- AmbariConfigurationMonitor(GatewayConfig config, AliasService
aliasService) {
+ AmbariConfigurationMonitor(GatewayConfig config, AliasService
aliasService, KeystoreService keystoreService) {
this.gatewayConfig = config;
- this.ambariClient = new AmbariClientCommon(config, aliasService);
+ this.ambariClient = new AmbariClientCommon(config, aliasService,
keystoreService);
this.internalMonitor = new PollingConfigAnalyzer(this);
// Override the default polling interval if it has been configured
diff --git
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscovery.java
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscovery.java
index 0693646..9668a36 100644
---
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscovery.java
+++
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscovery.java
@@ -23,6 +23,7 @@ import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.ServiceType;
import org.apache.knox.gateway.services.GatewayServices;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import org.apache.knox.gateway.topology.discovery.GatewayService;
@@ -77,6 +78,9 @@ class AmbariServiceDiscovery implements ServiceDiscovery {
@GatewayService
private AliasService aliasService;
+ @GatewayService
+ private KeystoreService keystoreService;
+
private RESTInvoker restClient;
private AmbariClientCommon ambariClient;
@@ -146,7 +150,7 @@ class AmbariServiceDiscovery implements ServiceDiscovery {
private void init(GatewayConfig config) {
if (!isInitialized) {
if (this.restClient == null) {
- this.restClient = new RESTInvoker(config, aliasService);
+ this.restClient = new RESTInvoker(config, aliasService,
keystoreService);
}
this.ambariClient = new AmbariClientCommon(restClient);
this.configChangeMonitor = getConfigurationChangeMonitor();
diff --git
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/RESTInvoker.java
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/RESTInvoker.java
index 24a3eec..776b5f5 100644
---
a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/RESTInvoker.java
+++
b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/RESTInvoker.java
@@ -33,6 +33,8 @@ import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.AliasService;
import org.apache.knox.gateway.services.security.AliasServiceException;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.util.TruststoreSSLContextUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -49,23 +51,30 @@ class RESTInvoker {
private AliasService aliasService;
- private CloseableHttpClient httpClient;
+ private KeystoreService keystoreService;
+ private CloseableHttpClient httpClient;
- RESTInvoker(AliasService aliasService) {
- this(null, aliasService);
+ RESTInvoker(AliasService aliasService, KeystoreService keystoreService) {
+ this(null, aliasService, keystoreService);
}
-
- RESTInvoker(GatewayConfig config, AliasService aliasService) {
+ RESTInvoker(GatewayConfig config, AliasService aliasService,
KeystoreService keystoreService) {
this.aliasService = aliasService;
+ this.keystoreService = keystoreService;
// Initialize the HTTP client
- this.httpClient =
HttpClientBuilder.create().setDefaultRequestConfig(getRequestConfig(config)).build();
+ this.httpClient = getHttpClient(config);
}
+ private CloseableHttpClient getHttpClient(GatewayConfig config) {
+ return HttpClientBuilder.create()
+
.setSSLContext(TruststoreSSLContextUtils.getTruststoreSSLContext(keystoreService))
+ .setDefaultRequestConfig(getRequestConfig(config))
+ .build();
+ }
- private static RequestConfig getRequestConfig(GatewayConfig config) {
+ private RequestConfig getRequestConfig(GatewayConfig config) {
RequestConfig.Builder builder = RequestConfig.custom();
if (config != null) {
builder.setConnectTimeout(config.getHttpClientConnectionTimeout())
@@ -79,7 +88,6 @@ class RESTInvoker {
return builder.build();
}
-
JSONObject invoke(String url, String username, String passwordAlias) {
JSONObject result = null;
@@ -157,5 +165,4 @@ class RESTInvoker {
}
return result;
}
-
}
diff --git
a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java
b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java
index c0026ac..98ba6a1 100644
---
a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java
+++
b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariConfigurationMonitorTest.java
@@ -279,7 +279,7 @@ public class AmbariConfigurationMonitorTest {
Map<String, Map<String, Map<String, String>>> configVersionData = new
HashMap<>();
TestableAmbariConfigurationMonitor(GatewayConfig config) {
- super(config, null);
+ super(config, null, null);
}
void addTestConfigVersion(String address, String clusterName, String
configType, String configVersion) {
diff --git
a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscoveryTest.java
b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscoveryTest.java
index b5b0b1b..ba36fb2 100644
---
a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscoveryTest.java
+++
b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/AmbariServiceDiscoveryTest.java
@@ -323,7 +323,7 @@ public class AmbariServiceDiscoveryTest {
private Map<String, JSONObject> cannedResponses = new HashMap<>();
TestRESTInvoker(String clusterName) {
- super(null);
+ super(null, null);
cannedResponses.put(AmbariServiceDiscovery.AMBARI_CLUSTERS_URI,
(JSONObject)
JSONValue.parse(CLUSTERS_JSON_TEMPLATE.replaceAll(CLUSTER_PLACEHOLDER,
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
index a905677..424630c 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
@@ -34,6 +34,7 @@ import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.GatewayServices;
import org.apache.knox.gateway.services.ServiceType;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import org.apache.knox.gateway.topology.discovery.ServiceDiscovery;
@@ -85,6 +86,7 @@ public class ClouderaManagerServiceDiscovery implements
ServiceDiscovery {
private boolean debug;
private AliasService aliasService;
+ private KeystoreService keystoreService;
private ClouderaManagerClusterConfigurationMonitor configChangeMonitor;
@@ -97,6 +99,7 @@ public class ClouderaManagerServiceDiscovery implements
ServiceDiscovery {
GatewayServices gwServices = GatewayServer.getGatewayServices();
if (gwServices != null) {
this.aliasService = gwServices.getService(ServiceType.ALIAS_SERVICE);
+ this.keystoreService =
gwServices.getService(ServiceType.KEYSTORE_SERVICE);
}
this.debug = debug;
this.configChangeMonitor = getConfigurationChangeMonitor();
@@ -114,9 +117,8 @@ public class ClouderaManagerServiceDiscovery implements
ServiceDiscovery {
throw new IllegalArgumentException("Missing or invalid discovery
address.");
}
- DiscoveryApiClient client = new DiscoveryApiClient(discoveryConfig,
aliasService);
+ DiscoveryApiClient client = new DiscoveryApiClient(discoveryConfig,
aliasService, keystoreService);
client.setDebugging(debug);
- client.setVerifyingSsl(false);
return client;
}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
index a958616..aecb990 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
@@ -187,4 +187,6 @@ public interface ClouderaManagerServiceDiscoveryMessages {
@Message(level = MessageLevel.WARN, text = "Failed to create persistence
directory {0}")
void failedToCreatePersistenceDirectory(String path);
+ @Message(level = MessageLevel.ERROR, text = "Failed to configure truststore")
+ void failedToConfigureTruststore();
}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java
index 793292f..a9ef585 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java
@@ -25,10 +25,13 @@ import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.AliasService;
import org.apache.knox.gateway.services.security.AliasServiceException;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import org.apache.knox.gateway.topology.discovery.cm.auth.AuthUtils;
import
org.apache.knox.gateway.topology.discovery.cm.auth.SpnegoAuthInterceptor;
+import org.apache.knox.gateway.util.TruststoreSSLContextUtils;
+import javax.net.ssl.SSLContext;
import javax.security.auth.Subject;
import java.util.List;
@@ -48,16 +51,17 @@ public class DiscoveryApiClient extends ApiClient {
private ServiceDiscoveryConfig config;
- public DiscoveryApiClient(ServiceDiscoveryConfig discoveryConfig,
AliasService aliasService) {
+ public DiscoveryApiClient(ServiceDiscoveryConfig discoveryConfig,
AliasService aliasService,
+ KeystoreService keystoreService) {
this.config = discoveryConfig;
- configure(aliasService);
+ configure(aliasService, keystoreService);
}
boolean isKerberos() {
return isKerberos;
}
- private void configure(AliasService aliasService) {
+ private void configure(AliasService aliasService, KeystoreService
keystoreService) {
String apiAddress = config.getAddress();
apiAddress += (apiAddress.endsWith("/") ? API_PATH : "/" + API_PATH);
@@ -121,6 +125,8 @@ public class DiscoveryApiClient extends ApiClient {
getHttpClient().interceptors().add(spnegoInterceptor);
}
}
+
+ configureTruststore(keystoreService);
}
@Override
@@ -147,4 +153,12 @@ public class DiscoveryApiClient extends ApiClient {
return username;
}
+ private void configureTruststore(KeystoreService keystoreService) {
+ SSLContext truststoreSSLContext =
TruststoreSSLContextUtils.getTruststoreSSLContext(keystoreService);
+ if (truststoreSSLContext != null) {
+
getHttpClient().setSslSocketFactory(truststoreSSLContext.getSocketFactory());
+ } else {
+ log.failedToConfigureTruststore();
+ }
+ }
}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitor.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitor.java
index 3c24a41..0d21751 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitor.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitor.java
@@ -20,6 +20,7 @@ import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import org.apache.knox.gateway.topology.discovery.cm.ClouderaManagerCluster;
@@ -71,7 +72,8 @@ public class ClouderaManagerClusterConfigurationMonitor
implements ClusterConfig
}
- ClouderaManagerClusterConfigurationMonitor(final GatewayConfig config, final
AliasService aliasService) {
+ ClouderaManagerClusterConfigurationMonitor(final GatewayConfig config, final
AliasService aliasService,
+ final KeystoreService
keystoreService) {
// Initialize the config cache
configCache = new ClusterConfigurationCache();
@@ -85,7 +87,7 @@ public class ClouderaManagerClusterConfigurationMonitor
implements ClusterConfig
this.executorService = Executors.newSingleThreadExecutor(tf);
// Initialize the internal monitor
- internalMonitor = new PollingConfigurationAnalyzer(configCache,
aliasService, this);
+ internalMonitor = new PollingConfigurationAnalyzer(configCache,
aliasService, keystoreService, this);
// Override the default polling interval if it has been configured
// (org.apache.knox.gateway.topology.discovery.cm.monitor.interval)
@@ -224,4 +226,4 @@ public class ClouderaManagerClusterConfigurationMonitor
implements ClusterConfig
}
}
-}
\ No newline at end of file
+}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitorProvider.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitorProvider.java
index c8f29bc..2625760 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitorProvider.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClouderaManagerClusterConfigurationMonitorProvider.java
@@ -18,6 +18,7 @@ package org.apache.knox.gateway.topology.discovery.cm.monitor;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import
org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitorProvider;
@@ -29,8 +30,9 @@ public class
ClouderaManagerClusterConfigurationMonitorProvider implements Clust
}
@Override
- public ClusterConfigurationMonitor newInstance(GatewayConfig config,
AliasService aliasService) {
- return new ClouderaManagerClusterConfigurationMonitor(config,
aliasService);
+ public ClusterConfigurationMonitor newInstance(GatewayConfig config,
AliasService aliasService,
+ KeystoreService
keystoreService) {
+ return new ClouderaManagerClusterConfigurationMonitor(config,
aliasService, keystoreService);
}
}
diff --git
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
index 81400cf..5631c41 100644
---
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
+++
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
@@ -31,6 +31,7 @@ import com.cloudera.api.swagger.model.ApiRoleList;
import com.cloudera.api.swagger.model.ApiServiceConfig;
import org.apache.knox.gateway.i18n.messages.MessagesFactory;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import
org.apache.knox.gateway.topology.discovery.cm.ClouderaManagerServiceDiscoveryMessages;
import org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient;
@@ -75,6 +76,8 @@ public class PollingConfigurationAnalyzer implements Runnable
{
private AliasService aliasService;
+ private KeystoreService keystoreService;
+
// Polling interval in seconds
private int interval;
@@ -92,18 +95,21 @@ public class PollingConfigurationAnalyzer implements
Runnable {
PollingConfigurationAnalyzer(final ClusterConfigurationCache configCache,
final AliasService aliasService,
+ final KeystoreService
keystoreService,
final ConfigurationChangeListener
changeListener) {
- this(configCache, aliasService, changeListener, DEFAULT_POLLING_INTERVAL);
+ this(configCache, aliasService, keystoreService, changeListener,
DEFAULT_POLLING_INTERVAL);
}
PollingConfigurationAnalyzer(final ClusterConfigurationCache configCache,
final AliasService aliasService,
+ final KeystoreService
keystoreService,
final ConfigurationChangeListener
changeListener,
int interval) {
- this.configCache = configCache;
- this.aliasService = aliasService;
- this.changeListener = changeListener;
- this.interval = interval;
+ this.configCache = configCache;
+ this.aliasService = aliasService;
+ this.keystoreService = keystoreService;
+ this.changeListener = changeListener;
+ this.interval = interval;
}
void setInterval(int interval) {
@@ -229,7 +235,7 @@ public class PollingConfigurationAnalyzer implements
Runnable {
*/
private DiscoveryApiClient getApiClient(final ServiceDiscoveryConfig
discoveryConfig) {
return clients.computeIfAbsent(discoveryConfig.getAddress(),
- c -> new
DiscoveryApiClient(discoveryConfig, aliasService));
+ c -> new
DiscoveryApiClient(discoveryConfig, aliasService, keystoreService));
}
/**
diff --git
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
index e797604..7cdd7a5 100644
---
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
+++
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
@@ -30,6 +30,7 @@ import com.cloudera.api.swagger.model.ApiServiceList;
import com.squareup.okhttp.Call;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscovery;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import
org.apache.knox.gateway.topology.discovery.cm.model.atlas.AtlasAPIServiceModelGenerator;
@@ -1141,7 +1142,7 @@ public class ClouderaManagerServiceDiscoveryTest {
ServiceDiscoveryConfig sdConfig = createMockDiscoveryConfig();
// Create the test client for providing test response content
- TestDiscoveryApiClient mockClient = new TestDiscoveryApiClient(sdConfig,
null);
+ TestDiscoveryApiClient mockClient = new TestDiscoveryApiClient(sdConfig,
null, null);
// Prepare the service list response for the cluster
ApiServiceList serviceList = EasyMock.createNiceMock(ApiServiceList.class);
@@ -1261,8 +1262,9 @@ public class ClouderaManagerServiceDiscoveryTest {
private Map<Type, ApiResponse<?>> responseMap = new HashMap<>();
- TestDiscoveryApiClient(ServiceDiscoveryConfig sdConfig, AliasService
aliasService) {
- super(sdConfig, aliasService);
+ TestDiscoveryApiClient(ServiceDiscoveryConfig sdConfig, AliasService
aliasService,
+ KeystoreService keystoreService) {
+ super(sdConfig, aliasService, keystoreService);
}
void addResponse(Type type, ApiResponse<?> response) {
diff --git
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
index b2ca5a7..2001bea 100644
---
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
+++
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
@@ -200,13 +200,13 @@ public class PollingConfigurationAnalyzerTest {
TestablePollingConfigAnalyzer(ClusterConfigurationCache cache,
ConfigurationChangeListener listener) {
- super(cache, null, listener);
+ super(cache, null, null, listener);
}
TestablePollingConfigAnalyzer(ClusterConfigurationCache cache,
ConfigurationChangeListener listener,
int interval) {
- super(cache, null, listener, interval);
+ super(cache, null, null, listener, interval);
}
void addRestartEvent(final String service, final ApiEvent restartEvent) {
diff --git
a/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
b/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
index 1a638b5..b120dec 100644
---
a/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
+++
b/gateway-server/src/main/java/org/apache/knox/gateway/services/DefaultGatewayServices.java
@@ -133,6 +133,7 @@ public class DefaultGatewayServices extends
AbstractGatewayServices {
DefaultClusterConfigurationMonitorService ccs = new
DefaultClusterConfigurationMonitorService();
ccs.setAliasService(alias);
+ ccs.setKeystoreService(ks);
ccs.init(config, options);
addService(ServiceType.CLUSTER_CONFIGURATION_MONITOR_SERVICE, ccs);
diff --git
a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java
b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java
index d3bd40a..ecc64d7 100644
---
a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java
+++
b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultClusterConfigurationMonitorService.java
@@ -19,6 +19,7 @@ package org.apache.knox.gateway.services.topology.impl;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.ServiceLifecycleException;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
import org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
import org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitor;
import
org.apache.knox.gateway.topology.discovery.ClusterConfigurationMonitorProvider;
@@ -27,10 +28,9 @@ import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;
-
public class DefaultClusterConfigurationMonitorService implements
ClusterConfigurationMonitorService {
-
private AliasService aliasService;
+ private KeystoreService keystoreService;
private Map<String, ClusterConfigurationMonitor> monitors = new
HashMap<>();
@@ -41,7 +41,7 @@ public class DefaultClusterConfigurationMonitorService
implements ClusterConfigu
for (ClusterConfigurationMonitorProvider provider : providers) {
// Check the gateway configuration to determine if this type of
monitor is enabled
if (config.isClusterMonitorEnabled(provider.getType())) {
- ClusterConfigurationMonitor monitor =
provider.newInstance(config, aliasService);
+ ClusterConfigurationMonitor monitor =
provider.newInstance(config, aliasService, keystoreService);
if (monitor != null) {
monitors.put(provider.getType(), monitor);
}
@@ -86,4 +86,7 @@ public class DefaultClusterConfigurationMonitorService
implements ClusterConfigu
this.aliasService = aliasService;
}
+ public void setKeystoreService(KeystoreService keystoreService) {
+ this.keystoreService = keystoreService;
+ }
}
diff --git
a/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
b/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
index 2a5389b..2e000ed 100644
---
a/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
+++
b/gateway-spi/src/main/java/org/apache/knox/gateway/i18n/GatewaySpiMessages.java
@@ -76,4 +76,7 @@ public interface GatewaySpiMessages {
@Message( level = MessageLevel.ERROR, text = "Topology {0} cannot be
manually overwritten because it was generated from a simple descriptor." )
void disallowedOverwritingGeneratedTopology(String topologyName);
+ @Message(level = MessageLevel.ERROR, text = "Failed to load truststore due
to {0}")
+ void failedToLoadTruststore(String message, @StackTrace(level =
MessageLevel.DEBUG) Exception e);
+
}
diff --git
a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitorProvider.java
b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitorProvider.java
index c5554f1..b43b27d 100644
---
a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitorProvider.java
+++
b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ClusterConfigurationMonitorProvider.java
@@ -18,10 +18,12 @@ package org.apache.knox.gateway.topology.discovery;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
+import org.apache.knox.gateway.services.security.KeystoreService;
public interface ClusterConfigurationMonitorProvider {
String getType();
- ClusterConfigurationMonitor newInstance(GatewayConfig config, AliasService
aliasService);
+ ClusterConfigurationMonitor newInstance(GatewayConfig config, AliasService
aliasService,
+ KeystoreService keystoreService);
}
diff --git
a/gateway-spi/src/main/java/org/apache/knox/gateway/util/TruststoreSSLContextUtils.java
b/gateway-spi/src/main/java/org/apache/knox/gateway/util/TruststoreSSLContextUtils.java
new file mode 100644
index 0000000..3224944
--- /dev/null
+++
b/gateway-spi/src/main/java/org/apache/knox/gateway/util/TruststoreSSLContextUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package org.apache.knox.gateway.util;
+
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.knox.gateway.i18n.GatewaySpiMessages;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.services.security.KeystoreServiceException;
+
+import javax.net.ssl.SSLContext;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+public class TruststoreSSLContextUtils {
+ private static final GatewaySpiMessages LOGGER =
MessagesFactory.get(GatewaySpiMessages.class);
+
+ private TruststoreSSLContextUtils() {
+ }
+
+ public static SSLContext getTruststoreSSLContext(KeystoreService
keystoreService) {
+ SSLContext sslContext = null;
+ try {
+ if(keystoreService != null) {
+ KeyStore truststore = keystoreService.getTruststoreForHttpClient();
+ if (truststore != null) {
+ SSLContextBuilder sslContextBuilder = SSLContexts.custom();
+ sslContextBuilder.loadTrustMaterial(truststore, null);
+ sslContext = sslContextBuilder.build();
+ }
+ }
+ } catch (KeystoreServiceException | NoSuchAlgorithmException |
KeyStoreException
+ | KeyManagementException e) {
+ LOGGER.failedToLoadTruststore(e.getMessage(), e);
+ }
+ return sslContext;
+ }
+}