AMBARI-22232 : Need to add a new property to support proxy users for Atlas service. (Vishal Suvagia via mugdha)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/df108137 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/df108137 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/df108137 Branch: refs/heads/branch-feature-AMBARI-22008 Commit: df1081378e51c309589540673e140faaf9329ee4 Parents: 499fec3 Author: Vishal Suvagia <vishalsuva...@yahoo.com> Authored: Sat Oct 14 16:22:31 2017 +0530 Committer: Mugdha Varadkar <mug...@apache.org> Committed: Mon Oct 16 11:15:23 2017 +0530 ---------------------------------------------------------------------- .../AtlasProxyUserConfigCalculation.java | 48 +++++++++ .../HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml | 4 + .../stacks/HDP/2.5/upgrades/upgrade-2.6.xml | 3 + .../configuration/application-properties.xml | 15 +++ .../stacks/HDP/2.6/services/stack_advisor.py | 7 ++ .../HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml | 4 + .../stacks/HDP/2.6/upgrades/upgrade-2.6.xml | 3 + .../AtlasProxyUserConfigCalculationTest.java | 108 +++++++++++++++++++ .../stacks/2.6/common/test_stack_advisor.py | 3 +- 9 files changed, 194 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculation.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculation.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculation.java new file mode 100644 index 0000000..85fb200 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculation.java @@ -0,0 +1,48 @@ +package org.apache.ambari.server.serveraction.upgrades; + +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 javax.inject.Inject; +import java.text.MessageFormat; +import java.util.Map; +import java.util.concurrent.ConcurrentMap; + +public class AtlasProxyUserConfigCalculation extends AbstractUpgradeServerAction { + + private static final String ATLAS_APPLICATION_PROPERTIES_CONFIG_TYPE = "application-properties"; + private static final String KNOX_ENV_CONFIG_TYPE = "knox-env"; + private static final String KNOX_USER_CONFIG = "knox_user"; + + @Override + public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext) throws AmbariException, InterruptedException { + String clusterName = getExecutionCommand().getClusterName(); + Cluster cluster = getClusters().getCluster(clusterName); + String outputMessage = ""; + + Config atlasApplicationProperties = cluster.getDesiredConfigByType(ATLAS_APPLICATION_PROPERTIES_CONFIG_TYPE); + if (null == atlasApplicationProperties) { + return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", + MessageFormat.format("Config type {0} not found, skipping updating property in same.", ATLAS_APPLICATION_PROPERTIES_CONFIG_TYPE), ""); + } + + Config knoxEnvConfig = cluster.getDesiredConfigByType(KNOX_ENV_CONFIG_TYPE); + String atlasProxyUsers = "knox"; + if (null != knoxEnvConfig && knoxEnvConfig.getProperties().containsKey(KNOX_USER_CONFIG)) { + atlasProxyUsers = knoxEnvConfig.getProperties().get(KNOX_USER_CONFIG); + } + + Map<String, String> currentAtlasApplicationProperties = atlasApplicationProperties.getProperties(); + currentAtlasApplicationProperties.put("atlas.proxyusers", atlasProxyUsers); + atlasApplicationProperties.setProperties(currentAtlasApplicationProperties); + atlasApplicationProperties.save(); + + outputMessage = outputMessage + MessageFormat.format("Successfully updated {0} config type.\n", ATLAS_APPLICATION_PROPERTIES_CONFIG_TYPE); + return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", outputMessage, ""); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml index 1af3b18..cd69a9c 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/nonrolling-upgrade-2.6.xml @@ -488,6 +488,10 @@ <task xsi:type="configure" id="atlas_log4j_update_logger_settings"/> </execute-stage> + <execute-stage service="ATLAS" component="ATLAS_SERVER" title="Applying Atlas proxy-user configurations."> + <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.AtlasProxyUserConfigCalculation"/> + </execute-stage> + <!--KAFKA--> <execute-stage service="KAFKA" component="KAFKA_BROKER" title="Parameterizing Kafka Log4J Properties"> <task xsi:type="configure" id="kafka_log4j_parameterize"> http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml index 0a01a04..a6d3f29 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.5/upgrades/upgrade-2.6.xml @@ -1123,6 +1123,9 @@ <task xsi:type="configure" id="atlas_env_gc_worker"/> <task xsi:type="configure" id="hdp_2_6_atlas_kafka_auto_commit_enable_property_delete"/> <task xsi:type="configure" id="atlas_log4j_update_logger_settings"/> + <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.AtlasProxyUserConfigCalculation" > + <summary>Applying Atlas proxy-user configurations.</summary> + </task> </pre-upgrade> <pre-downgrade /> <upgrade> http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.6/services/ATLAS/configuration/application-properties.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/services/ATLAS/configuration/application-properties.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/services/ATLAS/configuration/application-properties.xml index c271dc3..523cb21 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.6/services/ATLAS/configuration/application-properties.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.6/services/ATLAS/configuration/application-properties.xml @@ -109,4 +109,19 @@ <deleted>true</deleted> <on-ambari-upgrade add="false"/> </property> + <property> + <name>atlas.proxyusers</name> + <value/> + <description>Proxy users for Atlas</description> + <value-attributes> + <empty-value-valid>true</empty-value-valid> + </value-attributes> + <depends-on> + <property> + <type>knox-env</type> + <name>knox_user</name> + </property> + </depends-on> + <on-ambari-upgrade add="false"/> + </property> </configuration> http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py b/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py index 94f28db..fc12d37 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py +++ b/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py @@ -83,6 +83,13 @@ class HDP26StackAdvisor(HDP25StackAdvisor): knox_port = services['configurations']["gateway-site"]["properties"]['gateway.port'] putAtlasApplicationProperty('atlas.sso.knox.providerurl', 'https://{0}:{1}/gateway/knoxsso/api/v1/websso'.format(knox_host, knox_port)) + knox_service_user = '' + if 'KNOX' in servicesList and 'knox-env' in services['configurations']: + knox_service_user = services['configurations']['knox-env']['properties']['knox_user'] + else: + knox_service_user = 'knox' + putAtlasApplicationProperty('atlas.proxyusers',knox_service_user) + def recommendDruidConfigurations(self, configurations, clusterData, services, hosts): # druid is not in list of services to be installed http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml index ebb81d9..832c505 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/nonrolling-upgrade-2.6.xml @@ -376,6 +376,10 @@ <task xsi:type="configure" id="atlas_hbase_conf_dir"/> </execute-stage> + <execute-stage service="ATLAS" component="ATLAS_SERVER" title="Applying Atlas proxy-user configurations."> + <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.AtlasProxyUserConfigCalculation"/> + </execute-stage> + <!-- KMS --> <execute-stage service="RANGER_KMS" component="RANGER_KMS_SERVER" title="Apply config changes for Ranger Kms plugin"> <task xsi:type="configure" id="hdp_2_6_maint_ranger_kms_plugin_cluster_name"/> http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml index ae5972e..d0e11a1 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml +++ b/ambari-server/src/main/resources/stacks/HDP/2.6/upgrades/upgrade-2.6.xml @@ -1050,6 +1050,9 @@ <task xsi:type="configure" id="hdp_2_6_atlas_kafka_auto_commit_enable_property_delete"/> <task xsi:type="configure" id="atlas_log4j_update_logger_settings"/> <task xsi:type="configure" id="atlas_hbase_conf_dir"/> + <task xsi:type="server_action" class="org.apache.ambari.server.serveraction.upgrades.AtlasProxyUserConfigCalculation" > + <summary>Applying Atlas proxy-user configurations.</summary> + </task> </pre-upgrade> <pre-downgrade/> <!-- no-op to prevent config changes on downgrade --> <upgrade> http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculationTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculationTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculationTest.java new file mode 100644 index 0000000..3f8bca9 --- /dev/null +++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/AtlasProxyUserConfigCalculationTest.java @@ -0,0 +1,108 @@ +package org.apache.ambari.server.serveraction.upgrades; + +import com.google.inject.Injector; +import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper; +import org.apache.ambari.server.actionmanager.HostRoleCommand; +import org.apache.ambari.server.agent.CommandReport; +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 java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +import static org.easymock.EasyMock.*; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expectLastCall; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class AtlasProxyUserConfigCalculationTest { + + private Injector m_injector; + private Clusters m_clusters; + private Field m_clusterField; + + @Before + public void setup() throws Exception { + m_injector = createMock(Injector.class); + m_clusters = createMock(Clusters.class); + Cluster cluster = createMock(Cluster.class); + + Map<String, String> mockKnoxEnvProperties = new HashMap<String, String>() { + { + put("knox_user", "knox_cstm"); + } + }; + + Map<String, String> mockAtlasApplicationProperties = new HashMap<String, String>(); + + Config knoxEnvConfig = createMock(Config.class); + expect(knoxEnvConfig.getType()).andReturn("knox-env").anyTimes(); + expect(knoxEnvConfig.getProperties()).andReturn(mockKnoxEnvProperties).anyTimes(); + + + Config atlasApplicationPropertiesConfig = createMock(Config.class); + expect(atlasApplicationPropertiesConfig.getType()).andReturn("application-properties").anyTimes(); + expect(atlasApplicationPropertiesConfig.getProperties()).andReturn(mockAtlasApplicationProperties).anyTimes(); + + + atlasApplicationPropertiesConfig.setProperties(anyObject(Map.class)); + expectLastCall().atLeastOnce(); + + atlasApplicationPropertiesConfig.save(); + expectLastCall().atLeastOnce(); + + expect(cluster.getDesiredConfigByType("knox-env")).andReturn(knoxEnvConfig).atLeastOnce(); + expect(cluster.getDesiredConfigByType("application-properties")).andReturn(atlasApplicationPropertiesConfig).atLeastOnce(); + expect(m_clusters.getCluster((String) anyObject())).andReturn(cluster).anyTimes(); + expect(m_injector.getInstance(Clusters.class)).andReturn(m_clusters).atLeastOnce(); + + replay(m_injector, m_clusters, cluster, knoxEnvConfig, atlasApplicationPropertiesConfig); + + m_clusterField = AbstractUpgradeServerAction.class.getDeclaredField("m_clusters"); + m_clusterField.setAccessible(true); + + } + + @Test + public void testAction() throws Exception { + + Map<String, String> commandParams = new HashMap<String, String>(); + commandParams.put("clusterName", "cl1"); + + ExecutionCommand executionCommand = new ExecutionCommand(); + executionCommand.setCommandParams(commandParams); + executionCommand.setClusterName("cl1"); + + HostRoleCommand hrc = createMock(HostRoleCommand.class); + expect(hrc.getRequestId()).andReturn(1L).anyTimes(); + expect(hrc.getStageId()).andReturn(2L).anyTimes(); + expect(hrc.getExecutionCommandWrapper()).andReturn(new ExecutionCommandWrapper(executionCommand)).anyTimes(); + replay(hrc); + + AtlasProxyUserConfigCalculation action = new AtlasProxyUserConfigCalculation(); + m_clusterField.set(action, m_clusters); + action.setExecutionCommand(executionCommand); + action.setHostRoleCommand(hrc); + + CommandReport report = action.execute(null); + Assert.assertNotNull(report); + + Cluster cl = m_clusters.getCluster("cl1"); + Config config = cl.getDesiredConfigByType("application-properties"); + Map<String, String> map = config.getProperties(); + + Assert.assertTrue(map.containsKey("atlas.proxyusers")); + Assert.assertEquals("knox_cstm", map.get("atlas.proxyusers")); + + report = action.execute(null); + Assert.assertNotNull(report); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/df108137/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py b/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py index ade08c1..f4c5508 100644 --- a/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py +++ b/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py @@ -1303,7 +1303,8 @@ class TestHDP26StackAdvisor(TestCase): "atlas.graph.storage.hostname": "", "atlas.kafka.bootstrap.servers": "", "atlas.kafka.zookeeper.connect": "", - "atlas.authorizer.impl": "simple" + "atlas.authorizer.impl": "simple", + 'atlas.proxyusers': 'knox' } }, "infra-solr-env": {