summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Levas <rlevas@hortonworks.com>2018-07-06 09:43:47 -0400
committerRobert Levas <rlevas@users.noreply.github.com>2018-07-06 14:48:40 -0400
commitb99e2bf52cd4933160194a8cc0f25dbd07325a93 (patch)
treee4bf0783061351911628531fe3adc1b5f5daa61d
parent0cc4ef0c49681e8c61adce99c7cadec1ccd83550 (diff)
[AMBARI-24250] Create Checkpoint page stuck while Enabling HA on Namenode
-rw-r--r--ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java41
-rw-r--r--ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/stageutils/KerberosKeytabController.java19
-rw-r--r--ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java18
3 files changed, 67 insertions, 11 deletions
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java b/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
index 68ad6525f7..c64131d55f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/events/publishers/AgentCommandsPublisher.java
@@ -1,4 +1,4 @@
-/**
+/*
* 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
@@ -28,6 +28,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -47,10 +48,13 @@ import org.apache.ambari.server.serveraction.kerberos.KerberosServerAction;
import org.apache.ambari.server.serveraction.kerberos.stageutils.KerberosKeytabController;
import org.apache.ambari.server.serveraction.kerberos.stageutils.ResolvedKerberosKeytab;
import org.apache.ambari.server.serveraction.kerberos.stageutils.ResolvedKerberosPrincipal;
+import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.utils.StageUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -174,14 +178,15 @@ public class AgentCommandsPublisher {
* @param targetHost a name of the host the relevant command is destined for
* @throws AmbariException
*/
- void injectKeytab(ExecutionCommand ec, String command, String targetHost) throws AmbariException {
+ private void injectKeytab(ExecutionCommand ec, String command, String targetHost) throws AmbariException {
String dataDir = ec.getCommandParams().get(KerberosServerAction.DATA_DIRECTORY);
KerberosServerAction.KerberosCommandParameters kerberosCommandParameters = new KerberosServerAction.KerberosCommandParameters(ec);
if(dataDir != null) {
List<Map<String, String>> kcp = ec.getKerberosCommandParams();
try {
- Set<ResolvedKerberosKeytab> keytabsToInject = kerberosKeytabController.getFilteredKeytabs((Map<String, Collection<String>>)kerberosCommandParameters.getServiceComponentFilter(), kerberosCommandParameters.getHostFilter(), kerberosCommandParameters.getIdentityFilter());
+ Map<String, Collection<String>> serviceComponentFilter = adjustServiceComponentFilter(ec.getClusterName(), kerberosCommandParameters.getServiceComponentFilter());
+ Set<ResolvedKerberosKeytab> keytabsToInject = kerberosKeytabController.getFilteredKeytabs(serviceComponentFilter, kerberosCommandParameters.getHostFilter(), kerberosCommandParameters.getIdentityFilter());
for (ResolvedKerberosKeytab resolvedKeytab : keytabsToInject) {
for(ResolvedKerberosPrincipal resolvedPrincipal: resolvedKeytab.getPrincipals()) {
String hostName = resolvedPrincipal.getHostName();
@@ -210,7 +215,7 @@ public class AgentCommandsPublisher {
keytabMap.put(KerberosIdentityDataFileReader.KEYTAB_FILE_GROUP_ACCESS, resolvedKeytab.getGroupAccess());
BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(keytabFile));
- byte[] keytabContent = null;
+ byte[] keytabContent;
try {
keytabContent = IOUtils.toByteArray(bufferedIn);
} finally {
@@ -252,4 +257,32 @@ public class AgentCommandsPublisher {
ec.setKerberosCommandParams(kcp);
}
}
+
+ private Map<String, Collection<String>> adjustServiceComponentFilter(String clusterName, Map<String, ? extends Collection<String>> serviceComponentFilter) throws AmbariException {
+ Map<String, Collection<String>> adjustedFilter = new HashMap<>();
+ Cluster cluster = clusters.getCluster(clusterName);
+
+ Map<String, Service> installedServices = (cluster == null) ? null : cluster.getServices();
+
+ if(!MapUtils.isEmpty(installedServices)) {
+ if (serviceComponentFilter != null) {
+ // prune off services that are not installed, or considered installed - like AMBARI
+ for(Map.Entry<String, ? extends Collection<String>> entry: serviceComponentFilter.entrySet()) {
+ String serviceName = entry.getKey();
+
+ if(installedServices.containsKey(serviceName)) {
+ adjustedFilter.put(serviceName, entry.getValue());
+ }
+ }
+ } else {
+ // return only the set of installed services
+ for(String serviceName: installedServices.keySet()) {
+ // Add an entry to indicate the service and all of it's components should be considered
+ adjustedFilter.put(serviceName, Collections.singletonList("*"));
+ }
+ }
+ }
+
+ return adjustedFilter;
+ }
}
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/stageutils/KerberosKeytabController.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/stageutils/KerberosKeytabController.java
index 499390296d..0b01fd9b14 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/stageutils/KerberosKeytabController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/kerberos/stageutils/KerberosKeytabController.java
@@ -133,17 +133,23 @@ public class KerberosKeytabController {
Set<String> serviceSet = new HashSet<>();
Set<String> componentSet = new HashSet<>();
Set<String> serviceOnlySet = new HashSet<>();
- serviceSet.addAll(serviceComponentFilter.keySet());
- for (String serviceName : serviceSet) {
- Collection<String> serviceComponents = serviceComponentFilter.get(serviceName);
- if (serviceComponents.contains("*")) { // star means that this is filtered by whole SERVICE
+
+ // Split the filter into a service/component filter or a service-only filter.
+ for(Map.Entry<String, Collection<String>> entry: serviceComponentFilter.entrySet()) {
+ String serviceName = entry.getKey();
+ Collection<String> serviceComponents = entry.getValue();
+
+ if((serviceComponents == null) || serviceComponents.contains("*")) {
serviceOnlySet.add(serviceName);
- serviceSet.remove(serviceName); // remove service from regular
- } else {
+ }
+ else {
+ serviceSet.add(serviceName);
componentSet.addAll(serviceComponents);
}
}
+
List<KerberosKeytabPrincipalDAO.KerberosKeytabPrincipalFilter> result = new ArrayList<>();
+ // Handle the service/component filter
if (serviceSet.size() > 0) {
result.add(new KerberosKeytabPrincipalDAO.KerberosKeytabPrincipalFilter(
null,
@@ -152,6 +158,7 @@ public class KerberosKeytabController {
null
));
}
+ // Handler the service/* filter
if (serviceOnlySet.size() > 0) {
result.add(new KerberosKeytabPrincipalDAO.KerberosKeytabPrincipalFilter(
null,
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
index 00566d75df..75d5a7ab26 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
@@ -1412,6 +1412,12 @@ public class TestHeartbeatHandler {
List<Map<String, String>> kcp;
Map<String, String> properties;
+ Cluster cluster = heartbeatTestHelper.getDummyCluster();
+ Service hdfs = addService(cluster, HDFS);
+ hdfs.addServiceComponent(DATANODE);
+ hdfs.addServiceComponent(NAMENODE);
+ hdfs.addServiceComponent(SECONDARY_NAMENODE);
+
kcp = testInjectKeytabSetKeytab("c6403.ambari.apache.org");
Assert.assertNotNull(kcp);
Assert.assertEquals(1, kcp.size());
@@ -1448,6 +1454,12 @@ public class TestHeartbeatHandler {
@Test
public void testInjectKeytabNotApplicableHost() throws Exception {
+ Cluster cluster = heartbeatTestHelper.getDummyCluster();
+ Service hdfs = addService(cluster, HDFS);
+ hdfs.addServiceComponent(DATANODE);
+ hdfs.addServiceComponent(NAMENODE);
+ hdfs.addServiceComponent(SECONDARY_NAMENODE);
+
List<Map<String, String>> kcp;
kcp = testInjectKeytabSetKeytab("c6401.ambari.apache.org");
Assert.assertNotNull(kcp);
@@ -1469,6 +1481,7 @@ public class TestHeartbeatHandler {
Map<String, String> commandparams = new HashMap<>();
commandparams.put(KerberosServerAction.AUTHENTICATED_USER_NAME, "admin");
executionCommand.setCommandParams(commandparams);
+ executionCommand.setClusterName(DummyCluster);
final HostRoleCommand command = hostRoleCommandFactory.create(DummyHostname1,
Role.DATANODE, null, null);
@@ -1501,6 +1514,7 @@ public class TestHeartbeatHandler {
Map<String, String> commandparams = new HashMap<>();
commandparams.put(KerberosServerAction.AUTHENTICATED_USER_NAME, "admin");
executionCommand.setCommandParams(commandparams);
+ executionCommand.setClusterName(DummyCluster);
final HostRoleCommand command = hostRoleCommandFactory.create(DummyHostname1,
Role.DATANODE, null, null);
@@ -1524,7 +1538,9 @@ public class TestHeartbeatHandler {
private File createTestKeytabData(AgentCommandsPublisher agentCommandsPublisher) throws Exception {
KerberosKeytabController kerberosKeytabControllerMock = createMock(KerberosKeytabController.class);
- expect(kerberosKeytabControllerMock.getFilteredKeytabs(null,null,null)).andReturn(
+ Map<String, Collection<String>> filter = new HashMap<>();
+ filter.put("HDFS", Collections.singletonList("*"));
+ expect(kerberosKeytabControllerMock.getFilteredKeytabs(filter,null,null)).andReturn(
Sets.newHashSet(
new ResolvedKerberosKeytab(
"/etc/security/keytabs/dn.service.keytab",