You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2015/12/15 17:45:22 UTC
ambari git commit: AMBARI-14377 - HiveServer start fails after
enabling security post EU from 2.1 to 2.3 on non-HA cluster (jonathanhurley)
Repository: ambari
Updated Branches:
refs/heads/trunk a9a20f6b9 -> e351b1458
AMBARI-14377 - HiveServer start fails after enabling security post EU from 2.1 to 2.3 on non-HA cluster (jonathanhurley)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e351b145
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e351b145
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e351b145
Branch: refs/heads/trunk
Commit: e351b1458c8de9cb2c30f7ce9b6d1ccf6359fb30
Parents: a9a20f6
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Mon Dec 14 19:08:35 2015 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Tue Dec 15 11:45:13 2015 -0500
----------------------------------------------------------------------
.../upgrades/HiveKerberosConfigAction.java | 115 -------------
.../upgrades/HiveZKQuorumConfigAction.java | 95 +++++++++++
.../HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml | 4 +-
.../stacks/HDP/2.2/upgrades/config-upgrade.xml | 9 +-
.../upgrades/HiveKerberosConfigActionTest.java | 166 -------------------
.../upgrades/HiveZKQuorumConfigActionTest.java | 109 ++++++++++++
6 files changed, 209 insertions(+), 289 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigAction.java
deleted file mode 100644
index 57b5135..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigAction.java
+++ /dev/null
@@ -1,115 +0,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.
- */
-package org.apache.ambari.server.serveraction.upgrades;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-
-import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.actionmanager.HostRoleStatus;
-import org.apache.ambari.server.agent.CommandReport;
-import org.apache.ambari.server.serveraction.AbstractServerAction;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Clusters;
-import org.apache.ambari.server.state.Config;
-
-import com.google.inject.Inject;
-
-/**
- * The {@link HiveKerberosConfigAction} is used to ensure that the following
- * settings are correctly set when upgrading a Keberized Hive Server:
- * <ul>
- * <li>hive.zookeeper.quorum</li>
- * <li>hive.cluster.delegation.token.store.zookeeper.connectString</li>
- * </ul>
- *
- * This is typically only needed when upgrading from a version which does not
- * have these properties. The upgrade merge logic can't do complex calculations,
- * such as the ZK quorum.
- * <p/>
- * The above properties will only be set if {@code cluster-env/security_enabled}
- * is {@code true}.
- */
-public class HiveKerberosConfigAction extends AbstractServerAction {
- protected static final String HIVE_SITE_CONFIG_TYPE = "hive-site";
- protected static final String CLUSTER_ENV_CONFIG_TYPE = "cluster-env";
-
- protected static final String CLUSTER_ENV_SECURITY_ENABLED = "security_enabled";
- protected static final String HIVE_SITE_ZK_QUORUM = "hive.zookeeper.quorum";
- protected static final String HIVE_SITE_ZK_CONNECT_STRING = "hive.cluster.delegation.token.store.zookeeper.connectString";
-
- /**
- * Used for retrieving the cluster (and eventually the desired configuration).
- */
- @Inject
- private Clusters m_clusters;
-
- /**
- * {@inheritDoc}
- */
- @Override
- public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext)
- throws AmbariException, InterruptedException {
-
- String clusterName = getExecutionCommand().getClusterName();
- Cluster cluster = m_clusters.getCluster(clusterName);
-
- Config clusterEnv = cluster.getDesiredConfigByType(CLUSTER_ENV_CONFIG_TYPE);
-
- if (null == clusterEnv) {
- return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
- String.format(
- "The %s configuration type was not found; unable to determine whether Hive is Kerberized",
- CLUSTER_ENV_CONFIG_TYPE),
- "");
- }
-
- // gets the security_enabled property; if it doesn't exist or is blank,
- // Boolean will be false (no need for extra null check)
- Map<String, String> clusterEnvProperties = clusterEnv.getProperties();
- boolean securityEnabled = Boolean.parseBoolean(clusterEnvProperties.get(CLUSTER_ENV_SECURITY_ENABLED));
-
- if (!securityEnabled) {
- return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
- "Hive is not Kerberized, skipping Kerberos-specific configuration properties", "");
- }
-
- Config hiveSite = cluster.getDesiredConfigByType(HIVE_SITE_CONFIG_TYPE);
- if (hiveSite == null) {
- return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
- String.format(
- "The %s configuration type was not found; unable to set Hive configuration properties",
- CLUSTER_ENV_CONFIG_TYPE),
- "");
- }
-
- String zookeeperQuorum = ZooKeeperQuorumCalculator.getZooKeeperQuorumString(cluster);
-
- Map<String, String> hiveSiteProperties = hiveSite.getProperties();
- hiveSiteProperties.put(HIVE_SITE_ZK_QUORUM, zookeeperQuorum);
- hiveSiteProperties.put(HIVE_SITE_ZK_CONNECT_STRING, zookeeperQuorum);
-
- hiveSite.setProperties(hiveSiteProperties);
- hiveSite.persist(false);
-
- return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
- String.format("Successfully set %s and %s in %s", HIVE_SITE_ZK_QUORUM,
- HIVE_SITE_ZK_CONNECT_STRING, HIVE_SITE_CONFIG_TYPE),
- "");
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigAction.java
new file mode 100644
index 0000000..0ade30b
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigAction.java
@@ -0,0 +1,95 @@
+/**
+ * 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.server.serveraction.upgrades;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.serveraction.AbstractServerAction;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+
+import com.google.inject.Inject;
+
+/**
+ * The {@link HiveZKQuorumConfigAction} is used to ensure that the following
+ * settings are correctly set when upgrading a Hive Server:
+ * <ul>
+ * <li>hive.zookeeper.quorum</li>
+ * <li>hive.cluster.delegation.token.store.zookeeper.connectString</li>
+ * </ul>
+ * <p/>
+ * This is typically only needed when upgrading from a version which does not
+ * have these properties but where the Hive server is already Kerberized. The
+ * upgrade merge logic can't do complex calculations, such as the ZK quorum.
+ * <p/>
+ * The above properties will be set regardless of whether
+ * {@code cluster-env/security_enabled} is {@code true}. This is because the
+ * Kerberization wizard doesn't know to set these when Kerberizing a version of
+ * Hive that was upgraded previously. They are actually set (incorrectly) on a
+ * non-Kerberized Hive installation by the installation wizard.
+ */
+public class HiveZKQuorumConfigAction extends AbstractServerAction {
+ protected static final String HIVE_SITE_CONFIG_TYPE = "hive-site";
+ protected static final String HIVE_SITE_ZK_QUORUM = "hive.zookeeper.quorum";
+ protected static final String HIVE_SITE_ZK_CONNECT_STRING = "hive.cluster.delegation.token.store.zookeeper.connectString";
+
+ /**
+ * Used for retrieving the cluster (and eventually the desired configuration).
+ */
+ @Inject
+ private Clusters m_clusters;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext)
+ throws AmbariException, InterruptedException {
+
+ String clusterName = getExecutionCommand().getClusterName();
+ Cluster cluster = m_clusters.getCluster(clusterName);
+
+ Config hiveSite = cluster.getDesiredConfigByType(HIVE_SITE_CONFIG_TYPE);
+ if (hiveSite == null) {
+ return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
+ String.format(
+ "The %s configuration type was not found; unable to set Hive configuration properties",
+ HIVE_SITE_CONFIG_TYPE),
+ "");
+ }
+
+ String zookeeperQuorum = ZooKeeperQuorumCalculator.getZooKeeperQuorumString(cluster);
+
+ Map<String, String> hiveSiteProperties = hiveSite.getProperties();
+ hiveSiteProperties.put(HIVE_SITE_ZK_QUORUM, zookeeperQuorum);
+ hiveSiteProperties.put(HIVE_SITE_ZK_CONNECT_STRING, zookeeperQuorum);
+
+ hiveSite.setProperties(hiveSiteProperties);
+ hiveSite.persist(false);
+
+ return createCommandReport(0, HostRoleStatus.COMPLETED, "{}",
+ String.format("Successfully set %s and %s in %s", HIVE_SITE_ZK_QUORUM,
+ HIVE_SITE_ZK_CONNECT_STRING, HIVE_SITE_CONFIG_TYPE),
+ "");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
index 02cc107..fff9c97 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/upgrades/nonrolling-upgrade-2.3.xml
@@ -293,11 +293,11 @@
<!--HIVE-->
<execute-stage service="HIVE" component="HIVE_SERVER" title="Apply config changes for Hive Server">
- <task xsi:type="server_action" summary="Calculating Kerberos Properties for Hive" class="org.apache.ambari.server.serveraction.upgrades.HiveKerberosConfigAction" />
+ <task xsi:type="server_action" summary="Calculating ZooKeeper Quorum Properties for Hive" class="org.apache.ambari.server.serveraction.upgrades.HiveZKQuorumConfigAction" />
</execute-stage>
<execute-stage service="HIVE" component="HIVE_SERVER" title="Apply config changes for Hive Server">
- <task xsi:type="configure" id="hdp_2_2_0_0_hive_server_kerberized_token_store_class"/>
+ <task xsi:type="configure" id="hdp_2_2_0_0_hive_server_delegation_token_store_class"/>
</execute-stage>
<execute-stage service="HIVE" component="HIVE_SERVER" title="Apply config changes for Hive Server">
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/config-upgrade.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/config-upgrade.xml b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/config-upgrade.xml
index b134670..ab384db 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/config-upgrade.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/config-upgrade.xml
@@ -70,12 +70,9 @@
</condition>
</definition>
- <definition xsi:type="configure" id="hdp_2_2_0_0_hive_server_kerberized_token_store_class">
- <condition type="cluster-env" key="security_enabled" value="true">
- <type>hive-site</type>
- <key>hive.cluster.delegation.token.store.class</key>
- <value>org.apache.hadoop.hive.thrift.ZooKeeperTokenStore</value>
- </condition>
+ <definition xsi:type="configure" id="hdp_2_2_0_0_hive_server_delegation_token_store_class">
+ <type>hive-site</type>
+ <set key="hive.cluster.delegation.token.store.class" value="org.apache.hadoop.hive.thrift.ZooKeeperTokenStore"/>
</definition>
</changes>
</component>
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigActionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigActionTest.java
deleted file mode 100644
index c050ec4..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveKerberosConfigActionTest.java
+++ /dev/null
@@ -1,166 +0,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.
- */
-package org.apache.ambari.server.serveraction.upgrades;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.ambari.server.agent.ExecutionCommand;
-import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Clusters;
-import org.apache.ambari.server.state.Config;
-import org.easymock.EasyMock;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-/**
- * Tests {@link HiveKerberosConfigAction} to ensure that the correct properties
- * are set.
- */
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(ZooKeeperQuorumCalculator.class)
-public class HiveKerberosConfigActionTest {
-
- private static final String CLUSTER_NAME = "c1";
- private HiveKerberosConfigAction m_action = null;
-
- private Clusters m_clusters = EasyMock.createStrictMock(Clusters.class);
- private Cluster m_cluster = EasyMock.createStrictMock(Cluster.class);
- private Config m_clusterEnvConfig = EasyMock.createStrictMock(Config.class);
- private Config m_hiveSiteConfig = EasyMock.createStrictMock(Config.class);
- private ExecutionCommand m_executionCommand = EasyMock.createNiceMock(ExecutionCommand.class);
-
- /**
- * Sets up some generic mocks before the test.
- *
- * @throws Exception
- */
- @Before
- public void before() throws Exception {
- m_action = new HiveKerberosConfigAction();
-
- // setup clusters->cluster mock
- EasyMock.expect(m_executionCommand.getClusterName()).andReturn(CLUSTER_NAME).atLeastOnce();
- EasyMock.expect(m_clusters.getCluster(CLUSTER_NAME)).andReturn(m_cluster).atLeastOnce();
-
- // set the mock objects on the class under test
- Field m_clusterField = HiveKerberosConfigAction.class.getDeclaredField("m_clusters");
- m_clusterField.setAccessible(true);
- m_clusterField.set(m_action, m_clusters);
- m_action.setExecutionCommand(m_executionCommand);
-
- }
-
- /**
- * Tests that nothing is set if Kerberos is not enabled.
- *
- * @throws Exception
- */
- @Test
- public void testKerberosNotEnabled() throws Exception {
- Map<String, String> clusterEnvProperties = new HashMap<>();
- clusterEnvProperties.put(HiveKerberosConfigAction.CLUSTER_ENV_SECURITY_ENABLED, "false");
-
- EasyMock.expect(m_clusterEnvConfig.getProperties()).andReturn(clusterEnvProperties).atLeastOnce();
- EasyMock.expect(m_cluster.getDesiredConfigByType(HiveKerberosConfigAction.CLUSTER_ENV_CONFIG_TYPE)).andReturn(m_clusterEnvConfig).atLeastOnce();
- EasyMock.replay(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
-
- m_action.execute(null);
-
- EasyMock.verify(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
- }
-
- /**
- * Tests that nothing is set if Kerberos is not enabled.
- *
- * @throws Exception
- */
- @Test
- public void testKerberosNotEnabledMissingClusterEnv() throws Exception {
- EasyMock.expect(m_cluster.getDesiredConfigByType(HiveKerberosConfigAction.CLUSTER_ENV_CONFIG_TYPE)).andReturn(null).atLeastOnce();
- EasyMock.replay(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
-
- m_action.execute(null);
-
- EasyMock.verify(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
- }
-
- /**
- * Tests that nothing is set if Kerberos is not enabled.
- *
- * @throws Exception
- */
- @Test
- public void testKerberosNotEnabledMissingSecurityInformation() throws Exception {
- Map<String, String> clusterEnvProperties = new HashMap<>();
-
- EasyMock.expect(m_clusterEnvConfig.getProperties()).andReturn(clusterEnvProperties).atLeastOnce();
- EasyMock.expect(m_cluster.getDesiredConfigByType(HiveKerberosConfigAction.CLUSTER_ENV_CONFIG_TYPE)).andReturn(m_clusterEnvConfig).atLeastOnce();
- EasyMock.replay(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
-
- m_action.execute(null);
-
- EasyMock.verify(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
- }
-
- /**
- * Tests that the correct properties are set when Kerberos is enabled.
- *
- * @throws Exception
- */
- @Test
- public void testKerberosEnabled() throws Exception {
- final String zookeeperQuorum = "c6401.ambari.apache.org:2181,c6402.ambari.apache.org:2181";
-
- PowerMockito.mockStatic(ZooKeeperQuorumCalculator.class);
- PowerMockito.when(ZooKeeperQuorumCalculator.getZooKeeperQuorumString(m_cluster)).thenReturn(
- zookeeperQuorum);
-
- Map<String, String> clusterEnvProperties = new HashMap<>();
- Map<String, String> hiveSiteProperties = new HashMap<>();
- clusterEnvProperties.put(HiveKerberosConfigAction.CLUSTER_ENV_SECURITY_ENABLED, "true");
-
- EasyMock.expect(m_clusterEnvConfig.getProperties()).andReturn(clusterEnvProperties).atLeastOnce();
- EasyMock.expect(m_hiveSiteConfig.getProperties()).andReturn(hiveSiteProperties).atLeastOnce();
-
- m_hiveSiteConfig.setProperties(EasyMock.anyObject(Map.class));
- EasyMock.expectLastCall().once();
-
- m_hiveSiteConfig.persist(false);
- EasyMock.expectLastCall().once();
-
- EasyMock.expect(m_cluster.getDesiredConfigByType(HiveKerberosConfigAction.CLUSTER_ENV_CONFIG_TYPE)).andReturn(m_clusterEnvConfig).atLeastOnce();
- EasyMock.expect(m_cluster.getDesiredConfigByType(HiveKerberosConfigAction.HIVE_SITE_CONFIG_TYPE)).andReturn(m_hiveSiteConfig).atLeastOnce();
-
- EasyMock.replay(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
-
- m_action.execute(null);
-
- EasyMock.verify(m_executionCommand, m_clusters, m_cluster, m_clusterEnvConfig, m_hiveSiteConfig);
-
- Assert.assertEquals(zookeeperQuorum, hiveSiteProperties.get(HiveKerberosConfigAction.HIVE_SITE_ZK_QUORUM));
- Assert.assertEquals(zookeeperQuorum, hiveSiteProperties.get(HiveKerberosConfigAction.HIVE_SITE_ZK_CONNECT_STRING));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e351b145/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigActionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigActionTest.java
new file mode 100644
index 0000000..907194c
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/HiveZKQuorumConfigActionTest.java
@@ -0,0 +1,109 @@
+/**
+ * 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.server.serveraction.upgrades;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ambari.server.agent.ExecutionCommand;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+/**
+ * Tests {@link HiveZKQuorumConfigAction} to ensure that the correct properties
+ * are set.
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(ZooKeeperQuorumCalculator.class)
+public class HiveZKQuorumConfigActionTest {
+
+ private static final String CLUSTER_NAME = "c1";
+ private HiveZKQuorumConfigAction m_action = null;
+
+ private Clusters m_clusters = EasyMock.createStrictMock(Clusters.class);
+ private Cluster m_cluster = EasyMock.createStrictMock(Cluster.class);
+ private Config m_hiveSiteConfig = EasyMock.createStrictMock(Config.class);
+ private ExecutionCommand m_executionCommand = EasyMock.createNiceMock(ExecutionCommand.class);
+
+ /**
+ * Sets up some generic mocks before the test.
+ *
+ * @throws Exception
+ */
+ @Before
+ public void before() throws Exception {
+ m_action = new HiveZKQuorumConfigAction();
+
+ // setup clusters->cluster mock
+ EasyMock.expect(m_executionCommand.getClusterName()).andReturn(CLUSTER_NAME).atLeastOnce();
+ EasyMock.expect(m_clusters.getCluster(CLUSTER_NAME)).andReturn(m_cluster).atLeastOnce();
+
+ // set the mock objects on the class under test
+ Field m_clusterField = HiveZKQuorumConfigAction.class.getDeclaredField("m_clusters");
+ m_clusterField.setAccessible(true);
+ m_clusterField.set(m_action, m_clusters);
+ m_action.setExecutionCommand(m_executionCommand);
+
+ }
+
+ /**
+ * Tests that the correct properties are set.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testZKQuorumPropertiesSetCorrectly() throws Exception {
+ final String zookeeperQuorum = "c6401.ambari.apache.org:2181,c6402.ambari.apache.org:2181";
+
+ PowerMockito.mockStatic(ZooKeeperQuorumCalculator.class);
+ PowerMockito.when(ZooKeeperQuorumCalculator.getZooKeeperQuorumString(m_cluster)).thenReturn(
+ zookeeperQuorum);
+
+ Map<String, String> hiveSiteProperties = new HashMap<>();
+
+ EasyMock.expect(m_hiveSiteConfig.getProperties()).andReturn(hiveSiteProperties).atLeastOnce();
+
+ m_hiveSiteConfig.setProperties(EasyMock.anyObject(Map.class));
+ EasyMock.expectLastCall().once();
+
+ m_hiveSiteConfig.persist(false);
+ EasyMock.expectLastCall().once();
+
+ EasyMock.expect(m_cluster.getDesiredConfigByType(HiveZKQuorumConfigAction.HIVE_SITE_CONFIG_TYPE)).andReturn(m_hiveSiteConfig).atLeastOnce();
+
+ EasyMock.replay(m_executionCommand, m_clusters, m_cluster, m_hiveSiteConfig);
+
+ m_action.execute(null);
+
+ EasyMock.verify(m_executionCommand, m_clusters, m_cluster, m_hiveSiteConfig);
+
+ Assert.assertEquals(zookeeperQuorum, hiveSiteProperties.get(HiveZKQuorumConfigAction.HIVE_SITE_ZK_QUORUM));
+ Assert.assertEquals(zookeeperQuorum, hiveSiteProperties.get(HiveZKQuorumConfigAction.HIVE_SITE_ZK_CONNECT_STRING));
+ }
+
+}