ソースを参照

AMBARI-16953. Service name shown instead of Host name on popup (dlysnichenko)

Lisnichenko Dmitro 9 年 前
コミット
7c1a378825

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDescription.java

@@ -88,10 +88,10 @@ public enum CheckDescription {
           "Repository version {{version}} does not exist.");
           "Repository version {{version}} does not exist.");
       }}),
       }}),
 
 
-  SECONDARY_NAMENODE_MUST_BE_DELETED(PrereqCheckType.SERVICE,
+  SECONDARY_NAMENODE_MUST_BE_DELETED(PrereqCheckType.HOST,
       "The SNameNode component must be deleted from all hosts",
       "The SNameNode component must be deleted from all hosts",
       new HashMap<String, String>() {{
       new HashMap<String, String>() {{
-        put(AbstractCheckDescriptor.DEFAULT, "The SNameNode component must be deleted from host: {{fails}}.");
+        put(AbstractCheckDescriptor.DEFAULT, "The SNameNode component must be deleted from host: %s.");
       }}),
       }}),
 
 
   STORM_REST_API_MUST_BE_DELETED(PrereqCheckType.SERVICE,
   STORM_REST_API_MUST_BE_DELETED(PrereqCheckType.SERVICE,

+ 9 - 5
ambari-server/src/main/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheck.java

@@ -43,6 +43,8 @@ import com.google.inject.Singleton;
 @Singleton
 @Singleton
 @UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 16.0f)
 @UpgradeCheck(group = UpgradeCheckGroup.NAMENODE_HA, order = 16.0f)
 public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
 public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
+  private static final String HDFS_SERVICE_NAME = MasterHostResolver.Service.HDFS.name();
+
   @Inject
   @Inject
   HostComponentStateDAO hostComponentStateDao;
   HostComponentStateDAO hostComponentStateDao;
   /**
   /**
@@ -54,7 +56,7 @@ public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
 
 
   @Override
   @Override
   public boolean isApplicable(PrereqCheckRequest request) throws AmbariException {
   public boolean isApplicable(PrereqCheckRequest request) throws AmbariException {
-    if (!super.isApplicable(request, Arrays.asList("HDFS"), true)) {
+    if (!super.isApplicable(request, Arrays.asList(HDFS_SERVICE_NAME), true)) {
       return false;
       return false;
     }
     }
 
 
@@ -79,7 +81,7 @@ public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
     final String clusterName = request.getClusterName();
     final String clusterName = request.getClusterName();
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     final Cluster cluster = clustersProvider.get().getCluster(clusterName);
     try {
     try {
-      ServiceComponent serviceComponent = cluster.getService(MasterHostResolver.Service.HDFS.name()).getServiceComponent(SECONDARY_NAMENODE);
+      ServiceComponent serviceComponent = cluster.getService(HDFS_SERVICE_NAME).getServiceComponent(SECONDARY_NAMENODE);
       if (serviceComponent != null) {
       if (serviceComponent != null) {
         hosts = serviceComponent.getServiceComponentHosts().keySet();
         hosts = serviceComponent.getServiceComponentHosts().keySet();
       }
       }
@@ -92,16 +94,18 @@ public class SecondaryNamenodeDeletedCheck extends AbstractCheckDescriptor {
     if (hosts.isEmpty()) {
     if (hosts.isEmpty()) {
       List<HostComponentStateEntity> allHostComponents = hostComponentStateDao.findAll();
       List<HostComponentStateEntity> allHostComponents = hostComponentStateDao.findAll();
       for(HostComponentStateEntity hc : allHostComponents) {
       for(HostComponentStateEntity hc : allHostComponents) {
-        if (hc.getServiceName().equalsIgnoreCase(MasterHostResolver.Service.HDFS.name()) && hc.getComponentName().equalsIgnoreCase(SECONDARY_NAMENODE)) {
+        if (hc.getServiceName().equalsIgnoreCase(HDFS_SERVICE_NAME) && hc.getComponentName().equalsIgnoreCase(SECONDARY_NAMENODE)) {
           hosts.add(hc.getHostName());
           hosts.add(hc.getHostName());
         }
         }
       }
       }
     }
     }
 
 
     if (!hosts.isEmpty()) {
     if (!hosts.isEmpty()) {
-      prerequisiteCheck.getFailedOn().add(SECONDARY_NAMENODE);
+      String foundHost = hosts.toArray(new String[hosts.size()])[0];
+      prerequisiteCheck.getFailedOn().add(HDFS_SERVICE_NAME);
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
+      String failReason = getFailReason(prerequisiteCheck, request);
+      prerequisiteCheck.setFailReason(String.format(failReason, foundHost));
     }
     }
   }
   }
 }
 }

+ 7 - 0
ambari-server/src/main/java/org/apache/ambari/server/checks/ServiceCheckValidityCheck.java

@@ -133,8 +133,10 @@ public class ServiceCheckValidityCheck extends AbstractCheckDescriptor {
       String serviceName = serviceEntry.getKey();
       String serviceName = serviceEntry.getKey();
       Long configTimestamp = serviceEntry.getValue();
       Long configTimestamp = serviceEntry.getValue();
 
 
+      boolean serviceCheckWasExecuted = false;
       for (HostRoleCommandEntity command : latestTimestamps.values()) {
       for (HostRoleCommandEntity command : latestTimestamps.values()) {
         if (command.getCommandDetail().contains(serviceName)) {
         if (command.getCommandDetail().contains(serviceName)) {
+          serviceCheckWasExecuted = true;
           Long serviceCheckTimestamp = command.getStartTime();
           Long serviceCheckTimestamp = command.getStartTime();
 
 
           if (serviceCheckTimestamp < configTimestamp) {
           if (serviceCheckTimestamp < configTimestamp) {
@@ -146,6 +148,11 @@ public class ServiceCheckValidityCheck extends AbstractCheckDescriptor {
           }
           }
         }
         }
       }
       }
+
+      if (!serviceCheckWasExecuted) {
+        failedServiceNames.add(serviceName);
+        LOG.info("Service {} service check has never been executed", serviceName);
+      }
     }
     }
 
 
     if (!failedServiceNames.isEmpty()) {
     if (!failedServiceNames.isEmpty()) {

+ 2 - 0
ambari-server/src/test/java/org/apache/ambari/server/checks/SecondaryNamenodeDeletedCheckTest.java

@@ -111,6 +111,8 @@ public class SecondaryNamenodeDeletedCheckTest {
     PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     PrerequisiteCheck check = new PrerequisiteCheck(null, null);
     secondaryNamenodeDeletedCheck.perform(check, new PrereqCheckRequest("cluster"));
     secondaryNamenodeDeletedCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    Assert.assertEquals("HDFS", check.getFailedOn().toArray(new String[1])[0]);
+    Assert.assertEquals("The SNameNode component must be deleted from host: host.", check.getFailReason());
 
 
     Mockito.when(serviceComponent.getServiceComponentHosts()).thenReturn(Collections.<String, ServiceComponentHost> emptyMap());
     Mockito.when(serviceComponent.getServiceComponentHosts()).thenReturn(Collections.<String, ServiceComponentHost> emptyMap());
     check = new PrerequisiteCheck(null, null);
     check = new PrerequisiteCheck(null, null);

+ 22 - 0
ambari-server/src/test/java/org/apache/ambari/server/checks/ServiceCheckValidityCheckTest.java

@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.when;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
+import java.util.Collections;
 
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.Role;
@@ -126,6 +127,27 @@ public class ServiceCheckValidityCheckTest {
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
     Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
   }
   }
 
 
+
+  @Test
+  public void testFailWhenServiceWithNoServiceCheckExists() throws AmbariException {
+    ServiceComponent serviceComponent = mock(ServiceComponent.class);
+    when(serviceComponent.isVersionAdvertised()).thenReturn(true);
+
+    when(service.getMaintenanceState()).thenReturn(MaintenanceState.OFF);
+    when(service.getServiceComponents()).thenReturn(ImmutableMap.of(SERVICE_COMPONENT_NAME, serviceComponent));
+
+    ServiceConfigEntity serviceConfigEntity = new ServiceConfigEntity();
+    serviceConfigEntity.setServiceName(SERVICE_NAME);
+    serviceConfigEntity.setCreateTimestamp(CONFIG_CREATE_TIMESTAMP);
+
+    when(serviceConfigDAO.getLastServiceConfig(eq(CLUSTER_ID), eq(SERVICE_NAME))).thenReturn(serviceConfigEntity);
+    when(hostRoleCommandDAO.findAll(any(Request.class), any(Predicate.class))).thenReturn(Collections.<HostRoleCommandEntity>emptyList());
+
+    PrerequisiteCheck check = new PrerequisiteCheck(null, CLUSTER_NAME);
+    serviceCheckValidityCheck.perform(check, new PrereqCheckRequest(CLUSTER_NAME));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+  }
+
   @Test
   @Test
   public void testFailWhenServiceWithOutdatedServiceCheckExistsRepeated() throws AmbariException {
   public void testFailWhenServiceWithOutdatedServiceCheckExistsRepeated() throws AmbariException {
     ServiceComponent serviceComponent = mock(ServiceComponent.class);
     ServiceComponent serviceComponent = mock(ServiceComponent.class);