You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by wu...@apache.org on 2022/12/07 15:50:58 UTC

[ambari] branch trunk updated: AMBARI-25719: Fail to enable kerberos due to NullPointerException and HostNotFoundException (#3589)

This is an automated email from the ASF dual-hosted git repository.

wuzhiguo 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 363cc260c0 AMBARI-25719: Fail to enable kerberos due to NullPointerException and HostNotFoundException (#3589)
363cc260c0 is described below

commit 363cc260c02144dbb77277bc4e47fc591934c507
Author: Yubi Lee <eu...@gmail.com>
AuthorDate: Thu Dec 8 00:50:52 2022 +0900

    AMBARI-25719: Fail to enable kerberos due to NullPointerException and HostNotFoundException (#3589)
---
 .../events/publishers/AgentCommandsPublisher.java  | 12 +++-
 .../server/orm/dao/KerberosKeytabPrincipalDAO.java |  8 ++-
 .../stageutils/KerberosKeytabController.java       | 10 ++-
 .../apache/ambari/server/state/ConfigHelper.java   | 15 ++--
 .../apache/ambari/server/utils/ThreadPools.java    | 10 ++-
 .../orm/dao/KerberosKeytabPrincipalDAOTest.java    | 81 ++++++++++++++++++++++
 6 files changed, 122 insertions(+), 14 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 0d82caad62..7249ad5646 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
@@ -111,7 +111,9 @@ public class AgentCommandsPublisher {
                 if (!clusterDesiredConfigs.containsKey(clusterId)) {
                   clusterDesiredConfigs.put(clusterId, clusters.getCluster(clusterId).getDesiredConfigs());
                 }
-              } catch (NumberFormatException|AmbariException ignored) {}
+              } catch (NumberFormatException|AmbariException e) {
+                LOG.error("Exception on sendAgentCommand", e);
+              }
             }
 
             Map<String, DesiredConfig> desiredConfigs = (clusterId != null && clusterDesiredConfigs.containsKey(clusterId))
@@ -120,7 +122,9 @@ public class AgentCommandsPublisher {
             populateExecutionCommandsClusters(executionCommandsClusters, hostId, ac, desiredConfigs);
           });
         }).get();
-      } catch (InterruptedException|ExecutionException ignored) {}
+      } catch (InterruptedException|ExecutionException e) {
+        LOG.error("Exception on sendAgentCommand", e);
+      }
 
       try {
         threadPools.getAgentPublisherCommandsPool().submit(() -> {
@@ -132,7 +136,9 @@ public class AgentCommandsPublisher {
             ));
           });
         }).get();
-      } catch (InterruptedException|ExecutionException ignored) {}
+      } catch (InterruptedException|ExecutionException e) {
+        LOG.error("Exception on sendAgentCommand", e);
+      }
     }
   }
 
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
index 1be9bfbc1f..7257acb26f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAO.java
@@ -88,11 +88,15 @@ public class KerberosKeytabPrincipalDAO {
 
     Long hostId = hostEntity == null ? null : hostEntity.getHostId();
     // The DB requests should be avoided due to heavy impact on the performance
-    KerberosKeytabPrincipalEntity kkp = (keytabList == null)
+    KerberosKeytabPrincipalEntity kkp = (keytabList == null || keytabList.isEmpty())
       ? findByNaturalKey(hostId, kerberosKeytabEntity.getKeytabPath(), kerberosPrincipalEntity.getPrincipalName())
       : keytabList.stream()
       .filter(keytab ->
-        keytab.getHostId().equals(hostId)
+        keytab != null
+          && keytab.getHostId() != null
+          && keytab.getKeytabPath() != null
+          && keytab.getPrincipalName() != null
+          && keytab.getHostId().equals(hostId)
           && keytab.getKeytabPath().equals(kerberosKeytabEntity.getKeytabPath())
           && keytab.getPrincipalName().equals(kerberosPrincipalEntity.getPrincipalName())
       )
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 653cccb908..037c796643 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
@@ -319,15 +319,19 @@ public class KerberosKeytabController {
     Set<String> hosts = new HashSet<>(hostMap.keySet());
     Map<String, String> componentHosts = new HashMap<>();
 
-    hosts.add(StageUtils.getHostName());
-
-    for(String hostName: hosts) {
+    for (String hostName: hosts) {
       hostConfigurations.put(
         hostName,
         kerberosHelper.calculateConfigurations(cluster, hostName, kerberosDescriptor, userDescriptor,
           false,false, componentHosts, desiredConfigs)
       );
     }
+
+    // ambari-agent may not be installed on ambari-server. Add ambari-server after calculating configurations.
+    // If not, HostNotFoundException will raise
+    String ambariServerHostname = StageUtils.getHostName();
+    hosts.add(ambariServerHostname);
+
     for (String service: services) {
       kerberosHelper.getActiveIdentities(clusterName,null, service, null,true,
         hostConfigurations,kerberosDescriptor, desiredConfigs).values().forEach(serviceIdentities::addAll);
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index 5a58768a0d..096250b19b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -37,6 +37,7 @@ import javax.annotation.Nullable;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.AmbariRuntimeException;
+import org.apache.ambari.server.HostNotFoundException;
 import org.apache.ambari.server.agent.stomp.AgentConfigsHolder;
 import org.apache.ambari.server.agent.stomp.MetadataHolder;
 import org.apache.ambari.server.agent.stomp.dto.ClusterConfigs;
@@ -188,10 +189,15 @@ public class ConfigHelper {
    * @throws AmbariException
    */
   public Map<String, Map<String, String>> getEffectiveDesiredTags(Cluster cluster, String hostName,
-                                                                  @Nullable Map<String, DesiredConfig> desiredConfigs)
-          throws AmbariException {
-
-    Host host = (hostName == null) ? null : clusters.getHost(hostName);
+                                                                  @Nullable Map<String, DesiredConfig> desiredConfigs) throws AmbariException {
+    Host host = null;
+    if (hostName != null) {
+      try {
+        host = clusters.getHost(hostName);
+      } catch (HostNotFoundException e) {
+        LOG.error("Cannot get desired config for unknown host {}", hostName, e);
+      }
+    }
     Map<String, HostConfig> desiredHostConfigs = (host == null) ? null
         : host.getDesiredHostConfigs(cluster, desiredConfigs);
 
@@ -2190,6 +2196,7 @@ public class ConfigHelper {
    * @param hostname a hostname
    * @param desiredConfigs desired configuration map
    * @return a map of the existing configurations
+   * @throws AmbariException
    */
   public Map<String, Map<String, String>> calculateExistingConfigurations(
           AmbariManagementController ambariManagementController, Cluster cluster,  String hostname,
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/utils/ThreadPools.java b/ambari-server/src/main/java/org/apache/ambari/server/utils/ThreadPools.java
index ac148be4bb..93b6fcc92c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/utils/ThreadPools.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/utils/ThreadPools.java
@@ -98,7 +98,10 @@ public class ThreadPools {
       agentPublisherCommandsPool = new ForkJoinPool(
         configuration.getAgentCommandPublisherThreadPoolSize(),
         createNamedFactory(AGENT_COMMAND_PUBLISHER_POOL_NAME),
-        null,
+        (t, e) -> {
+          LOG.error("Unexpected exception in thread: " + t, e);
+          throw new RuntimeException(e);
+        },
         false
       );
     }
@@ -111,7 +114,10 @@ public class ThreadPools {
       defaultForkJoinPool = new ForkJoinPool(
         configuration.getDefaultForkJoinPoolSize(),
         createNamedFactory(DEFAULT_FORK_JOIN_POOL_NAME),
-        null,
+        (t, e) -> {
+          LOG.error("Unexpected exception in thread: " + t, e);
+          throw new RuntimeException(e);
+        },
         false
       );
     }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAOTest.java
new file mode 100644
index 0000000000..3fe38e2318
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/KerberosKeytabPrincipalDAOTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.orm.dao;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.KerberosKeytabEntity;
+import org.apache.ambari.server.orm.entities.KerberosKeytabPrincipalEntity;
+import org.apache.ambari.server.orm.entities.KerberosPrincipalEntity;
+import org.easymock.EasyMockRule;
+import org.easymock.Mock;
+import org.easymock.MockType;
+import org.easymock.TestSubject;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import com.google.inject.Provider;
+
+public class KerberosKeytabPrincipalDAOTest {
+
+    @Rule
+    public EasyMockRule mocks = new EasyMockRule(this);
+
+    @Mock(type = MockType.STRICT)
+    private Provider<EntityManager> entityManagerProvider;
+
+    @Mock(type = MockType.STRICT)
+    private EntityManager entityManager;
+
+    @TestSubject
+    private final KerberosKeytabPrincipalDAO kerberosKeytabPrincipalDAO = new KerberosKeytabPrincipalDAO();
+
+    @Before
+    public void before() {
+        reset(entityManagerProvider);
+        expect(entityManagerProvider.get()).andReturn(entityManager).atLeastOnce();
+        replay(entityManagerProvider);
+    }
+
+    @Test
+    public void testFindOrCreate() {
+        HostEntity hostEntity = new HostEntity();
+        hostEntity.setHostName("h1");
+        hostEntity.setHostId(1L);
+
+        KerberosKeytabEntity kke = new KerberosKeytabEntity();
+        kke.setKeytabPath("/some/path");
+
+        KerberosPrincipalEntity kpe = new KerberosPrincipalEntity();
+        kpe.setPrincipalName("test@EXAMPLE.COM");
+
+        List<KerberosKeytabPrincipalEntity> keytabList = new ArrayList<>();
+        keytabList.add(null);
+
+        kerberosKeytabPrincipalDAO.findOrCreate(kke, hostEntity, kpe, keytabList);
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ambari.apache.org
For additional commands, e-mail: commits-help@ambari.apache.org