From c015f76e875516f1f83aa33c903e131ca088b991 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Wed, 27 May 2020 16:30:31 +0100 Subject: [PATCH 1/7] Add https to druid-influxdb-emitter extension --- .../extensions-contrib/influxdb-emitter.md | 4 ++ .../emitter/influxdb/InfluxdbEmitter.java | 54 +++++++++++++++++- .../influxdb/InfluxdbEmitterConfig.java | 57 +++++++++++++++++++ .../influxdb/InfluxdbEmitterConfigTest.java | 40 +++++++++++++ .../emitter/influxdb/InfluxdbEmitterTest.java | 16 ++++++ 5 files changed, 169 insertions(+), 2 deletions(-) diff --git a/docs/development/extensions-contrib/influxdb-emitter.md b/docs/development/extensions-contrib/influxdb-emitter.md index 3b1c84c30ca0..b8e81f595c43 100644 --- a/docs/development/extensions-contrib/influxdb-emitter.md +++ b/docs/development/extensions-contrib/influxdb-emitter.md @@ -41,6 +41,10 @@ All the configuration parameters for the influxdb emitter are under `druid.emitt |--------|-----------|---------|-------| |`druid.emitter.influxdb.hostname`|The hostname of the InfluxDB server.|Yes|N/A| |`druid.emitter.influxdb.port`|The port of the InfluxDB server.|No|8086| +|`druid.emitter.influxdb.protocol`|The protocol used to send metrics to InfluxDB. One of http/https|No|http| +|`druid.emitter.influxdb.trustStorePath`|The path to the trustStore to be used for https|No|none| +|`druid.emitter.influxdb.trustStoreType`|The trustStore type to be used for https|No|jks| +|`druid.emitter.influxdb.trustStorePassword`|The trustStore password to be used for https|No|none| |`druid.emitter.influxdb.databaseName`|The name of the database in InfluxDB.|Yes|N/A| |`druid.emitter.influxdb.maxQueueSize`|The size of the queue that holds events.|No|Integer.MAX_VALUE(=2^31-1)| |`druid.emitter.influxdb.flushPeriod`|How often (in milliseconds) the events queue is parsed into Line Protocol and POSTed to InfluxDB.|No|60000| diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java index ee22917f8e3f..b6185beeb857 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java @@ -28,11 +28,18 @@ import org.apache.druid.java.util.emitter.service.ServiceMetricEvent; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.HttpClients; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.security.KeyStore; import java.util.Arrays; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -56,7 +63,7 @@ public class InfluxdbEmitter implements Emitter public InfluxdbEmitter(InfluxdbEmitterConfig influxdbEmitterConfig) { this.influxdbEmitterConfig = influxdbEmitterConfig; - this.influxdbClient = HttpClientBuilder.create().build(); + this.influxdbClient = buildInfluxdbClient(); this.eventsQueue = new LinkedBlockingQueue<>(influxdbEmitterConfig.getMaxQueueSize()); this.dimensionWhiteList = influxdbEmitterConfig.getDimensionWhitelist(); log.info("constructed influxdb emitter"); @@ -96,7 +103,8 @@ public void emit(Event event) public void postToInflux(String payload) { HttpPost post = new HttpPost( - "http://" + influxdbEmitterConfig.getHostname() + influxdbEmitterConfig.getProtocol() + "://" + + influxdbEmitterConfig.getHostname() + ":" + influxdbEmitterConfig.getPort() + "/write?db=" + influxdbEmitterConfig.getDatabaseName() + "&u=" + influxdbEmitterConfig.getInfluxdbUserName() @@ -211,4 +219,46 @@ public void transformAndSendToInfluxdb(LinkedBlockingQueue e postToInflux(payload.toString()); } + private HttpClient buildInfluxdbClient() + { + if ("https".equals(influxdbEmitterConfig.getProtocol())) { + SSLContext sslContext = null; + if (influxdbEmitterConfig.getTrustStorePath() == null || influxdbEmitterConfig.getTrustStorePassword() == null) { + String msg = "Can't load TrustStore. Truststore path or password is not set."; + log.error(msg); + throw new IllegalStateException(msg); + } + + FileInputStream in = null; + + try { + in = new FileInputStream(new File(influxdbEmitterConfig.getTrustStorePath())); + KeyStore store = KeyStore.getInstance(influxdbEmitterConfig.getTrustStoreType() == null + ? KeyStore.getDefaultType() + : influxdbEmitterConfig.getTrustStoreType()); + store.load(in, influxdbEmitterConfig.getTrustStorePassword().toCharArray()); + TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + tmf.init(store); + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, tmf.getTrustManagers(), null); + } + catch (Exception ex) { + log.error("Unable to load TrustStore"); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException ex) { + log.error("Unable to load TrustStore"); + } + } + } + return HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build(); + } else { + return HttpClientBuilder.create().build(); + } + } + } diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java index d96b07083e2e..5db3b94a3d2b 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java @@ -36,12 +36,21 @@ public class InfluxdbEmitterConfig private static final int DEFAULT_QUEUE_SIZE = Integer.MAX_VALUE; private static final int DEFAULT_FLUSH_PERIOD = 60000; // milliseconds private static final List DEFAULT_DIMENSION_WHITELIST = Arrays.asList("dataSource", "type", "numMetrics", "numDimensions", "threshold", "dimension", "taskType", "taskStatus", "tier"); + private static final String DEFAULT_PROTOCOL = "http"; @JsonProperty private final String hostname; @JsonProperty private final Integer port; @JsonProperty + private final String protocol; + @JsonProperty + private final String trustStorePath; + @JsonProperty + private final String trustStoreType; + @JsonProperty + private final String trustStorePassword; + @JsonProperty private final String databaseName; @JsonProperty private final Integer maxQueueSize; @@ -62,6 +71,10 @@ public class InfluxdbEmitterConfig public InfluxdbEmitterConfig( @JsonProperty("hostname") String hostname, @JsonProperty("port") Integer port, + @JsonProperty("protocol") String protocol, + @JsonProperty("trustStorePath") String trustStorePath, + @JsonProperty("trustStoreType") String trustStoreType, + @JsonProperty("trustStorePassword") String trustStorePassword, @JsonProperty("databaseName") String databaseName, @JsonProperty("maxQueueSize") Integer maxQueueSize, @JsonProperty("flushPeriod") Integer flushPeriod, @@ -73,6 +86,10 @@ public InfluxdbEmitterConfig( { this.hostname = Preconditions.checkNotNull(hostname, "hostname can not be null"); this.port = port == null ? DEFAULT_PORT : port; + this.protocol = protocol == null ? DEFAULT_PROTOCOL : protocol; + this.trustStorePath = trustStorePath; + this.trustStoreType = trustStoreType; + this.trustStorePassword = trustStorePassword; this.databaseName = Preconditions.checkNotNull(databaseName, "databaseName can not be null"); this.maxQueueSize = maxQueueSize == null ? DEFAULT_QUEUE_SIZE : maxQueueSize; this.flushPeriod = flushPeriod == null ? DEFAULT_FLUSH_PERIOD : flushPeriod; @@ -121,6 +138,18 @@ public boolean equals(Object o) if (!getDimensionWhitelist().equals(that.getDimensionWhitelist())) { return false; } + if (!getProtocol().equals(that.getProtocol())) { + return false; + } + if (getTrustStorePath() != null ? !getTrustStorePath().equals(that.getTrustStorePath()) : that.getTrustStorePath() != null) { + return false; + } + if (getTrustStoreType() != null ? !getTrustStoreType().equals(that.getTrustStoreType()) : that.getTrustStoreType() != null) { + return false; + } + if (getTrustStorePassword() != null ? !getTrustStorePassword().equals(that.getTrustStorePassword()) : that.getTrustStorePassword() != null) { + return false; + } return true; } @@ -130,6 +159,10 @@ public int hashCode() { int result = getHostname().hashCode(); result = 31 * result + getPort(); + result = 31 * result + getProtocol().hashCode(); + result = 31 * result + (getTrustStorePath() != null ? getTrustStorePath().hashCode() : 0); + result = 31 * result + (getTrustStoreType() != null ? getTrustStoreType().hashCode() : 0); + result = 31 * result + (getTrustStorePassword() != null ? getTrustStorePassword().hashCode() : 0); result = 31 * result + getDatabaseName().hashCode(); result = 31 * result + getFlushPeriod(); result = 31 * result + getMaxQueueSize(); @@ -152,6 +185,30 @@ public int getPort() return port; } + @JsonProperty + public String getProtocol() + { + return protocol; + } + + @JsonProperty + public String getTrustStorePath() + { + return trustStorePath; + } + + @JsonProperty + public String getTrustStoreType() + { + return trustStoreType; + } + + @JsonProperty + public String getTrustStorePassword() + { + return trustStorePassword; + } + @JsonProperty public String getDatabaseName() { diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java index 09e6e55c2f38..62a89e640229 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java @@ -45,6 +45,10 @@ public void setUp() influxdbEmitterConfig = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -61,6 +65,10 @@ public void testInfluxdbEmitterConfigObjectsAreDifferent() InfluxdbEmitterConfig influxdbEmitterConfigComparison = new InfluxdbEmitterConfig( "localhost", 8080, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -78,6 +86,10 @@ public void testConfigWithNullHostname() InfluxdbEmitterConfig influxdbEmitterConfigWithNullHostname = new InfluxdbEmitterConfig( null, 8080, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -94,6 +106,10 @@ public void testConfigWithNullPort() InfluxdbEmitterConfig influxdbEmitterConfigWithNullPort = new InfluxdbEmitterConfig( "localhost", null, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -112,6 +128,10 @@ public void testEqualsMethod() InfluxdbEmitterConfig influxdbEmitterConfigComparison = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -129,6 +149,10 @@ public void testEqualsMethodWithNotEqualConfigs() InfluxdbEmitterConfig influxdbEmitterConfigComparison = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + "password", "dbname", 10000, 15000, @@ -146,6 +170,10 @@ public void testConfigWithNullInfluxdbUserName() InfluxdbEmitterConfig influxdbEmitterConfigWithNullHostname = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -162,6 +190,10 @@ public void testConfigWithNullInfluxdbPassword() InfluxdbEmitterConfig influxdbEmitterConfigWithNullHostname = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -178,6 +210,10 @@ public void testConfigWithNullDimensionWhitelist() InfluxdbEmitterConfig influxdbEmitterConfig = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -196,6 +232,10 @@ public void testConfigWithDimensionWhitelist() InfluxdbEmitterConfig influxdbEmitterConfig = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java index 2095a2f70876..d059035a350f 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java @@ -66,6 +66,10 @@ public void testTransformForInfluxWithLongMetric() InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -107,6 +111,10 @@ public void testTransformForInfluxWithShortMetric() InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -149,6 +157,10 @@ public void testMetricIsInDimensionWhitelist() InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, @@ -191,6 +203,10 @@ public void testMetricIsInDefaultDimensionWhitelist() InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( "localhost", 8086, + null, + null, + null, + null, "dbname", 10000, 15000, From 81260f3d171389e7272b65d40c17bca1f25a6f9b Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Tue, 9 Jun 2020 16:51:22 +0100 Subject: [PATCH 2/7] address CI failures --- .../extensions-contrib/influxdb-emitter.md | 2 +- .../influxdb/InfluxdbEmitterConfigTest.java | 28 +++++++++++++++++-- .../emitter/influxdb/InfluxdbEmitterTest.java | 22 +++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/docs/development/extensions-contrib/influxdb-emitter.md b/docs/development/extensions-contrib/influxdb-emitter.md index b8e81f595c43..076b8fc70b8d 100644 --- a/docs/development/extensions-contrib/influxdb-emitter.md +++ b/docs/development/extensions-contrib/influxdb-emitter.md @@ -43,7 +43,7 @@ All the configuration parameters for the influxdb emitter are under `druid.emitt |`druid.emitter.influxdb.port`|The port of the InfluxDB server.|No|8086| |`druid.emitter.influxdb.protocol`|The protocol used to send metrics to InfluxDB. One of http/https|No|http| |`druid.emitter.influxdb.trustStorePath`|The path to the trustStore to be used for https|No|none| -|`druid.emitter.influxdb.trustStoreType`|The trustStore type to be used for https|No|jks| +|`druid.emitter.influxdb.trustStoreType`|The trustStore type to be used for https|No|`jks`| |`druid.emitter.influxdb.trustStorePassword`|The trustStore password to be used for https|No|none| |`druid.emitter.influxdb.databaseName`|The name of the database in InfluxDB.|Yes|N/A| |`druid.emitter.influxdb.maxQueueSize`|The size of the queue that holds events.|No|Integer.MAX_VALUE(=2^31-1)| diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java index 62a89e640229..412fb7951fce 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java @@ -149,9 +149,9 @@ public void testEqualsMethodWithNotEqualConfigs() InfluxdbEmitterConfig influxdbEmitterConfigComparison = new InfluxdbEmitterConfig( "localhost", 8086, - null, - null, - null, + "https", + "/path", + "jks", "password", "dbname", 10000, @@ -248,4 +248,26 @@ public void testConfigWithDimensionWhitelist() Assert.assertEquals(expected, influxdbEmitterConfig.getDimensionWhitelist()); } + @Test + public void testConfigWithNullProtocol() + { + InfluxdbEmitterConfig influxdbEmitterConfigWithNullProtocol = new InfluxdbEmitterConfig( + "localhost", + 8086, + null, + "path", + "jks", + "pass", + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + String expectedProtocol = "http"; + Assert.assertEquals(expectedProtocol, influxdbEmitterConfig.getProtocol()); + } + } diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java index d059035a350f..8772f8281c11 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java @@ -221,4 +221,26 @@ public void testMetricIsInDefaultDimensionWhitelist() String actual = influxdbEmitter.transformForInfluxSystems(event); Assert.assertEquals(expected, actual); } + + @Test(expected = IllegalStateException.class) + public void testBuildInfluxdbClientWithHttpsProtocolAndNoTrustStore() + { + InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( + "localhost", + 8086, + "https", + null, + null, + null, + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); + } + } From 9214edda4ba02db56c4c9e263d68b8566a47b189 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Thu, 16 Jul 2020 16:12:23 +0100 Subject: [PATCH 3/7] increase test coverage --- .../emitter/influxdb/InfluxdbEmitter.java | 4 +- .../influxdb/InfluxdbEmitterConfig.java | 5 ++- .../influxdb/InfluxdbEmitterConfigTest.java | 25 ++++++++++- .../emitter/influxdb/InfluxdbEmitterTest.java | 42 +++++++++++++++++++ 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java index b6185beeb857..38e530dcb0e6 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java @@ -233,9 +233,7 @@ private HttpClient buildInfluxdbClient() try { in = new FileInputStream(new File(influxdbEmitterConfig.getTrustStorePath())); - KeyStore store = KeyStore.getInstance(influxdbEmitterConfig.getTrustStoreType() == null - ? KeyStore.getDefaultType() - : influxdbEmitterConfig.getTrustStoreType()); + KeyStore store = KeyStore.getInstance(influxdbEmitterConfig.getTrustStoreType()); store.load(in, influxdbEmitterConfig.getTrustStorePassword().toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(store); diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java index 79dd9e2285b4..9539976ce34d 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java @@ -24,6 +24,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import java.security.KeyStore; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -87,7 +88,7 @@ public InfluxdbEmitterConfig( this.port = port == null ? DEFAULT_PORT : port; this.protocol = protocol == null ? DEFAULT_PROTOCOL : protocol; this.trustStorePath = trustStorePath; - this.trustStoreType = trustStoreType; + this.trustStoreType = trustStoreType == null ? KeyStore.getDefaultType() : trustStoreType; this.trustStorePassword = trustStorePassword; this.databaseName = Preconditions.checkNotNull(databaseName, "databaseName can not be null"); this.maxQueueSize = maxQueueSize == null ? DEFAULT_QUEUE_SIZE : maxQueueSize; @@ -143,7 +144,7 @@ public boolean equals(Object o) if (getTrustStorePath() != null ? !getTrustStorePath().equals(that.getTrustStorePath()) : that.getTrustStorePath() != null) { return false; } - if (getTrustStoreType() != null ? !getTrustStoreType().equals(that.getTrustStoreType()) : that.getTrustStoreType() != null) { + if (!getTrustStoreType().equals(that.getTrustStoreType())) { return false; } if (getTrustStorePassword() != null ? !getTrustStorePassword().equals(that.getTrustStorePassword()) : that.getTrustStorePassword() != null) { diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java index edb383e99724..c508dd172db2 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java @@ -28,6 +28,7 @@ import org.junit.Before; import org.junit.Test; +import java.security.KeyStore; import java.util.Arrays; public class InfluxdbEmitterConfigTest @@ -268,7 +269,7 @@ public void testConfigWithNullProtocol() null ); String expectedProtocol = "http"; - Assert.assertEquals(expectedProtocol, influxdbEmitterConfig.getProtocol()); + Assert.assertEquals(expectedProtocol, influxdbEmitterConfigWithNullProtocol.getProtocol()); } @Test @@ -279,4 +280,26 @@ public void testConfigEquals() ).usingGetClass().verify(); } + @Test + public void testConfigWithNullTrustStoreType() + { + InfluxdbEmitterConfig influxdbEmitterConfigWithNullTrustStoreType = new InfluxdbEmitterConfig( + "localhost", + 8086, + null, + "path", + null, + "pass", + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + String expectedTrustStoreType = KeyStore.getDefaultType(); + Assert.assertEquals(expectedTrustStoreType, influxdbEmitterConfigWithNullTrustStoreType.getTrustStoreType()); + } + } diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java index 61a2e8ffb313..f41b6b2a37a7 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java @@ -249,4 +249,46 @@ public void testBuildInfluxdbClientWithHttpsProtocolAndNoTrustStore() InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); } + @Test(expected = IllegalStateException.class) + public void testBuildInfluxdbClientWithHttpsProtocolAndNullTrustStorePath() + { + InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( + "localhost", + 8086, + "https", + null, + null, + "pass", + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); + } + + @Test(expected = IllegalStateException.class) + public void testBuildInfluxdbClientWithHttpsProtocolAndNullTrustStorePassword() + { + InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( + "localhost", + 8086, + "https", + "path", + null, + null, + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); + } + } From 43f1554c851d0b3ee38636937ac18d6242710a26 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Thu, 16 Jul 2020 17:34:40 +0100 Subject: [PATCH 4/7] tests for being unable to load trustStore --- .../emitter/influxdb/InfluxdbEmitter.java | 4 +++- .../emitter/influxdb/InfluxdbEmitterTest.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java index 38e530dcb0e6..a295ec54279e 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java @@ -241,7 +241,9 @@ private HttpClient buildInfluxdbClient() sslContext.init(null, tmf.getTrustManagers(), null); } catch (Exception ex) { - log.error("Unable to load TrustStore"); + String msg = "Unable to load TrustStore"; + log.error(msg); + throw new IllegalStateException(msg); } finally { if (in != null) { diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java index f41b6b2a37a7..f39549250f47 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterTest.java @@ -291,4 +291,25 @@ public void testBuildInfluxdbClientWithHttpsProtocolAndNullTrustStorePassword() InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); } + @Test(expected = IllegalStateException.class) + public void testUnableToLoadTrustStore() + { + InfluxdbEmitterConfig config = new InfluxdbEmitterConfig( + "localhost", + 8086, + "https", + "path", + null, + "pass", + "dbname", + 10000, + 15000, + 30000, + "adam", + "password", + null + ); + InfluxdbEmitter influxdbEmitter = new InfluxdbEmitter(config); + } + } From b79350cecbe37a5c93a6872ce764d2190730bea0 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Fri, 17 Jul 2020 16:14:54 +0100 Subject: [PATCH 5/7] fix EqualsVerifier test --- .../apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java | 2 +- .../druid/emitter/influxdb/InfluxdbEmitterConfigTest.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java index 9539976ce34d..87b1a6922ce7 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfig.java @@ -105,7 +105,7 @@ public boolean equals(Object o) if (this == o) { return true; } - if (!(o instanceof InfluxdbEmitterConfig)) { + if (o == null || getClass() != o.getClass()) { return false; } diff --git a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java index c508dd172db2..d6312115a0ed 100644 --- a/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java +++ b/extensions-contrib/influxdb-emitter/src/test/java/org/apache/druid/emitter/influxdb/InfluxdbEmitterConfigTest.java @@ -276,7 +276,9 @@ public void testConfigWithNullProtocol() public void testConfigEquals() { EqualsVerifier.forClass(InfluxdbEmitterConfig.class).withNonnullFields( - "hostname", "databaseName", "influxdbUserName", "influxdbPassword" + "hostname", "port", "protocol", "trustStoreType", "databaseName", + "maxQueueSize", "flushPeriod", "flushDelay", "influxdbUserName", + "influxdbPassword", "dimensionWhitelist" ).usingGetClass().verify(); } From 3bc316e6e9b5a37811b46f9a96a1c796711c6fd5 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Mon, 20 Jul 2020 09:21:54 +0100 Subject: [PATCH 6/7] fix intellij inspection error --- .../java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java index a295ec54279e..7661ecc1c173 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java @@ -222,7 +222,7 @@ public void transformAndSendToInfluxdb(LinkedBlockingQueue e private HttpClient buildInfluxdbClient() { if ("https".equals(influxdbEmitterConfig.getProtocol())) { - SSLContext sslContext = null; + SSLContext sslContext; if (influxdbEmitterConfig.getTrustStorePath() == null || influxdbEmitterConfig.getTrustStorePassword() == null) { String msg = "Can't load TrustStore. Truststore path or password is not set."; log.error(msg); From 219e59658d2ff17ed6ed1ae994a47286d0249107 Mon Sep 17 00:00:00 2001 From: Adam Welsh Date: Tue, 13 Oct 2020 11:40:59 +0100 Subject: [PATCH 7/7] use try-with-resources when loading trustStore --- .../druid/emitter/influxdb/InfluxdbEmitter.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java index 7661ecc1c173..bb1c72b03141 100644 --- a/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java +++ b/extensions-contrib/influxdb-emitter/src/main/java/org/apache/druid/emitter/influxdb/InfluxdbEmitter.java @@ -229,10 +229,7 @@ private HttpClient buildInfluxdbClient() throw new IllegalStateException(msg); } - FileInputStream in = null; - - try { - in = new FileInputStream(new File(influxdbEmitterConfig.getTrustStorePath())); + try (FileInputStream in = new FileInputStream(new File(influxdbEmitterConfig.getTrustStorePath()))) { KeyStore store = KeyStore.getInstance(influxdbEmitterConfig.getTrustStoreType()); store.load(in, influxdbEmitterConfig.getTrustStorePassword().toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); @@ -245,16 +242,6 @@ private HttpClient buildInfluxdbClient() log.error(msg); throw new IllegalStateException(msg); } - finally { - if (in != null) { - try { - in.close(); - } - catch (IOException ex) { - log.error("Unable to load TrustStore"); - } - } - } return HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build(); } else { return HttpClientBuilder.create().build();