AMBARI-20541. Rename ambari-logsearch-solr-client module to 
ambari-infra-solr-client (oleewere)


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

Branch: refs/heads/branch-dev-logsearch
Commit: c5ccb1ab7f09762db0e9a812770e3c3fbe1e848d
Parents: b0f1e34
Author: oleewere <oleew...@gmail.com>
Authored: Thu Mar 23 13:26:48 2017 +0100
Committer: oleewere <oleew...@gmail.com>
Committed: Mon Mar 27 21:13:39 2017 +0200

----------------------------------------------------------------------
 .../ambari-infra-solr-client/build.xml          |  56 ++
 .../ambari-infra-solr-client/pom.xml            | 125 ++++
 .../ambari/infra/solr/AmbariSolrCloudCLI.java   | 565 +++++++++++++++++++
 .../infra/solr/AmbariSolrCloudClient.java       | 334 +++++++++++
 .../solr/AmbariSolrCloudClientBuilder.java      | 215 +++++++
 .../solr/AmbariSolrCloudClientException.java    |  28 +
 .../solr/commands/AbstractRetryCommand.java     |  58 ++
 .../solr/commands/AbstractSolrRetryCommand.java |  53 ++
 .../commands/AbstractStateFileZkCommand.java    |  42 ++
 .../AbstractZookeeperConfigCommand.java         |  44 ++
 .../commands/AbstractZookeeperRetryCommand.java |  40 ++
 .../solr/commands/CheckConfigZkCommand.java     |  34 ++
 .../solr/commands/CheckZnodeZkCommand.java      |  45 ++
 .../solr/commands/CreateCollectionCommand.java  |  62 ++
 .../infra/solr/commands/CreateShardCommand.java |  51 ++
 .../solr/commands/CreateSolrZnodeZkCommand.java |  42 ++
 .../solr/commands/DownloadConfigZkCommand.java  |  47 ++
 .../EnableKerberosPluginSolrZkCommand.java      |  88 +++
 .../infra/solr/commands/GetShardsCommand.java   |  39 ++
 .../solr/commands/GetSolrHostsCommand.java      |  53 ++
 .../solr/commands/GetStateFileZkCommand.java    |  43 ++
 .../solr/commands/ListCollectionCommand.java    |  49 ++
 .../solr/commands/SecureSolrZNodeZkCommand.java |  86 +++
 .../solr/commands/SecureZNodeZkCommand.java     |  49 ++
 .../commands/SetClusterPropertyZkCommand.java   |  40 ++
 .../solr/commands/UpdateStateFileZkCommand.java |  84 +++
 .../solr/commands/UploadConfigZkCommand.java    |  41 ++
 .../infra/solr/domain/AmbariSolrState.java      |  26 +
 .../apache/ambari/infra/solr/util/AclUtils.java |  85 +++
 .../ambari/infra/solr/util/ShardUtils.java      |  71 +++
 .../src/main/resources/log4j.properties         |  31 +
 .../src/main/resources/solrCloudCli.sh          |  20 +
 .../infra/solr/AmbariSolrCloudClientTest.java   | 134 +++++
 .../ambari-logsearch-assembly/pom.xml           |   6 +-
 ambari-logsearch/ambari-logsearch-it/pom.xml    |   2 +-
 .../ambari-logsearch-solr-client/build.xml      |  56 --
 .../ambari-logsearch-solr-client/pom.xml        | 125 ----
 .../logsearch/solr/AmbariSolrCloudCLI.java      | 565 -------------------
 .../logsearch/solr/AmbariSolrCloudClient.java   | 334 -----------
 .../solr/AmbariSolrCloudClientBuilder.java      | 215 -------
 .../solr/AmbariSolrCloudClientException.java    |  28 -
 .../solr/commands/AbstractRetryCommand.java     |  58 --
 .../solr/commands/AbstractSolrRetryCommand.java |  53 --
 .../commands/AbstractStateFileZkCommand.java    |  42 --
 .../AbstractZookeeperConfigCommand.java         |  44 --
 .../commands/AbstractZookeeperRetryCommand.java |  40 --
 .../solr/commands/CheckConfigZkCommand.java     |  34 --
 .../solr/commands/CheckZnodeZkCommand.java      |  45 --
 .../solr/commands/CreateCollectionCommand.java  |  62 --
 .../solr/commands/CreateShardCommand.java       |  51 --
 .../solr/commands/CreateSolrZnodeZkCommand.java |  42 --
 .../solr/commands/DownloadConfigZkCommand.java  |  47 --
 .../EnableKerberosPluginSolrZkCommand.java      |  88 ---
 .../solr/commands/GetShardsCommand.java         |  39 --
 .../solr/commands/GetSolrHostsCommand.java      |  53 --
 .../solr/commands/GetStateFileZkCommand.java    |  43 --
 .../solr/commands/ListCollectionCommand.java    |  49 --
 .../solr/commands/SecureSolrZNodeZkCommand.java |  87 ---
 .../solr/commands/SecureZNodeZkCommand.java     |  49 --
 .../commands/SetClusterPropertyZkCommand.java   |  40 --
 .../solr/commands/UpdateStateFileZkCommand.java |  84 ---
 .../solr/commands/UploadConfigZkCommand.java    |  42 --
 .../logsearch/solr/domain/AmbariSolrState.java  |  26 -
 .../ambari/logsearch/solr/util/AclUtils.java    |  87 ---
 .../ambari/logsearch/solr/util/ShardUtils.java  |  71 ---
 .../src/main/resources/log4j.properties         |  31 -
 .../src/main/resources/solrCloudCli.sh          |  20 -
 .../solr/AmbariSolrCloudClientTest.java         | 134 -----
 ambari-logsearch/docker/Dockerfile              |   4 +-
 ambari-logsearch/pom.xml                        |   2 +-
 70 files changed, 2787 insertions(+), 2791 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/build.xml
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-infra-solr-client/build.xml 
b/ambari-logsearch/ambari-infra-solr-client/build.xml
new file mode 100644
index 0000000..a54e336
--- /dev/null
+++ b/ambari-logsearch/ambari-infra-solr-client/build.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+   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
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   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.
+-->
+<project basedir="." default="build" name="logsearch">
+  <property environment="env"/>
+  <property name="debuglevel" value="source,lines,vars"/>
+  <dirname property="builddir" file="build.xml"/>
+  <property name="target" value="1.7"/>
+  <property name="source" value="1.7"/>
+  <target name="init">
+  </target>
+  <target name="build"/>
+
+  <target name="package">
+    <delete dir="target/package"/>
+    <copy todir="target/package/libs" includeEmptyDirs="no">
+      <fileset dir="target/libs"/>
+    </copy>
+    <copy todir="target/package/libs" includeEmptyDirs="no">
+      <fileset file="target/*.jar"/>
+    </copy>
+    <copy todir="target/package" includeEmptyDirs="no">
+      <fileset file="src/main/resources/solrCloudCli.sh"/>
+    </copy>
+    <copy todir="target/package" includeEmptyDirs="no">
+      <fileset file="src/main/resources/log4j.properties"/>
+    </copy>
+    <chmod file="target/package/*.sh" perm="755"/>
+    <tar compression="gzip" destfile="target/ambari-infra-solr-client.tar.gz">
+      <tarfileset mode="755" dir="target/package">
+        <include name="*.sh"/>
+      </tarfileset>
+      <tarfileset mode="664" dir="target/package">
+        <exclude name="*.sh"/>
+      </tarfileset>
+    </tar>
+
+  </target>
+
+  <target description="Build all projects which reference this project. Useful 
to propagate changes."
+          name="build-refprojects"/>
+</project>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-infra-solr-client/pom.xml 
b/ambari-logsearch/ambari-infra-solr-client/pom.xml
new file mode 100644
index 0000000..228d969
--- /dev/null
+++ b/ambari-logsearch/ambari-infra-solr-client/pom.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0"?>
+<!--
+   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
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <parent>
+    <artifactId>ambari-logsearch</artifactId>
+    <groupId>org.apache.ambari</groupId>
+    <version>2.0.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <url>http://maven.apache.org</url>
+  <name>Ambari Infra Solr Client</name>
+
+  <artifactId>ambari-infra-solr-client</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.solr</groupId>
+      <artifactId>solr-solrj</artifactId>
+      <version>${solr.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-cli</groupId>
+      <artifactId>commons-cli</artifactId>
+      <version>1.3.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-mapper-asl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.easymock</groupId>
+      <artifactId>easymock</artifactId>
+      <version>3.4</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <version>2.8</version>
+        <executions>
+          <execution>
+            <id>copy-dependencies</id>
+            <phase>package</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
+              <outputDirectory>${basedir}/target/libs</outputDirectory>
+              <overWriteReleases>false</overWriteReleases>
+              <overWriteSnapshots>false</overWriteSnapshots>
+              <overWriteIfNewer>true</overWriteIfNewer>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <version>1.7</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <configuration>
+              <target>
+                <ant antfile="build.xml">
+                  <target name="package"/>
+                </ant>
+              </target>
+            </configuration>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
new file mode 100644
index 0000000..5cde9ea
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudCLI.java
@@ -0,0 +1,565 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class AmbariSolrCloudCLI {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(AmbariSolrCloudCLI.class);
+
+  private static final int ZK_CLIENT_TIMEOUT = 15000;
+  private static final int ZK_CLIENT_CONNECT_TIMEOUT = 15000;
+  private static final String CREATE_COLLECTION_COMMAND = "create-collection";
+  private static final String UPLOAD_CONFIG_COMMAND = "upload-config";
+  private static final String DOWNLOAD_CONFIG_COMMAND = "download-config";
+  private static final String CONFIG_CHECK_COMMAND = "check-config";
+  private static final String CREATE_SHARD_COMMAND = "create-shard";
+  private static final String CREATE_ZNODE = "create-znode";
+  private static final String SET_CLUSTER_PROP = "cluster-prop";
+  private static final String SETUP_KERBEROS_PLUGIN = "setup-kerberos-plugin";
+  private static final String CHECK_ZNODE = "check-znode";
+  private static final String SECURE_ZNODE_COMMAND = "secure-znode";
+  private static final String SECURE_SOLR_ZNODE_COMMAND = "secure-solr-znode";
+  private static final String SECURITY_JSON_LOCATION = 
"security-json-location";
+  private static final String CMD_LINE_SYNTAX =
+    "\n./solrCloudCli.sh --create-collection -z 
host1:2181,host2:2181/ambari-solr -c collection -cs conf_set"
+      + "\n./solrCloudCli.sh --upload-config -z 
host1:2181,host2:2181/ambari-solr -d /tmp/myconfig_dir -cs config_set"
+      + "\n./solrCloudCli.sh --download-config -z 
host1:2181,host2:2181/ambari-solr -cs config_set -d /tmp/myonfig_dir"
+      + "\n./solrCloudCli.sh --check-config -z 
host1:2181,host2:2181/ambari-solr -cs config_set"
+      + "\n./solrCloudCli.sh --create-shard -z 
host1:2181,host2:2181/ambari-solr -c collection -sn myshard"
+      + "\n./solrCloudCli.sh --create-znode -z host1:2181,host2:2181 -zn 
/ambari-solr"
+      + "\n./solrCloudCli.sh --check-znode -z host1:2181,host2:2181 -zn 
/ambari-solr"
+      + "\n./solrCloudCli.sh --cluster-prop -z 
host1:2181,host2:2181/ambari-solr -cpn urlScheme -cpn http"
+      + "\n./solrCloudCli.sh --secure-znode -z host1:2181,host2:2181 -zn 
/ambari-solr -su logsearch,atlas,ranger --jaas-file /etc/myconf/jaas_file"
+      + "\n./solrCloudCli.sh --secure-solr-znode -z host1:2181,host2:2181 -zn 
/ambari-solr -su logsearch,atlas,ranger --jaas-file /etc/myconf/jaas_file"
+      + "\n./solrCloudCli.sh --setup-kerberos-plugin -z host1:2181,host2:2181 
-zn /ambari-solr --security-json-location /etc/infra-solr/conf/security.json\n";
+
+  public static void main(String[] args) {
+    Options options = new Options();
+    HelpFormatter helpFormatter = new HelpFormatter();
+    helpFormatter.setDescPadding(10);
+    helpFormatter.setWidth(200);
+
+    final Option helpOption = Option.builder("h")
+      .longOpt("help")
+      .desc("Print commands")
+      .build();
+
+    final Option createCollectionOption = Option.builder("cc")
+      .longOpt(CREATE_COLLECTION_COMMAND)
+      .desc("Create collection in Solr (command)")
+      .build();
+
+    final Option uploadConfigurationOption = Option.builder("uc")
+      .longOpt(UPLOAD_CONFIG_COMMAND)
+      .desc("Upload configuration set to Zookeeper (command)")
+      .build();
+
+    final Option downloadConfigOption = Option.builder("dc")
+      .longOpt(DOWNLOAD_CONFIG_COMMAND)
+      .desc("Download configuration set from Zookeeper (command)")
+      .build();
+
+    final Option checkConfigOption = Option.builder("chc")
+      .longOpt(CONFIG_CHECK_COMMAND)
+      .desc("Check configuration exists in Zookeeper (command)")
+      .build();
+
+    final Option checkZnodeOption = Option.builder("chz")
+      .longOpt(CHECK_ZNODE)
+      .desc("Check znode exists in Zookeeper (command)")
+      .build();
+
+    final Option createShardOption = Option.builder("csh")
+      .longOpt(CREATE_SHARD_COMMAND)
+      .desc("Create shard in Solr (command)")
+      .build();
+
+    final Option setClusterPropOption = Option.builder("cp")
+      .longOpt(SET_CLUSTER_PROP)
+      .desc("Set cluster property (command)")
+      .build();
+
+    final Option createZnodeOption = Option.builder("cz")
+      .longOpt(CREATE_ZNODE)
+      .desc("Create Znode (command)")
+      .build();
+
+    final Option setupKerberosPluginOption = Option.builder("skp")
+      .longOpt(SETUP_KERBEROS_PLUGIN)
+      .desc("Setup kerberos plugin in security.json (command)")
+      .build();
+
+    final Option secureSolrZnodeOption = Option.builder("ssz")
+      .longOpt(SECURE_SOLR_ZNODE_COMMAND)
+      .desc("Set acls for solr znode")
+      .build();
+
+    final Option secureZnodeOption = Option.builder("sz")
+      .longOpt(SECURE_ZNODE_COMMAND)
+      .desc("Set acls for znode")
+      .build();
+
+    final Option shardNameOption = Option.builder("sn")
+      .longOpt("shard-name")
+      .desc("Name of the shard for create-shard command")
+      .numberOfArgs(1)
+      .argName("my_new_shard")
+      .build();
+
+    final Option disableShardingOption = Option.builder("ns")
+      .longOpt("no-sharding")
+      .desc("Sharding not used when creating collection")
+      .build();
+
+    final Option zkConnectStringOption = Option.builder("z")
+      .longOpt("zookeeper-connect-string")
+      .desc("Zookeeper quorum [and Znode (optional)]")
+      .numberOfArgs(1)
+      .argName("host:port,host:port[/ambari-solr]")
+      .build();
+
+    final Option znodeOption = Option.builder("zn")
+      .longOpt("znode")
+      .desc("Zookeeper ZNode")
+      .numberOfArgs(1)
+      .argName("/ambari-solr")
+      .build();
+
+    final Option collectionOption = Option.builder("c")
+      .longOpt("collection")
+      .desc("Collection name")
+      .numberOfArgs(1)
+      .argName("collection name")
+      .build();
+
+    final Option configSetOption = Option.builder("cs")
+      .longOpt("config-set")
+      .desc("Configuration set")
+      .numberOfArgs(1)
+      .argName("config_set")
+      .build();
+
+    final Option configDirOption = Option.builder("d")
+      .longOpt("config-dir")
+      .desc("Configuration directory")
+      .numberOfArgs(1)
+      .argName("config_dir")
+      .build();
+
+    final Option shardsOption = Option.builder("s")
+      .longOpt("shards")
+      .desc("Number of shards")
+      .numberOfArgs(1)
+      .argName("shard number")
+      .type(Integer.class)
+      .build();
+
+    final Option replicationOption = Option.builder("r")
+      .longOpt("replication")
+      .desc("Replication factor")
+      .numberOfArgs(1)
+      .argName("replication factor")
+      .type(Integer.class)
+      .build();
+
+    final Option retryOption = Option.builder("rt")
+      .longOpt("retry")
+      .desc("Number of retries for access Solr [default:10]")
+      .numberOfArgs(1)
+      .argName("number of retries")
+      .type(Integer.class)
+      .build();
+
+    final Option intervalOption = Option.builder("i")
+      .longOpt("interval")
+      .desc("Interval for retry logic in sec [default:5]")
+      .numberOfArgs(1)
+      .argName("interval")
+      .type(Integer.class)
+      .build();
+
+    final Option maxShardsOption = Option.builder("m")
+      .longOpt("max-shards")
+      .desc("Max number of shards per node (default: replication * shards)")
+      .numberOfArgs(1)
+      .argName("max number of shards")
+      .build();
+
+    final Option routerNameOption = Option.builder("rn")
+      .longOpt("router-name")
+      .desc("Router name for collection [default:implicit]")
+      .numberOfArgs(1)
+      .argName("router_name")
+      .build();
+
+    final Option routerFieldOption = Option.builder("rf")
+      .longOpt("router-field")
+      .desc("Router field for collection [default:_router_field_]")
+      .numberOfArgs(1)
+      .argName("router_field")
+      .build();
+
+    final Option jaasFileOption = Option.builder("jf")
+      .longOpt("jaas-file")
+      .desc("Location of the jaas-file to communicate with kerberized Solr")
+      .numberOfArgs(1)
+      .argName("jaas_file")
+      .build();
+
+    final Option keyStoreLocationOption = Option.builder("ksl")
+      .longOpt("key-store-location")
+      .desc("Location of the key store used to communicate with Solr using 
SSL")
+      .numberOfArgs(1)
+      .argName("key store location")
+      .build();
+
+    final Option keyStorePasswordOption = Option.builder("ksp")
+      .longOpt("key-store-password")
+      .desc("Key store password used to communicate with Solr using SSL")
+      .numberOfArgs(1)
+      .argName("key store password")
+      .build();
+
+    final Option keyStoreTypeOption = Option.builder("kst")
+      .longOpt("key-store-type")
+      .desc("Type of the key store used to communicate with Solr using SSL")
+      .numberOfArgs(1)
+      .argName("key store type")
+      .build();
+
+    final Option trustStoreLocationOption = Option.builder("tsl")
+      .longOpt("trust-store-location")
+      .desc("Location of the trust store used to communicate with Solr using 
SSL")
+      .numberOfArgs(1)
+      .argName("trust store location")
+      .build();
+
+    final Option trustStorePasswordOption = Option.builder("tsp")
+      .longOpt("trust-store-password")
+      .desc("Trust store password used to communicate with Solr using SSL")
+      .numberOfArgs(1)
+      .argName("trust store password")
+      .build();
+
+    final Option trustStoreTypeOption = Option.builder("tst")
+      .longOpt("trust-store-type")
+      .desc("Type of the trust store used to communicate with Solr using SSL")
+      .numberOfArgs(1)
+      .argName("trust store type")
+      .build();
+
+    final Option propNameOption = Option.builder("cpn")
+      .longOpt("property-name")
+      .desc("Cluster property name")
+      .numberOfArgs(1)
+      .argName("cluster prop name")
+      .build();
+
+    final Option propValueOption = Option.builder("cpv")
+      .longOpt("property-value")
+      .desc("Cluster property value")
+      .numberOfArgs(1)
+      .argName("cluster prop value")
+      .build();
+
+    final Option copyFromZnodeOption = Option.builder("cfz")
+      .longOpt("copy-from-znode")
+      .desc("Copy-from-znode")
+      .numberOfArgs(1)
+      .argName("/ambari-solr-secure")
+      .build();
+
+    final Option saslUsersOption = Option.builder("su")
+      .longOpt("sasl-users")
+      .desc("Sasl users (comma separated list)")
+      .numberOfArgs(1)
+      .argName("atlas,ranger,logsearch-solr")
+      .build();
+
+    final Option securityJsonLocationOption = Option.builder("sjl")
+      .longOpt(SECURITY_JSON_LOCATION)
+      .desc("Local security.json path")
+      .numberOfArgs(1)
+      .argName("security.json location")
+      .build();
+
+    final Option secureOption = Option.builder("sec")
+      .longOpt("secure")
+      .desc("Flag for enable/disable kerberos (with --setup-kerberos or 
--setup-kerberos-plugin)")
+      .build();
+
+    options.addOption(helpOption);
+    options.addOption(retryOption);
+    options.addOption(intervalOption);
+    options.addOption(zkConnectStringOption);
+    options.addOption(configSetOption);
+    options.addOption(configDirOption);
+    options.addOption(collectionOption);
+    options.addOption(secureZnodeOption);
+    options.addOption(secureSolrZnodeOption);
+    options.addOption(shardsOption);
+    options.addOption(replicationOption);
+    options.addOption(maxShardsOption);
+    options.addOption(routerNameOption);
+    options.addOption(routerFieldOption);
+    options.addOption(shardNameOption);
+    options.addOption(disableShardingOption);
+    options.addOption(createCollectionOption);
+    options.addOption(downloadConfigOption);
+    options.addOption(uploadConfigurationOption);
+    options.addOption(checkConfigOption);
+    options.addOption(createShardOption);
+    options.addOption(jaasFileOption);
+    options.addOption(keyStoreLocationOption);
+    options.addOption(keyStorePasswordOption);
+    options.addOption(keyStoreTypeOption);
+    options.addOption(trustStoreLocationOption);
+    options.addOption(trustStorePasswordOption);
+    options.addOption(trustStoreTypeOption);
+    options.addOption(setClusterPropOption);
+    options.addOption(propNameOption);
+    options.addOption(propValueOption);
+    options.addOption(createZnodeOption);
+    options.addOption(znodeOption);
+    options.addOption(secureOption);
+    options.addOption(copyFromZnodeOption);
+    options.addOption(saslUsersOption);
+    options.addOption(checkZnodeOption);
+    options.addOption(setupKerberosPluginOption);
+    options.addOption(securityJsonLocationOption);
+
+    AmbariSolrCloudClient solrCloudClient = null;
+
+    try {
+      CommandLineParser cmdLineParser = new DefaultParser();
+      CommandLine cli = cmdLineParser.parse(options, args);
+
+      if(cli.hasOption('h')) {
+        helpFormatter.printHelp("sample", options);
+        exit(0, null);
+      }
+      String command = "";
+      if (cli.hasOption("cc")) {
+        command = CREATE_COLLECTION_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
collectionOption, configSetOption);
+      } else if (cli.hasOption("uc")) {
+        command = UPLOAD_CONFIG_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
configSetOption, configDirOption);
+      } else if (cli.hasOption("dc")) {
+        command = DOWNLOAD_CONFIG_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
configSetOption, configDirOption);
+      } else if (cli.hasOption("csh")) {
+        command = CREATE_SHARD_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
collectionOption, shardNameOption);
+      } else if (cli.hasOption("chc")) {
+        command = CONFIG_CHECK_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
configSetOption);
+      } else if (cli.hasOption("cp")) {
+        command = SET_CLUSTER_PROP;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
propNameOption, propValueOption);
+      } else if (cli.hasOption("cz")) {
+        command = CREATE_ZNODE;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
znodeOption);
+      } else if (cli.hasOption("chz")){
+        command = CHECK_ZNODE;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
znodeOption);
+      } else if (cli.hasOption("skp")) {
+        command = SETUP_KERBEROS_PLUGIN;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
znodeOption);
+      } else if (cli.hasOption("sz")) {
+        command = SECURE_ZNODE_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
znodeOption, jaasFileOption, saslUsersOption);
+      } else if (cli.hasOption("ssz")) {
+        command = SECURE_SOLR_ZNODE_COMMAND;
+        validateRequiredOptions(cli, command, zkConnectStringOption, 
znodeOption, jaasFileOption, saslUsersOption);
+      } else {
+        List<String> commands = Arrays.asList(CREATE_COLLECTION_COMMAND, 
CREATE_SHARD_COMMAND, UPLOAD_CONFIG_COMMAND,
+          DOWNLOAD_CONFIG_COMMAND, CONFIG_CHECK_COMMAND, SET_CLUSTER_PROP, 
CREATE_ZNODE, SECURE_ZNODE_COMMAND,
+          SECURE_SOLR_ZNODE_COMMAND, CHECK_ZNODE, SETUP_KERBEROS_PLUGIN);
+        helpFormatter.printHelp(CMD_LINE_SYNTAX, options);
+        exit(1, String.format("One of the supported commands is required 
(%s)", StringUtils.join(commands, "|")));
+      }
+
+      String zkConnectString = cli.getOptionValue('z');
+      String collection = cli.getOptionValue('c');
+      String configSet = cli.getOptionValue("cs");
+      String configDir = cli.getOptionValue("d");
+      int shards = cli.hasOption('s') ? 
Integer.parseInt(cli.getOptionValue('s')) : 1;
+      int replication = cli.hasOption('r') ? 
Integer.parseInt(cli.getOptionValue('r')) : 1;
+      int retry = cli.hasOption("rt") ? 
Integer.parseInt(cli.getOptionValue("rt")) : 5;
+      int interval = cli.hasOption('i') ? 
Integer.parseInt(cli.getOptionValue('i')) : 10;
+      int maxShards = cli.hasOption('m') ? 
Integer.parseInt(cli.getOptionValue('m')) : shards * replication;
+      String routerName = cli.hasOption("rn") ? cli.getOptionValue("rn") : 
null;
+      String routerField = cli.hasOption("rf") ? cli.getOptionValue("rf") : 
null;
+      String shardName = cli.hasOption("sn") ? cli.getOptionValue("sn") : null;
+      boolean isSplitting = !cli.hasOption("ns");
+      String jaasFile = cli.hasOption("jf") ? cli.getOptionValue("jf") : null;
+      String keyStoreLocation = cli.hasOption("ksl") ? 
cli.getOptionValue("ksl") : null;
+      String keyStorePassword = cli.hasOption("ksp") ? 
cli.getOptionValue("ksp") : null;
+      String keyStoreType = cli.hasOption("kst") ? cli.getOptionValue("kst") : 
null;
+      String trustStoreLocation = cli.hasOption("tsl") ? 
cli.getOptionValue("tsl") : null;
+      String trustStorePassword = cli.hasOption("tsp") ? 
cli.getOptionValue("tsp") : null;
+      String trustStoreType = cli.hasOption("tst") ? cli.getOptionValue("tst") 
: null;
+      String clusterPropName = cli.hasOption("cpn") ? 
cli.getOptionValue("cpn") : null;
+      String clusterPropValue = cli.hasOption("cpv") ? 
cli.getOptionValue("cpv") : null;
+      String znode = cli.hasOption("zn") ? cli.getOptionValue("zn") : null;
+      boolean isSecure = cli.hasOption("sec");
+      String saslUsers = cli.hasOption("su") ? cli.getOptionValue("su") : "";
+      String securityJsonLocation = cli.hasOption("sjl") ? 
cli.getOptionValue("sjl") : "";
+
+      AmbariSolrCloudClientBuilder clientBuilder = new 
AmbariSolrCloudClientBuilder()
+        .withZkConnectString(zkConnectString)
+        .withCollection(collection)
+        .withConfigSet(configSet)
+        .withShards(shards)
+        .withReplication(replication)
+        .withMaxShardsPerNode(maxShards)
+        .withRetry(retry)
+        .withInterval(interval)
+        .withRouterName(routerName)
+        .withRouterField(routerField)
+        .withJaasFile(jaasFile) // call before creating SolrClient
+        .withSplitting(isSplitting)
+        .withSolrZkClient(ZK_CLIENT_TIMEOUT, ZK_CLIENT_CONNECT_TIMEOUT)
+        .withKeyStoreLocation(keyStoreLocation)
+        .withKeyStorePassword(keyStorePassword)
+        .withKeyStoreType(keyStoreType)
+        .withTrustStoreLocation(trustStoreLocation)
+        .withTrustStorePassword(trustStorePassword)
+        .withTrustStoreType(trustStoreType)
+        .withClusterPropName(clusterPropName)
+        .withClusterPropValue(clusterPropValue)
+        .withSecurityJsonLocation(securityJsonLocation)
+        .withZnode(znode)
+        .withSecure(isSecure)
+        .withSaslUsers(saslUsers);
+
+      switch (command) {
+        case CREATE_COLLECTION_COMMAND:
+          solrCloudClient = clientBuilder
+            .withSolrCloudClient()
+            .build();
+          solrCloudClient.createCollection();
+          break;
+        case UPLOAD_CONFIG_COMMAND:
+          solrCloudClient = clientBuilder
+            .withConfigDir(configDir)
+            .build();
+          solrCloudClient.uploadConfiguration();
+          break;
+        case DOWNLOAD_CONFIG_COMMAND:
+          solrCloudClient = clientBuilder
+            .withConfigDir(configDir)
+            .build();
+          solrCloudClient.downloadConfiguration();
+          break;
+        case CONFIG_CHECK_COMMAND:
+          solrCloudClient = clientBuilder.build();
+          boolean configExists = solrCloudClient.configurationExists();
+          if (!configExists) {
+            exit(1, null);
+          }
+          break;
+        case CREATE_SHARD_COMMAND:
+          solrCloudClient = clientBuilder
+            .withSolrCloudClient()
+            .build();
+          solrCloudClient.createShard(shardName);
+          break;
+        case SET_CLUSTER_PROP:
+          solrCloudClient = clientBuilder.build();
+          solrCloudClient.setClusterProp();
+          break;
+        case CREATE_ZNODE:
+          solrCloudClient = clientBuilder.build();
+          solrCloudClient.createZnode();
+          break;
+        case CHECK_ZNODE:
+          solrCloudClient = clientBuilder.build();
+          boolean znodeExists = solrCloudClient.isZnodeExists(znode);
+          if (!znodeExists) {
+            exit(1, String.format("'%s' znode does not exist. Solr is 
responsible to create the ZNode, " +
+              "check Solr started successfully or not", znode));
+          }
+          break;
+        case SETUP_KERBEROS_PLUGIN:
+          solrCloudClient = clientBuilder.build();
+          solrCloudClient.setupKerberosPlugin();
+          break;
+        case SECURE_ZNODE_COMMAND:
+          solrCloudClient = clientBuilder.build();
+          solrCloudClient.secureZnode();
+          break;
+        case SECURE_SOLR_ZNODE_COMMAND:
+          solrCloudClient = clientBuilder.build();
+          solrCloudClient.secureSolrZnode();
+          break;
+        default:
+          throw new AmbariSolrCloudClientException(String.format("Not found 
command: '%s'", command));
+      }
+    } catch (Exception e) {
+      helpFormatter.printHelp(
+        CMD_LINE_SYNTAX, options);
+      exit(1, e.getMessage());
+    } finally {
+      if (solrCloudClient != null && solrCloudClient.getSolrZkClient() != 
null) {
+        solrCloudClient.getSolrZkClient().close();
+      }
+    }
+    exit(0, null);
+  }
+
+  private static void validateRequiredOptions(CommandLine cli, String command, 
Option... optionsToValidate)
+    throws AmbariSolrCloudClientException {
+    List<String> requiredOptions = new ArrayList<>();
+    for (Option opt : optionsToValidate) {
+      if (!cli.hasOption(opt.getOpt())) {
+        requiredOptions.add(opt.getOpt());
+      }
+    }
+    if (!requiredOptions.isEmpty()) {
+      throw new AmbariSolrCloudClientException(
+        String.format("The following options required for '%s' : %s",
+          command, StringUtils.join(requiredOptions, ",")));
+    }
+  }
+
+  private static void exit(int exitCode, String message) {
+    if (message != null){
+      LOG.error(message);
+    }
+    LOG.info("Return code: {}", exitCode);
+    System.exit(exitCode);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClient.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClient.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClient.java
new file mode 100644
index 0000000..ff28664
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClient.java
@@ -0,0 +1,334 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr;
+
+import org.apache.ambari.infra.solr.commands.CheckConfigZkCommand;
+import org.apache.ambari.infra.solr.commands.CreateCollectionCommand;
+import org.apache.ambari.infra.solr.commands.CreateShardCommand;
+import org.apache.ambari.infra.solr.commands.CreateSolrZnodeZkCommand;
+import org.apache.ambari.infra.solr.commands.DownloadConfigZkCommand;
+import org.apache.ambari.infra.solr.commands.EnableKerberosPluginSolrZkCommand;
+import org.apache.ambari.infra.solr.commands.GetShardsCommand;
+import org.apache.ambari.infra.solr.commands.GetSolrHostsCommand;
+import org.apache.ambari.infra.solr.commands.ListCollectionCommand;
+import org.apache.ambari.infra.solr.commands.SecureSolrZNodeZkCommand;
+import org.apache.ambari.infra.solr.commands.SecureZNodeZkCommand;
+import org.apache.ambari.infra.solr.commands.SetClusterPropertyZkCommand;
+import org.apache.ambari.infra.solr.commands.UploadConfigZkCommand;
+import org.apache.ambari.infra.solr.commands.CheckZnodeZkCommand;
+import org.apache.ambari.infra.solr.util.ShardUtils;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Client for communicate with Solr (and Zookeeper)
+ */
+public class AmbariSolrCloudClient {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(AmbariSolrCloudClient.class);
+
+  private final String zkConnectString;
+  private final String collection;
+  private final String configSet;
+  private final String configDir;
+  private final int shards;
+  private final int replication;
+  private final int retryTimes;
+  private final int interval;
+  private final CloudSolrClient solrCloudClient;
+  private final SolrZkClient solrZkClient;
+  private final int maxShardsPerNode;
+  private final String routerName;
+  private final String routerField;
+  private final boolean splitting;
+  private final String jaasFile;
+  private final String znode;
+  private final String saslUsers;
+  private final String propName;
+  private final String propValue;
+  private final String securityJsonLocation;
+  private final boolean secure;
+
+  public AmbariSolrCloudClient(AmbariSolrCloudClientBuilder builder) {
+    this.zkConnectString = builder.zkConnectString;
+    this.collection = builder.collection;
+    this.configSet = builder.configSet;
+    this.configDir = builder.configDir;
+    this.shards = builder.shards;
+    this.replication = builder.replication;
+    this.retryTimes = builder.retryTimes;
+    this.interval = builder.interval;
+    this.jaasFile = builder.jaasFile;
+    this.solrCloudClient = builder.solrCloudClient;
+    this.solrZkClient = builder.solrZkClient;
+    this.maxShardsPerNode = builder.maxShardsPerNode;
+    this.routerName = builder.routerName;
+    this.routerField = builder.routerField;
+    this.splitting = builder.splitting;
+    this.znode = builder.znode;
+    this.saslUsers = builder.saslUsers;
+    this.propName = builder.propName;
+    this.propValue = builder.propValue;
+    this.securityJsonLocation = builder.securityJsonLocation;
+    this.secure = builder.secure;
+  }
+
+  /**
+   * Get Solr collections
+   */
+  public List<String> listCollections() throws Exception {
+    return new ListCollectionCommand(getRetryTimes(), getInterval()).run(this);
+  }
+
+  /**
+   * Create Solr collection if exists
+   */
+  public String createCollection() throws Exception {
+    List<String> collections = listCollections();
+    if (!collections.contains(getCollection())) {
+      String collection = new CreateCollectionCommand(getRetryTimes(), 
getInterval()).run(this);
+      LOG.info("Collection '{}' created.", collection);
+    } else {
+      LOG.info("Collection '{}' already exits.", getCollection());
+      if (this.isSplitting()) {
+        createShard(null);
+      }
+    }
+    return getCollection();
+  }
+
+  /**
+   * Set cluster property in clusterprops.json.
+   */
+  public void setClusterProp() throws Exception {
+    LOG.info("Set cluster prop: '{}'", this.getPropName());
+    String newPropValue = new SetClusterPropertyZkCommand(getRetryTimes(), 
getInterval()).run(this);
+    LOG.info("Set cluster prop '{}' successfully to '{}'", this.getPropName(), 
newPropValue);
+  }
+
+  /**
+   * Create a znode only if it does not exist. Return 0 code if it exists.
+   */
+  public void createZnode() throws Exception {
+    boolean znodeExists = isZnodeExists(this.znode);
+    if (znodeExists) {
+      LOG.info("Znode '{}' already exists.", this.znode);
+    } else {
+      LOG.info("Znode '{}' does not exist. Creating...", this.znode);
+      String newZnode = new CreateSolrZnodeZkCommand(getRetryTimes(), 
getInterval()).run(this);
+      LOG.info("Znode '{}' is created successfully.", newZnode);
+    }
+  }
+
+  /**
+   * Check znode exists or not based on the zookeeper connect string.
+   * E.g.: localhost:2181 and znode: /ambari-solr, checks existance of 
localhost:2181/ambari-solr
+   */
+  public boolean isZnodeExists(String znode) throws Exception {
+    LOG.info("Check '{}' znode exists or not", znode);
+    boolean result = new CheckZnodeZkCommand(getRetryTimes(), getInterval(), 
znode).run(this);
+    if (result) {
+      LOG.info("'{}' znode exists", znode);
+    } else {
+      LOG.info("'{}' znode does not exist", znode);
+    }
+    return result;
+  }
+
+  public void setupKerberosPlugin() throws Exception {
+    LOG.info("Setup kerberos plugin in security.json");
+    new EnableKerberosPluginSolrZkCommand(getRetryTimes(), 
getInterval()).run(this);
+    LOG.info("KerberosPlugin is set in security.json");
+  }
+
+  /**
+   * Secure solr znode
+   */
+  public void secureSolrZnode() throws Exception {
+    new SecureSolrZNodeZkCommand(getRetryTimes(), getInterval()).run(this);
+  }
+
+  /**
+   * Secure znode
+   */
+  public void secureZnode() throws Exception {
+    new SecureZNodeZkCommand(getRetryTimes(), getInterval()).run(this);
+  }
+
+  /**
+   * Upload config set to zookeeper
+   */
+  public String uploadConfiguration() throws Exception {
+    String configSet = new UploadConfigZkCommand(getRetryTimes(), 
getInterval()).run(this);
+    LOG.info("'{}' is uploaded to zookeeper.", configSet);
+    return configSet;
+  }
+
+  /**
+   * Download config set from zookeeper
+   */
+  public String downloadConfiguration() throws Exception {
+    String configDir = new DownloadConfigZkCommand(getRetryTimes(), 
getInterval()).run(this);
+    LOG.info("Config set is download from zookeeper. ({})", configDir);
+    return configDir;
+  }
+
+  /**
+   * Get configuration if exists in zookeeper
+   */
+  public boolean configurationExists() throws Exception {
+    boolean configExits = new CheckConfigZkCommand(getRetryTimes(), 
getInterval()).run(this);
+    if (configExits) {
+      LOG.info("Config {} exits", configSet);
+    } else {
+      LOG.info("Configuration '{}' does not exist", configSet);
+    }
+    return configExits;
+  }
+
+  /**
+   * Create shard in collection - create a new one if shard name specified, if
+   * not create based on the number of shards logic (with shard_# suffix)
+   * 
+   * @param shard
+   *          name of the created shard
+   */
+  public Collection<String> createShard(String shard) throws Exception {
+    Collection<String> existingShards = getShardNames();
+    if (shard != null) {
+      new CreateShardCommand(shard, getRetryTimes(), getInterval()).run(this);
+      existingShards.add(shard);
+    } else {
+      List<String> shardList = 
ShardUtils.generateShardList(getMaxShardsPerNode());
+      for (String shardName : shardList) {
+        if (!existingShards.contains(shardName)) {
+          new CreateShardCommand(shardName, getRetryTimes(), 
getInterval()).run(this);
+          LOG.info("New shard added to collection '{}': {}", getCollection(), 
shardName);
+          existingShards.add(shardName);
+        }
+      }
+    }
+    return existingShards;
+  }
+
+  /**
+   * Get shard names
+   */
+  public Collection<String> getShardNames() throws Exception {
+    Collection<Slice> slices = new GetShardsCommand(getRetryTimes(), 
getInterval()).run(this);
+    return ShardUtils.getShardNamesFromSlices(slices, this.getCollection());
+  }
+
+  /**
+   * Get Solr Hosts
+   */
+  public Collection<String> getSolrHosts() throws Exception {
+    return new GetSolrHostsCommand(getRetryTimes(), getInterval()).run(this);
+  }
+
+  public String getZkConnectString() {
+    return zkConnectString;
+  }
+
+  public String getCollection() {
+    return collection;
+  }
+
+  public String getConfigSet() {
+    return configSet;
+  }
+
+  public String getConfigDir() {
+    return configDir;
+  }
+
+  public int getShards() {
+    return shards;
+  }
+
+  public int getReplication() {
+    return replication;
+  }
+
+  public int getRetryTimes() {
+    return retryTimes;
+  }
+
+  public int getInterval() {
+    return interval;
+  }
+
+  public CloudSolrClient getSolrCloudClient() {
+    return solrCloudClient;
+  }
+
+  public SolrZkClient getSolrZkClient() {
+    return solrZkClient;
+  }
+
+  public int getMaxShardsPerNode() {
+    return maxShardsPerNode;
+  }
+
+  public String getRouterName() {
+    return routerName;
+  }
+
+  public String getRouterField() {
+    return routerField;
+  }
+
+  public boolean isSplitting() {
+    return splitting;
+  }
+
+  public String getJaasFile() {
+    return jaasFile;
+  }
+
+  public String getSaslUsers() {
+    return saslUsers;
+  }
+
+  public String getZnode() {
+    return znode;
+  }
+
+  public String getPropName() {
+    return propName;
+  }
+
+  public String getPropValue() {
+    return propValue;
+  }
+
+  public boolean isSecure() {
+    return secure;
+  }
+
+  public String getSecurityJsonLocation() {
+    return securityJsonLocation;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientBuilder.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientBuilder.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientBuilder.java
new file mode 100644
index 0000000..54c4ae3
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientBuilder.java
@@ -0,0 +1,215 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr;
+
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.HttpClientUtil;
+import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
+import org.apache.solr.common.cloud.SolrZkClient;
+
+public class AmbariSolrCloudClientBuilder {
+  private static final String KEYSTORE_LOCATION_ARG = "javax.net.ssl.keyStore";
+  private static final String KEYSTORE_PASSWORD_ARG = 
"javax.net.ssl.keyStorePassword";
+  private static final String KEYSTORE_TYPE_ARG = "javax.net.ssl.keyStoreType";
+  private static final String TRUSTSTORE_LOCATION_ARG = 
"javax.net.ssl.trustStore";
+  private static final String TRUSTSTORE_PASSWORD_ARG = 
"javax.net.ssl.trustStorePassword";
+  private static final String TRUSTSTORE_TYPE_ARG = 
"javax.net.ssl.trustStoreType";
+  
+  String zkConnectString;
+  String collection;
+  String configSet;
+  String configDir;
+  int shards = 1;
+  int replication = 1;
+  int retryTimes = 10;
+  int interval = 5;
+  int maxShardsPerNode = replication * shards;
+  String routerName = "implicit";
+  String routerField = "_router_field_";
+  CloudSolrClient solrCloudClient;
+  SolrZkClient solrZkClient;
+  boolean splitting;
+  String jaasFile;
+  String znode;
+  String saslUsers;
+  String propName;
+  String propValue;
+  String securityJsonLocation;
+  boolean secure;
+
+  public AmbariSolrCloudClient build() {
+    return new AmbariSolrCloudClient(this);
+  }
+
+  public AmbariSolrCloudClientBuilder withZkConnectString(String 
zkConnectString) {
+    this.zkConnectString = zkConnectString;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withCollection(String collection) {
+    this.collection = collection;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withConfigSet(String configSet) {
+    this.configSet = configSet;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withConfigDir(String configDir) {
+    this.configDir = configDir;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withShards(int shards) {
+    this.shards = shards;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withReplication(int replication) {
+    this.replication = replication;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withRetry(int retryTimes) {
+    this.retryTimes = retryTimes;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withInterval(int interval) {
+    this.interval = interval;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withMaxShardsPerNode(int 
maxShardsPerNode) {
+    this.maxShardsPerNode = maxShardsPerNode;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withRouterName(String routerName) {
+    this.routerName = routerName;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withRouterField(String routerField) {
+    this.routerField = routerField;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSplitting(boolean splitting) {
+    this.splitting = splitting;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withJaasFile(String jaasFile) {
+    this.jaasFile = jaasFile;
+    setupSecurity(jaasFile);
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSolrCloudClient() {
+    this.solrCloudClient = new CloudSolrClient(this.zkConnectString);
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSolrZkClient(int zkClientTimeout, 
int zkClientConnectTimeout) {
+    this.solrZkClient = new SolrZkClient(this.zkConnectString, 
zkClientTimeout, zkClientConnectTimeout);
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withKeyStoreLocation(String 
keyStoreLocation) {
+    if (keyStoreLocation != null) {
+      System.setProperty(KEYSTORE_LOCATION_ARG, keyStoreLocation);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withKeyStorePassword(String 
keyStorePassword) {
+    if (keyStorePassword != null) {
+      System.setProperty(KEYSTORE_PASSWORD_ARG, keyStorePassword);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withKeyStoreType(String keyStoreType) {
+    if (keyStoreType != null) {
+      System.setProperty(KEYSTORE_TYPE_ARG, keyStoreType);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withTrustStoreLocation(String 
trustStoreLocation) {
+    if (trustStoreLocation != null) {
+      System.setProperty(TRUSTSTORE_LOCATION_ARG, trustStoreLocation);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withTrustStorePassword(String 
trustStorePassword) {
+    if (trustStorePassword != null) {
+      System.setProperty(TRUSTSTORE_PASSWORD_ARG, trustStorePassword);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withTrustStoreType(String 
trustStoreType) {
+    if (trustStoreType != null) {
+      System.setProperty(TRUSTSTORE_TYPE_ARG, trustStoreType);
+    }
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSaslUsers(String saslUsers) {
+    this.saslUsers = saslUsers;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withZnode(String znode) {
+    this.znode = znode;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withClusterPropName(String 
clusterPropName) {
+    this.propName = clusterPropName;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withClusterPropValue(String 
clusterPropValue) {
+    this.propValue = clusterPropValue;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSecurityJsonLocation(String 
securityJson) {
+    this.securityJsonLocation = securityJson;
+    return this;
+  }
+
+  public AmbariSolrCloudClientBuilder withSecure(boolean isSecure) {
+    this.secure = isSecure;
+    return this;
+  }
+
+  private void setupSecurity(String jaasFile) {
+    if (jaasFile != null) {
+      System.setProperty("java.security.auth.login.config", jaasFile);
+      HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientException.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientException.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientException.java
new file mode 100644
index 0000000..d339a77
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientException.java
@@ -0,0 +1,28 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr;
+
+public class AmbariSolrCloudClientException extends Exception{
+  public AmbariSolrCloudClientException(String message) {
+    super(message);
+  }
+  public AmbariSolrCloudClientException(String message, Throwable throwable) {
+    super(message, throwable);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractRetryCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractRetryCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractRetryCommand.java
new file mode 100644
index 0000000..5e87859
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractRetryCommand.java
@@ -0,0 +1,58 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.AmbariSolrCloudClientException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractRetryCommand<RESPONSE> {
+  private static final Logger LOG = 
LoggerFactory.getLogger(AbstractRetryCommand.class);
+
+  private final int interval;
+  private final int maxRetries;
+
+  public AbstractRetryCommand(int maxRetries, int interval) {
+    this.maxRetries = maxRetries;
+    this.interval = interval;
+  }
+
+  public abstract RESPONSE createAndProcessRequest(AmbariSolrCloudClient 
solrCloudClient) throws Exception;
+
+  public RESPONSE run(AmbariSolrCloudClient solrCloudClient) throws Exception {
+    return retry(0, solrCloudClient);
+  }
+
+  private RESPONSE retry(int tries, AmbariSolrCloudClient solrCloudClient) 
throws Exception {
+    try {
+      return createAndProcessRequest(solrCloudClient);
+    } catch (Exception ex) {
+      LOG.error(ex.getMessage(), ex);
+      tries++;
+      LOG.info("Command failed, tries again (tries: {})", tries);
+      if (maxRetries == tries) {
+        throw new AmbariSolrCloudClientException(String.format("Maximum 
retries exceeded: %d", tries), ex);
+      } else {
+        Thread.sleep(interval * 1000);
+        return retry(tries, solrCloudClient);
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractSolrRetryCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractSolrRetryCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractSolrRetryCommand.java
new file mode 100644
index 0000000..fdf26a7
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractSolrRetryCommand.java
@@ -0,0 +1,53 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.AmbariSolrCloudClientException;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+import org.apache.solr.client.solrj.response.SolrResponseBase;
+
+public abstract class AbstractSolrRetryCommand<REQUEST extends 
CollectionAdminRequest, RESPONSE>
+  extends AbstractRetryCommand<RESPONSE> {
+
+  public AbstractSolrRetryCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  public abstract RESPONSE handleResponse(CollectionAdminResponse response, 
AmbariSolrCloudClient client) throws Exception;
+
+  public abstract REQUEST createRequest(AmbariSolrCloudClient client);
+
+  public abstract String errorMessage(AmbariSolrCloudClient client);
+
+  @Override
+  public RESPONSE createAndProcessRequest(AmbariSolrCloudClient client) throws 
Exception {
+    REQUEST request = createRequest(client);
+    CollectionAdminResponse response = (CollectionAdminResponse) 
request.process(client.getSolrCloudClient());
+    handleErrorIfExists(response, errorMessage(client));
+    return handleResponse(response, client);
+  }
+
+  private void handleErrorIfExists(SolrResponseBase response, String message) 
throws AmbariSolrCloudClientException {
+    if (response.getStatus() != 0) {
+      throw new AmbariSolrCloudClientException(message);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractStateFileZkCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractStateFileZkCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractStateFileZkCommand.java
new file mode 100644
index 0000000..b4872e2
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractStateFileZkCommand.java
@@ -0,0 +1,42 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.domain.AmbariSolrState;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+
+public abstract class AbstractStateFileZkCommand extends 
AbstractZookeeperRetryCommand<AmbariSolrState>{
+
+  public static final String STATE_FILE = "ambari-solr-state.json";
+  public static final String STATE_FIELD = "ambari_solr_security_state";
+
+  public AbstractStateFileZkCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  public AmbariSolrState getStateFromJson(AmbariSolrCloudClient client, String 
fileName) throws Exception {
+    byte[] data = client.getSolrZkClient().getData(fileName, null, null, true);
+    String input = new String(data);
+    ObjectMapper mapper = new ObjectMapper();
+    JsonNode rootNode = mapper.readValue(input.getBytes(), JsonNode.class);
+    return AmbariSolrState.valueOf(rootNode.get(STATE_FIELD).asText());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperConfigCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperConfigCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperConfigCommand.java
new file mode 100644
index 0000000..dec34f1
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperConfigCommand.java
@@ -0,0 +1,44 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.SolrZooKeeper;
+import org.apache.solr.common.cloud.ZkConfigManager;
+
+public abstract class AbstractZookeeperConfigCommand<RESPONSE> extends 
AbstractZookeeperRetryCommand<RESPONSE> {
+
+  public AbstractZookeeperConfigCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  protected abstract RESPONSE executeZkConfigCommand(ZkConfigManager 
zkConfigManager, AmbariSolrCloudClient client)
+    throws Exception;
+
+  @Override
+  protected RESPONSE executeZkCommand(AmbariSolrCloudClient client, 
SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception {
+    ZkConfigManager zkConfigManager = createZkConfigManager(zkClient);
+    return executeZkConfigCommand(zkConfigManager, client);
+  }
+
+  protected ZkConfigManager createZkConfigManager(SolrZkClient zkClient) {
+    return new ZkConfigManager(zkClient);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperRetryCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperRetryCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperRetryCommand.java
new file mode 100644
index 0000000..e37088d
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/AbstractZookeeperRetryCommand.java
@@ -0,0 +1,40 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.SolrZooKeeper;
+
+public abstract class AbstractZookeeperRetryCommand<RESPONSE> extends 
AbstractRetryCommand<RESPONSE> {
+
+  public AbstractZookeeperRetryCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  protected abstract RESPONSE executeZkCommand(AmbariSolrCloudClient client, 
SolrZkClient zkClient, SolrZooKeeper solrZooKeeper)
+    throws Exception;
+
+  @Override
+  public RESPONSE createAndProcessRequest(AmbariSolrCloudClient client) throws 
Exception {
+    SolrZkClient zkClient = client.getSolrZkClient();
+    SolrZooKeeper solrZooKeeper = zkClient.getSolrZooKeeper();
+    return executeZkCommand(client, zkClient, solrZooKeeper);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckConfigZkCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckConfigZkCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckConfigZkCommand.java
new file mode 100644
index 0000000..0a03a65
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckConfigZkCommand.java
@@ -0,0 +1,34 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.solr.common.cloud.ZkConfigManager;
+
+public class CheckConfigZkCommand extends 
AbstractZookeeperConfigCommand<Boolean> {
+
+  public CheckConfigZkCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  @Override
+  protected Boolean executeZkConfigCommand(ZkConfigManager zkConfigManager, 
AmbariSolrCloudClient client) throws Exception {
+    return zkConfigManager.configExists(client.getConfigSet());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckZnodeZkCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckZnodeZkCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckZnodeZkCommand.java
new file mode 100644
index 0000000..93eb478
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CheckZnodeZkCommand.java
@@ -0,0 +1,45 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.AmbariSolrCloudClientException;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.SolrZooKeeper;
+import org.apache.zookeeper.KeeperException;
+
+public class CheckZnodeZkCommand extends 
AbstractZookeeperRetryCommand<Boolean> {
+
+  private String znode;
+
+  public CheckZnodeZkCommand(int maxRetries, int interval, String znode) {
+    super(maxRetries, interval);
+    this.znode = znode;
+  }
+
+  @Override
+  protected Boolean executeZkCommand(AmbariSolrCloudClient client, 
SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception {
+    try {
+      return zkClient.exists(this.znode, false);
+    } catch (KeeperException e) {
+      throw new AmbariSolrCloudClientException("Exception during checking 
znode, " +
+        "Check zookeeper servers are running (n+1/2) or zookeeper quorum has 
established or not.", e);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateCollectionCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateCollectionCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateCollectionCommand.java
new file mode 100644
index 0000000..53e96fd
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateCollectionCommand.java
@@ -0,0 +1,62 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.util.ShardUtils;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CreateCollectionCommand extends 
AbstractSolrRetryCommand<CollectionAdminRequest.Create ,String> {
+
+  public CreateCollectionCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  @Override
+  public String handleResponse(CollectionAdminResponse response, 
AmbariSolrCloudClient client) throws Exception {
+    return client.getCollection();
+  }
+
+  @Override
+  public CollectionAdminRequest.Create createRequest(AmbariSolrCloudClient 
client) {
+    CollectionAdminRequest.Create request = new 
CollectionAdminRequest.Create();
+    request.setConfigName(client.getConfigSet());
+    request.setCollectionName(client.getCollection());
+    request.setNumShards(client.getShards());
+    request.setReplicationFactor(client.getReplication());
+    request.setMaxShardsPerNode(client.getMaxShardsPerNode());
+    if (client.getRouterField() != null && client.getRouterName()!= null) {
+      request.setRouterName(client.getRouterName());
+      request.setRouterField(client.getRouterField());
+    }
+    if (client.isSplitting()) {
+      
request.setShards(ShardUtils.generateShardListStr(client.getMaxShardsPerNode()));
+    }
+    return request;
+  }
+
+  @Override
+  public String errorMessage(AmbariSolrCloudClient client) {
+    return String.format("Cannot create collection: '%s'", 
client.getCollection());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateShardCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateShardCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateShardCommand.java
new file mode 100644
index 0000000..9b57827
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateShardCommand.java
@@ -0,0 +1,51 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.CollectionAdminResponse;
+
+public class CreateShardCommand extends 
AbstractSolrRetryCommand<CollectionAdminRequest.CreateShard, String> {
+
+  private final String shardName;
+
+  public CreateShardCommand(String shardName, int maxRetries, int interval) {
+    super(maxRetries, interval);
+    this.shardName = shardName;
+  }
+
+  @Override
+  public String handleResponse(CollectionAdminResponse response, 
AmbariSolrCloudClient client) throws Exception {
+    return shardName;
+  }
+
+  @Override
+  public CollectionAdminRequest.CreateShard 
createRequest(AmbariSolrCloudClient client) {
+    CollectionAdminRequest.CreateShard createShardRequest = new 
CollectionAdminRequest.CreateShard();
+    createShardRequest.setCollectionName(client.getCollection());
+    createShardRequest.setShardName(shardName);
+    return createShardRequest;
+  }
+
+  @Override
+  public String errorMessage(AmbariSolrCloudClient client) {
+    return String.format("Cannot add shard to collection '%s'", 
client.getCollection());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateSolrZnodeZkCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateSolrZnodeZkCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateSolrZnodeZkCommand.java
new file mode 100644
index 0000000..1460a84
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/CreateSolrZnodeZkCommand.java
@@ -0,0 +1,42 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.AmbariSolrCloudClientException;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.SolrZooKeeper;
+import org.apache.zookeeper.KeeperException;
+
+public class CreateSolrZnodeZkCommand extends 
AbstractZookeeperRetryCommand<String> {
+
+  public CreateSolrZnodeZkCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  @Override
+  protected String executeZkCommand(AmbariSolrCloudClient client, SolrZkClient 
zkClient, SolrZooKeeper solrZooKeeper) throws Exception {
+    try {
+      zkClient.makePath(client.getZnode(), true);
+      return client.getZnode();
+    } catch (KeeperException e) {
+      throw new AmbariSolrCloudClientException("Cannot create ZNode, check 
zookeeper servers are running (n+1/2), or zookeeper quorum has established or 
not.",e);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/c5ccb1ab/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/DownloadConfigZkCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/DownloadConfigZkCommand.java
 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/DownloadConfigZkCommand.java
new file mode 100644
index 0000000..990c3c3
--- /dev/null
+++ 
b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/DownloadConfigZkCommand.java
@@ -0,0 +1,47 @@
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.ambari.infra.solr.commands;
+
+import org.apache.ambari.infra.solr.AmbariSolrCloudClient;
+import org.apache.ambari.infra.solr.AmbariSolrCloudClientException;
+import org.apache.solr.common.cloud.ZkConfigManager;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class DownloadConfigZkCommand extends 
AbstractZookeeperConfigCommand<String> {
+
+  public DownloadConfigZkCommand(int maxRetries, int interval) {
+    super(maxRetries, interval);
+  }
+
+  @Override
+  protected String executeZkConfigCommand(ZkConfigManager zkConfigManager, 
AmbariSolrCloudClient client) throws Exception {
+    Path configDir = Paths.get(client.getConfigDir());
+    String configSet = client.getConfigSet();
+    try {
+      zkConfigManager.downloadConfigDir(configSet, configDir);
+      return configDir.toString();
+    } catch (IOException e){
+      throw new AmbariSolrCloudClientException("Error downloading 
configuration set, check Solr Znode has started or not " +
+        "(starting Solr (for Log Search) is responsible to create the Znode)" 
,e);
+    }
+  }
+}

Reply via email to