You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by mm...@apache.org on 2018/07/11 01:32:30 UTC

[14/50] [abbrv] metron git commit: METRON-1589 '/api/v1/search/search' fails when 'Solr Zookeeper Urls' has comma separated multiple zookeeper urls (justinleet) closes apache/metron#1040

METRON-1589 '/api/v1/search/search' fails when 'Solr Zookeeper Urls' has comma separated multiple zookeeper urls (justinleet) closes apache/metron#1040


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/9348c608
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/9348c608
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/9348c608

Branch: refs/heads/feature/METRON-1554-pcap-query-panel
Commit: 9348c608175afd311177b82fe31737f2f984c175
Parents: 7a071f6
Author: justinleet <ju...@gmail.com>
Authored: Tue Jun 5 07:44:20 2018 -0400
Committer: leet <le...@apache.org>
Committed: Tue Jun 5 07:44:20 2018 -0400

----------------------------------------------------------------------
 .../org/apache/metron/solr/SolrConstants.java   |  1 +
 .../metron/solr/dao/SolrColumnMetadataDao.java  | 14 +++---
 .../org/apache/metron/solr/dao/SolrDao.java     | 35 ++++++++++----
 .../metron/solr/dao/SolrMetaAlertDao.java       |  2 +-
 .../dao/SolrMetaAlertRetrieveLatestDao.java     |  2 +-
 .../metron/solr/dao/SolrMetaAlertUpdateDao.java |  2 +-
 .../apache/metron/solr/writer/SolrWriter.java   | 43 +++++++++---------
 .../metron/solr/dao/SolrColumnMetadataTest.java | 11 ++---
 .../org/apache/metron/solr/dao/SolrDaoTest.java | 48 ++++++++++++++++++--
 .../metron/solr/dao/SolrMetaAlertDaoTest.java   |  4 +-
 .../metron/solr/dao/SolrUpdateDaoTest.java      |  3 +-
 .../SolrIndexingIntegrationTest.java            |  4 +-
 .../SolrMetaAlertIntegrationTest.java           |  5 +-
 .../integration/SolrSearchIntegrationTest.java  |  4 +-
 .../integration/SolrUpdateIntegrationTest.java  |  3 +-
 .../schema/SchemaValidationIntegrationTest.java |  3 +-
 16 files changed, 126 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/SolrConstants.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/SolrConstants.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/SolrConstants.java
index 879b983..56f1413 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/SolrConstants.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/SolrConstants.java
@@ -27,4 +27,5 @@ public class SolrConstants {
   public static final String REQUEST_COLLECTIONS_PATH = "/admin/collections";
   public static final String RESPONSE_COLLECTIONS = "collections";
   public static final String SOLR_WRITER_NAME = "solr";
+  public static final String SOLR_ZOOKEEPER = "solr.zookeeper";
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrColumnMetadataDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrColumnMetadataDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrColumnMetadataDao.java
index 1e074a9..22c6efa 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrColumnMetadataDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrColumnMetadataDao.java
@@ -29,6 +29,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 import org.apache.metron.indexing.dao.ColumnMetadataDao;
 import org.apache.metron.indexing.dao.search.FieldType;
+import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -61,10 +62,10 @@ public class SolrColumnMetadataDao implements ColumnMetadataDao {
     solrTypeMap = Collections.unmodifiableMap(fieldTypeMap);
   }
 
-  private String zkHost;
+  private transient SolrClient client;
 
-  public SolrColumnMetadataDao(String zkHost) {
-    this.zkHost = zkHost;
+  public SolrColumnMetadataDao(SolrClient client) {
+    this.client = client;
   }
 
   @Override
@@ -115,14 +116,11 @@ public class SolrColumnMetadataDao implements ColumnMetadataDao {
 
   protected List<Map<String, Object>> getIndexFields(String index)
       throws IOException, SolrServerException {
-    CloudSolrClient client = new CloudSolrClient.Builder().withZkHost(zkHost).build();
-    client.setDefaultCollection(index);
-
     List<Map<String, Object>> indexFields = new ArrayList<>();
 
     // Get all the fields in use, including dynamic fields
     LukeRequest lukeRequest = new LukeRequest();
-    LukeResponse lukeResponse = lukeRequest.process(client);
+    LukeResponse lukeResponse = lukeRequest.process(client, index);
     for (Entry<String, LukeResponse.FieldInfo> field : lukeResponse.getFieldInfo().entrySet()) {
       Map<String, Object> fieldData = new HashMap<>();
       fieldData.put("name", field.getValue().getName());
@@ -132,7 +130,7 @@ public class SolrColumnMetadataDao implements ColumnMetadataDao {
     }
 
     // Get all the schema fields
-    SchemaRepresentation schemaRepresentation = new SchemaRequest().process(client)
+    SchemaRepresentation schemaRepresentation = new SchemaRequest().process(client, index)
         .getSchemaRepresentation();
     indexFields.addAll(schemaRepresentation.getFields());
 

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
index ee541eb..d461792 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrDao.java
@@ -17,6 +17,9 @@
  */
 package org.apache.metron.solr.dao;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+
+import com.google.common.base.Splitter;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
@@ -36,6 +39,7 @@ import org.apache.metron.indexing.dao.search.SearchResponse;
 import org.apache.metron.indexing.dao.update.Document;
 import org.apache.metron.indexing.dao.update.OriginalNotFoundException;
 import org.apache.metron.indexing.dao.update.PatchRequest;
+import org.apache.metron.solr.SolrConstants;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
@@ -81,14 +85,12 @@ public class SolrDao implements IndexDao {
       enableKerberos();
     }
     if (this.client == null) {
-      Map<String, Object> globalConfig = config.getGlobalConfigSupplier().get();
-      String zkHost = (String) globalConfig.get("solr.zookeeper");
-      this.client = getSolrClient(zkHost);
       this.accessConfig = config;
+      this.client = getSolrClient(getZkHosts());
       this.solrSearchDao = new SolrSearchDao(this.client, this.accessConfig);
       this.solrUpdateDao = new SolrUpdateDao(this.client, this.accessConfig);
       this.solrRetrieveLatestDao = new SolrRetrieveLatestDao(this.client);
-      this.solrColumnMetadataDao = new SolrColumnMetadataDao(zkHost);
+      this.solrColumnMetadataDao = new SolrColumnMetadataDao(this.client);
     }
   }
 
@@ -134,13 +136,30 @@ public class SolrDao implements IndexDao {
     return this.solrColumnMetadataDao.getColumnMetadata(indices);
   }
 
-  public SolrClient getSolrClient(String zkHost) {
-    return new CloudSolrClient.Builder().withZkHost(zkHost).build();
+  /**
+   * Builds a Solr client using the ZK hosts from the global config.
+   * @return SolrClient
+   */
+  public SolrClient getSolrClient() {
+    return new CloudSolrClient.Builder().withZkHost(getZkHosts()).build();
+  }
+
+  /**
+   * Builds a Solr client using the ZK hosts specified.
+   * @return SolrClient
+   */
+  public SolrClient getSolrClient(List<String> zkHosts) {
+    return new CloudSolrClient.Builder().withZkHost(zkHosts).build();
   }
 
-  public String getZkHost() {
+  /**
+   * Get ZK hosts from the global config.
+   * @return List of ZkHosts
+   */
+  public List<String> getZkHosts() {
     Map<String, Object> globalConfig = accessConfig.getGlobalConfigSupplier().get();
-    return (String) globalConfig.get("solr.zookeeper");
+    return Splitter.on(',').trimResults()
+        .splitToList((String) globalConfig.getOrDefault(SOLR_ZOOKEEPER, ""));
   }
 
   void enableKerberos() {

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
index ca4a172..e65700f 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertDao.java
@@ -133,7 +133,7 @@ public class SolrMetaAlertDao implements MetaAlertDao {
         Constants.SENSOR_TYPE
     );
 
-    SolrClient solrClient = solrDao.getSolrClient(solrDao.getZkHost());
+    SolrClient solrClient = solrDao.getSolrClient(solrDao.getZkHosts());
     this.metaAlertSearchDao = new SolrMetaAlertSearchDao(solrClient, solrDao.getSolrSearchDao());
     this.metaAlertRetrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrDao);
     this.metaAlertUpdateDao = new SolrMetaAlertUpdateDao(

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
index 7afe113..2797df2 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertRetrieveLatestDao.java
@@ -52,7 +52,7 @@ public class SolrMetaAlertRetrieveLatestDao implements
           .setFields("*", "[child parentFilter=" + guidClause + " limit=999]");
 
       try {
-        QueryResponse response = solrDao.getSolrClient(solrDao.getZkHost())
+        QueryResponse response = solrDao.getSolrClient(solrDao.getZkHosts())
             .query(METAALERTS_COLLECTION, query);
         // GUID is unique, so it's definitely the first result
         if (response.getResults().size() == 1) {

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
index b00954a..2a66d47 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/dao/SolrMetaAlertUpdateDao.java
@@ -65,7 +65,7 @@ public class SolrMetaAlertUpdateDao extends AbstractLuceneMetaAlertUpdateDao imp
       SolrMetaAlertRetrieveLatestDao retrieveLatestDao,
       MetaAlertConfig config) {
     super(solrDao, retrieveLatestDao, config);
-    this.solrClient = solrDao.getSolrClient(solrDao.getZkHost());
+    this.solrClient = solrDao.getSolrClient(solrDao.getZkHosts());
     this.metaAlertSearchDao = metaAlertSearchDao;
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/writer/SolrWriter.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/writer/SolrWriter.java b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/writer/SolrWriter.java
index 93bd8fe..0289398 100644
--- a/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/writer/SolrWriter.java
+++ b/metron-platform/metron-solr/src/main/java/org/apache/metron/solr/writer/SolrWriter.java
@@ -17,47 +17,46 @@
  */
 package org.apache.metron.solr.writer;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_WRITER_NAME;
+
 import com.google.common.base.Joiner;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.function.Supplier;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.metron.common.Constants;
+import org.apache.metron.common.configuration.writer.WriterConfiguration;
+import org.apache.metron.common.writer.BulkMessageWriter;
+import org.apache.metron.common.writer.BulkWriterResponse;
+import org.apache.metron.solr.SolrConstants;
 import org.apache.metron.stellar.common.utils.ConversionUtils;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
+import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrInputDocument;
 import org.apache.storm.task.TopologyContext;
 import org.apache.storm.tuple.Tuple;
-import org.apache.metron.common.configuration.writer.WriterConfiguration;
-import org.apache.metron.common.writer.BulkMessageWriter;
-import org.apache.metron.common.writer.BulkWriterResponse;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.response.UpdateResponse;
-import org.apache.solr.common.SolrInputDocument;
 import org.json.simple.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.invoke.MethodHandles;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Collection;
-import java.util.Optional;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.UUID;
-import java.util.function.Supplier;
-
-import static org.apache.metron.solr.SolrConstants.SOLR_WRITER_NAME;
-
 public class SolrWriter implements BulkMessageWriter<JSONObject>, Serializable {
 
   public static final String JAVA_SECURITY_CONFIG_PROPERTY = "java.security.auth.login.config";
 
   public enum SolrProperties {
-    ZOOKEEPER_QUORUM("solr.zookeeper"),
+    ZOOKEEPER_QUORUM(SolrConstants.SOLR_ZOOKEEPER),
     COMMIT_PER_BATCH("solr.commitPerBatch", Optional.of(true)),
     COMMIT_WAIT_SEARCHER("solr.commit.waitSearcher", Optional.of(true)),
     COMMIT_WAIT_FLUSH("solr.commit.waitFlush", Optional.of(true)),

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrColumnMetadataTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrColumnMetadataTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrColumnMetadataTest.java
index 6f98809..df471c8 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrColumnMetadataTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrColumnMetadataTest.java
@@ -18,6 +18,7 @@
 package org.apache.metron.solr.dao;
 
 import org.apache.metron.indexing.dao.search.FieldType;
+import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.common.SolrException;
 import org.junit.Before;
@@ -44,14 +45,12 @@ public class SolrColumnMetadataTest {
   @Rule
   public final ExpectedException exception = ExpectedException.none();
 
-  private static final String zkHost = "zookeeper:2181";
-
   private SolrColumnMetadataDao solrColumnMetadataDao;
 
   @SuppressWarnings("unchecked")
   @Before
   public void setUp() throws Exception {
-    solrColumnMetadataDao = new SolrColumnMetadataDao(zkHost);
+    solrColumnMetadataDao = new SolrColumnMetadataDao(null);
   }
 
   @Test
@@ -105,7 +104,7 @@ public class SolrColumnMetadataTest {
       put("type", "plong");
     }});
 
-    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(zkHost));
+    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(null));
     doReturn(broFields).when(solrColumnMetadataDao).getIndexFields("bro");
     doReturn(snortFields).when(solrColumnMetadataDao).getIndexFields("snort");
 
@@ -129,7 +128,7 @@ public class SolrColumnMetadataTest {
     exception.expect(IOException.class);
     exception.expectMessage("solr exception");
 
-    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(zkHost));
+    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(null));
     doThrow(new SolrServerException("solr exception")).when(solrColumnMetadataDao).getIndexFields("bro");
 
     solrColumnMetadataDao.getColumnMetadata(Arrays.asList("bro", "snort"));
@@ -137,7 +136,7 @@ public class SolrColumnMetadataTest {
 
   @Test
   public void getColumnMetadataShouldHandle400Exception() throws Exception {
-    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(zkHost));
+    solrColumnMetadataDao = spy(new SolrColumnMetadataDao(null));
     SolrException solrException = new SolrException(SolrException.ErrorCode.BAD_REQUEST, "solr exception");
 
     doThrow(solrException).when(solrColumnMetadataDao).getIndexFields("bro");

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
index fc328be..076fb20 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrDaoTest.java
@@ -17,6 +17,8 @@
  */
 package org.apache.metron.solr.dao;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.verify;
 import static org.mockito.internal.verification.VerificationModeFactory.times;
 import static org.powermock.api.mockito.PowerMockito.doNothing;
@@ -25,8 +27,11 @@ import static org.powermock.api.mockito.PowerMockito.mock;
 import static org.powermock.api.mockito.PowerMockito.spy;
 import static org.powermock.api.mockito.PowerMockito.whenNew;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import org.apache.metron.indexing.dao.AccessConfig;
@@ -95,17 +100,17 @@ public class SolrDaoTest {
     AccessConfig accessConfig = new AccessConfig();
     accessConfig.setGlobalConfigSupplier(() ->
         new HashMap<String, Object>() {{
-          put("solr.zookeeper", "zookeeper:2181");
+          put(SOLR_ZOOKEEPER, "zookeeper:2181");
         }}
     );
 
     solrDao = spy(new SolrDao());
-    doReturn(client).when(solrDao).getSolrClient("zookeeper:2181");
+    doReturn(client).when(solrDao).getSolrClient(Collections.singletonList("zookeeper:2181"));
     whenNew(SolrSearchDao.class).withArguments(client, accessConfig).thenReturn(solrSearchDao);
     whenNew(SolrUpdateDao.class).withArguments(client, accessConfig).thenReturn(solrUpdateDao);
     whenNew(SolrRetrieveLatestDao.class).withArguments(client)
         .thenReturn(solrRetrieveLatestDao);
-    whenNew(SolrColumnMetadataDao.class).withArguments("zookeeper:2181")
+    whenNew(SolrColumnMetadataDao.class).withArguments(client)
         .thenReturn(solrColumnMetadataDao);
 
     solrDao.init(accessConfig);
@@ -139,4 +144,41 @@ public class SolrDaoTest {
     solrDao.getColumnMetadata(Arrays.asList("bro", "snort"));
     verify(solrColumnMetadataDao).getColumnMetadata(Arrays.asList("bro", "snort"));
   }
+
+  @Test
+  public void testGetZkHostsSingle() {
+    AccessConfig accessConfig = new AccessConfig();
+    accessConfig.setGlobalConfigSupplier(() ->
+        new HashMap<String, Object>() {{
+          put(SOLR_ZOOKEEPER, "   zookeeper:2181   ");
+        }}
+    );
+
+    SolrDao solrDao = new SolrDao();
+    solrDao.init(accessConfig);
+
+    List<String> actual = solrDao.getZkHosts();
+    List<String> expected = new ArrayList<>();
+    expected.add("zookeeper:2181");
+    assertEquals(expected, actual);
+  }
+
+  @Test
+  public void testGetZkHostsMultiple() {
+    AccessConfig accessConfig = new AccessConfig();
+    accessConfig.setGlobalConfigSupplier(() ->
+        new HashMap<String, Object>() {{
+          put(SOLR_ZOOKEEPER, "   zookeeper:2181    ,   zookeeper2:2181    ");
+        }}
+    );
+
+    SolrDao solrDao = new SolrDao();
+    solrDao.init(accessConfig);
+
+    List<String> actual = solrDao.getZkHosts();
+    List<String> expected = new ArrayList<>();
+    expected.add("zookeeper:2181");
+    expected.add("zookeeper2:2181");
+    assertEquals(expected, actual);
+  }
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
index 5378467..4571b15 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrMetaAlertDaoTest.java
@@ -18,6 +18,8 @@
 
 package org.apache.metron.solr.dao;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
@@ -50,7 +52,7 @@ public class SolrMetaAlertDaoTest {
   public static void setupBefore() {
     accessConfig.setGlobalConfigSupplier(() ->
         new HashMap<String, Object>() {{
-          put("solr.zookeeper", "zookeeper:2181");
+          put(SOLR_ZOOKEEPER, "zookeeper:2181");
         }}
     );
   }

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrUpdateDaoTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrUpdateDaoTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrUpdateDaoTest.java
index 0011aa8..41fe7f9 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrUpdateDaoTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/dao/SolrUpdateDaoTest.java
@@ -43,6 +43,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
 import static org.mockito.Matchers.argThat;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
@@ -65,7 +66,7 @@ public class SolrUpdateDaoTest {
   public static void setupBefore() {
     accessConfig.setGlobalConfigSupplier(() ->
         new HashMap<String, Object>() {{
-          put("solr.zookeeper", "zookeeper:2181");
+          put(SOLR_ZOOKEEPER, "zookeeper:2181");
         }}
     );
     IndexingConfigurations indexingConfigs = mock(IndexingConfigurations.class);

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrIndexingIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrIndexingIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrIndexingIntegrationTest.java
index 8e0ddd6..918a4ae 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrIndexingIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrIndexingIntegrationTest.java
@@ -17,6 +17,8 @@
  */
 package org.apache.metron.solr.integration;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+
 import com.google.common.base.Function;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +62,7 @@ public class SolrIndexingIntegrationTest extends IndexingIntegrationTest {
                   String testZookeeperUrl = topologyProperties.getProperty(ZKServerComponent.ZOOKEEPER_PROPERTY);
                   Configurations configurations = SampleUtil.getSampleConfigs();
                   Map<String, Object> globalConfig = configurations.getGlobalConfig();
-                  globalConfig.put("solr.zookeeper", solrComponent.getZookeeperUrl());
+                  globalConfig.put(SOLR_ZOOKEEPER, solrComponent.getZookeeperUrl());
                   ConfigurationsUtils.writeGlobalConfigToZookeeper(JSONUtils.INSTANCE.toJSONPretty(globalConfig), testZookeeperUrl);
                 } catch (Exception e) {
                   e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
index aced539..f7dd02c 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrMetaAlertIntegrationTest.java
@@ -23,6 +23,7 @@ import static org.apache.metron.indexing.dao.metaalert.MetaAlertConstants.METAAL
 import static org.apache.metron.indexing.dao.metaalert.MetaAlertConstants.METAALERT_TYPE;
 import static org.apache.metron.indexing.dao.metaalert.MetaAlertConstants.THREAT_FIELD_DEFAULT;
 import static org.apache.metron.indexing.dao.metaalert.MetaAlertConstants.THREAT_SORT_DEFAULT;
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
 import static org.apache.metron.solr.dao.SolrMetaAlertDao.METAALERTS_COLLECTION;
 
 import java.io.IOException;
@@ -80,7 +81,7 @@ public class SolrMetaAlertIntegrationTest extends MetaAlertIntegrationTest {
         put("solr.port", "9300");
         put("solr.ip", "localhost");
         put("solr.date.format", DATE_FORMAT);
-        put("solr.zookeeper", solr.getZookeeperUrl());
+        put(SOLR_ZOOKEEPER, solr.getZookeeperUrl());
       }
     };
     accessConfig.setMaxSearchResults(1000);
@@ -100,7 +101,7 @@ public class SolrMetaAlertIntegrationTest extends MetaAlertIntegrationTest {
     );
 
     SolrMetaAlertSearchDao searchDao = new SolrMetaAlertSearchDao(
-        solrDao.getSolrClient(solrDao.getZkHost()),
+        solrDao.getSolrClient(solrDao.getZkHosts()),
         solrDao.getSolrSearchDao());
     SolrMetaAlertRetrieveLatestDao retrieveLatestDao = new SolrMetaAlertRetrieveLatestDao(solrDao);
     SolrMetaAlertUpdateDao updateDao = new SolrMetaAlertUpdateDao(solrDao, searchDao,

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
index 2fb3086..f09d7a8 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrSearchIntegrationTest.java
@@ -17,6 +17,8 @@
  */
 package org.apache.metron.solr.integration;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
@@ -78,7 +80,7 @@ public class SolrSearchIntegrationTest extends SearchIntegrationTest {
     config.setMaxSearchGroups(100);
     config.setGlobalConfigSupplier( () ->
         new HashMap<String, Object>() {{
-          put("solr.zookeeper", solrComponent.getZookeeperUrl());
+          put(SOLR_ZOOKEEPER, solrComponent.getZookeeperUrl());
         }}
     );
 

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
index 8f1ff12..7faeeb9 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/SolrUpdateIntegrationTest.java
@@ -17,6 +17,7 @@
  */
 package org.apache.metron.solr.integration;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
 import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
@@ -107,7 +108,7 @@ public class SolrUpdateIntegrationTest extends UpdateIntegrationTest {
 
   private static Map<String, Object> createGlobalConfig() {
     return new HashMap<String, Object>() {{
-      put("solr.zookeeper", solrComponent.getZookeeperUrl());
+      put(SOLR_ZOOKEEPER, solrComponent.getZookeeperUrl());
     }};
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/9348c608/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/schema/SchemaValidationIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/schema/SchemaValidationIntegrationTest.java b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/schema/SchemaValidationIntegrationTest.java
index 73113f6..2b523d8 100644
--- a/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/schema/SchemaValidationIntegrationTest.java
+++ b/metron-platform/metron-solr/src/test/java/org/apache/metron/solr/integration/schema/SchemaValidationIntegrationTest.java
@@ -38,6 +38,7 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.*;
 
+import static org.apache.metron.solr.SolrConstants.SOLR_ZOOKEEPER;
 import static org.mockito.Mockito.mock;
 
 public class SchemaValidationIntegrationTest {
@@ -50,7 +51,7 @@ public class SchemaValidationIntegrationTest {
 
   public static Map<String, Object> getGlobalConfig(String sensorType, SolrComponent component) {
     Map<String, Object> globalConfig = new HashMap<>();
-    globalConfig.put("solr.zookeeper", component.getZookeeperUrl());
+    globalConfig.put(SOLR_ZOOKEEPER, component.getZookeeperUrl());
     return globalConfig;
   }