Repository: ambari Updated Branches: refs/heads/branch-2.2 9c92aab77 -> 26d2e96c1
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/26d2e96c Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/26d2e96c Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/26d2e96c Branch: refs/heads/branch-2.2 Commit: 26d2e96c130134eb581415d6a7125050c6d91e16 Parents: 9c92aab Author: Jonathan Hurley <[email protected]> Authored: Mon Dec 14 19:08:35 2015 -0500 Committer: Jonathan Hurley <[email protected]> Committed: Tue Dec 15 11:45:44 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/26d2e96c/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/26d2e96c/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/26d2e96c/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/26d2e96c/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/26d2e96c/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/26d2e96c/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)); + } + +}
