Browse Source

Merge branch 'branch-feature-AMBARI-18634' into trunk

Nate Cole 9 years ago
parent
commit
ba7457b7b0

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

@@ -66,7 +66,9 @@ public class CheckDescription {
     "Hosts in Maintenance Mode will be excluded from the upgrade.",
     new ImmutableMap.Builder<String, String>()
       .put(AbstractCheckDescriptor.DEFAULT,
-          "There are hosts in Maintenance Mode which excludes them from being upgraded.").build());
+          "There are hosts in Maintenance Mode which excludes them from being upgraded.")
+      .put(HostMaintenanceModeCheck.KEY_CANNOT_START_HOST_ORDERED,
+          "The following hosts cannot be in Maintenance Mode: {{fails}}.").build());
 
   public static CheckDescription HOSTS_MASTER_MAINTENANCE = new CheckDescription("HOSTS_MASTER_MAINTENANCE",
     PrereqCheckType.HOST,
@@ -296,7 +298,7 @@ public class CheckDescription {
     new ImmutableMap.Builder<String, String>()
       .put(AbstractCheckDescriptor.DEFAULT,
           "HiveServer2 does not currently support rolling upgrades. HiveServer2 will be upgraded, however existing queries which have not completed will fail and need to be resubmitted after HiveServer2 has been upgraded.").build());
-  
+
   public static CheckDescription SERVICES_STORM_ROLLING_WARNING = new CheckDescription("SERVICES_STORM_ROLLING_WARNING",
     PrereqCheckType.SERVICE,
     "Storm Downtime During Upgrade",

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

@@ -26,6 +26,7 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 
 import com.google.inject.Singleton;
 
@@ -42,6 +43,8 @@ import com.google.inject.Singleton;
 @UpgradeCheck(group = UpgradeCheckGroup.MAINTENANCE_MODE, order = 7.0f, required = true)
 public class HostMaintenanceModeCheck extends AbstractCheckDescriptor {
 
+  public static final String KEY_CANNOT_START_HOST_ORDERED = "cannot_upgrade_mm_hosts";
+
   /**
    * Constructor.
    */
@@ -69,8 +72,15 @@ public class HostMaintenanceModeCheck extends AbstractCheckDescriptor {
 
     // for any host in MM, produce a warning
     if (!prerequisiteCheck.getFailedOn().isEmpty()) {
-      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-      prerequisiteCheck.setFailReason(getFailReason(prerequisiteCheck, request));
+      PrereqCheckStatus status = request.getUpgradeType() == UpgradeType.HOST_ORDERED ?
+          PrereqCheckStatus.FAIL : PrereqCheckStatus.WARNING;
+      prerequisiteCheck.setStatus(status);
+
+      String failReason = request.getUpgradeType() == UpgradeType.HOST_ORDERED ?
+          getFailReason(KEY_CANNOT_START_HOST_ORDERED, prerequisiteCheck, request) :
+          getFailReason(prerequisiteCheck, request);
+
+      prerequisiteCheck.setFailReason(failReason);
     }
   }
 }

+ 47 - 0
ambari-server/src/test/java/org/apache/ambari/server/checks/HostMaintenanceModeCheckTest.java

@@ -28,6 +28,7 @@ import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
+import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -84,4 +85,50 @@ public class HostMaintenanceModeCheckTest {
     hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster"));
     Assert.assertEquals(PrereqCheckStatus.WARNING, check.getStatus());
   }
+
+  @Test
+  public void testPerformHostOrdered() throws Exception {
+    final HostMaintenanceModeCheck hostMaintenanceModeCheck = new HostMaintenanceModeCheck();
+    hostMaintenanceModeCheck.clustersProvider = new Provider<Clusters>() {
+
+      @Override
+      public Clusters get() {
+        return clusters;
+      }
+    };
+
+    final Cluster cluster = Mockito.mock(Cluster.class);
+    Mockito.when(cluster.getClusterId()).thenReturn(1L);
+    Mockito.when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP", "2.2"));
+    Mockito.when(clusters.getCluster("cluster")).thenReturn(cluster);
+
+    final List<Host> hosts = new ArrayList<>();
+    final Host host1 = Mockito.mock(Host.class);
+    final Host host2 = Mockito.mock(Host.class);
+    final Host host3 = Mockito.mock(Host.class);
+
+    Mockito.when(host1.getMaintenanceState(1L)).thenReturn(MaintenanceState.OFF);
+    Mockito.when(host2.getMaintenanceState(1L)).thenReturn(MaintenanceState.OFF);
+    Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.OFF);
+    Mockito.when(host1.getHostName()).thenReturn("h1");
+    Mockito.when(host2.getHostName()).thenReturn("h2");
+    Mockito.when(host3.getHostName()).thenReturn("h3");
+
+    hosts.add(host1);
+    hosts.add(host2);
+    hosts.add(host3);
+
+    Mockito.when(cluster.getHosts()).thenReturn(hosts);
+
+    PrerequisiteCheck check = new PrerequisiteCheck(null, null);
+    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster"));
+    Assert.assertEquals(PrereqCheckStatus.PASS, check.getStatus());
+
+    // put a host into MM in order to trigger the warning
+    check = new PrerequisiteCheck(null, null);
+    Mockito.when(host3.getMaintenanceState(1L)).thenReturn(MaintenanceState.ON);
+    hostMaintenanceModeCheck.perform(check, new PrereqCheckRequest("cluster", UpgradeType.HOST_ORDERED));
+    Assert.assertEquals(PrereqCheckStatus.FAIL, check.getStatus());
+    Assert.assertEquals("The following hosts cannot be in Maintenance Mode: h3.", check.getFailReason());
+  }
 }