You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2018/04/12 16:30:25 UTC
[ambari] branch trunk updated: [AMBARI-23526] Make sure that we
update topology cache on agent side when Kerberizing the cluster (#951)
This is an automated email from the ASF dual-hosted git repository.
rlevas pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push:
new 59eeafe [AMBARI-23526] Make sure that we update topology cache on agent side when Kerberizing the cluster (#951)
59eeafe is described below
commit 59eeafe28eaeff7f07b84e8f3957ebb3780e9d13
Author: smolnar82 <34...@users.noreply.github.com>
AuthorDate: Thu Apr 12 18:30:21 2018 +0200
[AMBARI-23526] Make sure that we update topology cache on agent side when Kerberizing the cluster (#951)
* AMBARI-23526. Make sure that we update topology cache on agent side when Kerberizing the cluster
* AMBARI-23526. Added license headers and updated JUnit test
* AMBARI-23526. Injecting TopologyHolder in constructor to enable unit testing without creating Guice environment
* AMBARI-23526. Triggering upgrade topology event in the Finalize Operations stage
---
.../controller/AmbariManagementControllerImpl.java | 20 ++++++++--------
.../server/serveraction/AbstractServerAction.java | 7 ++++++
.../kerberos/FinalizeKerberosServerAction.java | 27 +++++++++++++++++++++-
.../before-START/scripts/shared_initialization.py | 4 ++--
.../kerberos/FinalizeKerberosServerActionTest.java | 13 +++++++++--
5 files changed, 55 insertions(+), 16 deletions(-)
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 0bd6ae0..a68ef89 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -52,7 +52,6 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_P
import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO;
import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
-import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED;
import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_GROUPS;
import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
import static org.apache.ambari.server.controller.AmbariCustomCommandExecutionHelper.masterToSlaveMappingForDecom;
@@ -2579,16 +2578,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
hostParams.put(CLIENTS_TO_UPDATE_CONFIGS, getClientsToUpdateConfigs(componentInfo));
- // If we are starting a component, calculate whether the unlimited key JCE policy is
- // required for the relevant host. One of the following indicates that the unlimited
- // key JCE policy is required:
- //
- // * The component explicitly requires it whether Kerberos is enabled or not (example, SMARTSENSE/HST_SERVER)
- // * The component explicitly requires it only when Kerberos is enabled AND Kerberos is enabled (example, most components)
- //
- // Set/update the unlimited_key_jce_required value as needed
- hostParams.put(UNLIMITED_KEY_JCE_REQUIRED, (getUnlimitedKeyJCERequirement(componentInfo, cluster.getSecurityType())) ? "true" : "false");
-
execCmd.setHostLevelParams(hostParams);
Map<String, String> roleParams = new TreeMap<>();
@@ -5690,6 +5679,15 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
statusCommandParams.put(ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS,
getClientsToUpdateConfigs(componentInfo));
+
+ // If we are starting a component, calculate whether the unlimited key JCE policy is
+ // required for the relevant host. One of the following indicates that the unlimited
+ // key JCE policy is required:
+ //
+ // * The component explicitly requires it whether Kerberos is enabled or not (example, SMARTSENSE/HST_SERVER)
+ // * The component explicitly requires it only when Kerberos is enabled AND Kerberos is enabled (example, most components)
+ //
+ // Set/update the unlimited_key_jce_required value as needed
statusCommandParams.put(ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED,
Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, clusterSecurityType)));
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java
index a3286a9..c13eb5b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/AbstractServerAction.java
@@ -80,6 +80,13 @@ public abstract class AbstractServerAction implements ServerAction {
}
/**
+ * @return a command report with 0 exit code and COMPLETED HostRoleStatus
+ */
+ protected CommandReport createCompletedCommandReport() {
+ return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+ }
+
+ /**
* Creates a CommandReport used to report back to Ambari the status of this ServerAction.
*
* @param exitCode an integer value declaring the exit code for this action - 0 typically
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerAction.java
index 225e53e..6823d16 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerAction.java
@@ -26,6 +26,8 @@ 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.agent.stomp.TopologyHolder;
+import org.apache.ambari.server.events.TopologyUpdateEvent;
import org.apache.ambari.server.serveraction.kerberos.stageutils.ResolvedKerberosPrincipal;
import org.apache.ambari.server.utils.ShellCommandUtil;
import org.apache.ambari.server.utils.StageUtils;
@@ -33,9 +35,18 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.inject.Inject;
+
public class FinalizeKerberosServerAction extends KerberosServerAction {
private final static Logger LOG = LoggerFactory.getLogger(FinalizeKerberosServerAction.class);
+ private final TopologyHolder topologyHolder;
+
+ @Inject
+ public FinalizeKerberosServerAction(TopologyHolder topologyHolder) {
+ this.topologyHolder = topologyHolder;
+ }
+
/**
* Processes an identity as necessary.
* <p/>
@@ -168,7 +179,21 @@ public class FinalizeKerberosServerAction extends KerberosServerAction {
}
deleteDataDirectory(dataDirectoryPath);
- return createCommandReport(0, HostRoleStatus.COMPLETED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+ return sendTopologyUpdateEvent();
+ }
+
+ private CommandReport sendTopologyUpdateEvent() throws AmbariException, InterruptedException {
+ CommandReport commandReport = null;
+ try {
+ final TopologyUpdateEvent updateEvent = topologyHolder.getCurrentData();
+ topologyHolder.updateData(updateEvent);
+ } catch (Exception e) {
+ String message = "Could not send topology update event when enabling kerberos";
+ actionLog.writeStdErr(message);
+ LOG.error(message, e);
+ commandReport = createCommandReport(1, HostRoleStatus.FAILED, "{}", actionLog.getStdOut(), actionLog.getStdErr());
+ }
+ return commandReport == null ? createCompletedCommandReport() : commandReport;
}
}
diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py
index 32870c9..541de9c 100644
--- a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py
+++ b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py
@@ -218,10 +218,10 @@ def __setup_unlimited_key_jce_policy(custom_java_home, custom_jdk_name, custom_j
Logger.info("Skipping unlimited key JCE policy check and setup since the host is sys prepped")
elif not custom_jdk_name:
- Logger.debug("Skipping unlimited key JCE policy check and setup since the Java VM is not managed by Ambari")
+ Logger.info("Skipping unlimited key JCE policy check and setup since the Java VM is not managed by Ambari")
elif not params.unlimited_key_jce_required:
- Logger.debug("Skipping unlimited key JCE policy check and setup since it is not required")
+ Logger.info("Skipping unlimited key JCE policy check and setup since it is not required")
else:
jcePolicyInfo = JcePolicyInfo(custom_java_home)
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerActionTest.java
index 2241120..dd45907 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/kerberos/FinalizeKerberosServerActionTest.java
@@ -19,6 +19,7 @@
package org.apache.ambari.server.serveraction.kerberos;
import static org.easymock.EasyMock.expect;
+import static org.mockito.Matchers.anyBoolean;
import java.io.File;
import java.io.IOException;
@@ -39,9 +40,11 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
import org.apache.ambari.server.agent.CommandReport;
import org.apache.ambari.server.agent.ExecutionCommand;
+import org.apache.ambari.server.agent.stomp.TopologyHolder;
import org.apache.ambari.server.audit.AuditLogger;
import org.apache.ambari.server.controller.KerberosHelper;
import org.apache.ambari.server.controller.RootComponent;
+import org.apache.ambari.server.events.TopologyUpdateEvent;
import org.apache.ambari.server.security.credential.PrincipalKeyCredential;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
@@ -65,6 +68,8 @@ public class FinalizeKerberosServerActionTest extends EasyMockSupport {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
+ private final TopologyHolder topologyHolder = createNiceMock(TopologyHolder.class);
+
@Test
@Ignore("Update accordingly to changes")
public void executeMITKDCOption() throws Exception {
@@ -90,7 +95,7 @@ public class FinalizeKerberosServerActionTest extends EasyMockSupport {
ConcurrentMap<String, Object> requestSharedDataContext = new ConcurrentHashMap<>();
- FinalizeKerberosServerAction action = injector.getInstance(FinalizeKerberosServerAction.class);
+ FinalizeKerberosServerAction action = new FinalizeKerberosServerAction(topologyHolder);
action.setExecutionCommand(executionCommand);
action.setHostRoleCommand(hostRoleCommand);
@@ -122,7 +127,7 @@ public class FinalizeKerberosServerActionTest extends EasyMockSupport {
ConcurrentMap<String, Object> requestSharedDataContext = new ConcurrentHashMap<>();
- FinalizeKerberosServerAction action = injector.getInstance(FinalizeKerberosServerAction.class);
+ FinalizeKerberosServerAction action = new FinalizeKerberosServerAction(topologyHolder);
action.setExecutionCommand(executionCommand);
action.setHostRoleCommand(hostRoleCommand);
@@ -196,6 +201,10 @@ public class FinalizeKerberosServerActionTest extends EasyMockSupport {
expect(clusters.getHostsForCluster(clusterName)).andReturn(clusterHostMap).anyTimes();
expect(clusters.getCluster(clusterName)).andReturn(cluster).anyTimes();
+ final TopologyUpdateEvent event = createNiceMock(TopologyUpdateEvent.class);
+ expect(topologyHolder.getCurrentData()).andReturn(event).once();
+ expect(topologyHolder.updateData(event)).andReturn(anyBoolean()).once();
+
return Guice.createInjector(new AbstractModule() {
@Override
--
To stop receiving notification emails like this one, please contact
rlevas@apache.org.