Browse Source

AMBARI-8991. Pre-Upgrade checks: validate cluster_name add repository_version properties (Yurii Shylov via ncole)

Nate Cole 10 years ago
parent
commit
7c1142b322

+ 43 - 3
ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeCheckHelper.java

@@ -25,6 +25,7 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.ClusterNotFoundException;
 import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PreUpgradeCheckRequest;
@@ -80,6 +81,7 @@ public class UpgradeCheckHelper {
     registry.add(new HostsHeartbeatCheck());
     registry.add(new HostsMasterMaintenanceCheck());
     registry.add(new HostsRepositoryVersionCheck());
+    registry.add(new ServicesUpCheck());
     registry.add(new ServicesMaintenanceModeCheck());
     registry.add(new ServicesNamenodeHighAvailabilityCheck());
     registry.add(new ServicesYarnWorkPreservingCheck());
@@ -105,6 +107,10 @@ public class UpgradeCheckHelper {
           upgradeCheckDescriptor.perform(upgradeCheck, request);
           upgradeCheckResults.add(upgradeCheck);
         }
+      } catch (ClusterNotFoundException ex) {
+        upgradeCheck.setStatus(UpgradeCheckStatus.FAIL);
+        upgradeCheck.setFailReason("Cluster with name " + clusterName + " doesn't exists");
+        upgradeCheckResults.add(upgradeCheck);
       } catch (Exception ex) {
         LOG.error("Pre-upgrade check " + upgradeCheckDescriptor.id + " failed", ex);
         upgradeCheck.setStatus(UpgradeCheckStatus.FAIL);
@@ -160,6 +166,35 @@ public class UpgradeCheckHelper {
     public abstract void perform(UpgradeCheck upgradeCheck, PreUpgradeCheckRequest request) throws AmbariException;
   }
 
+  /**
+   * Checks that services are up.
+   */
+  protected class ServicesUpCheck extends UpgradeCheckDescriptor {
+
+    /**
+     * Constructor.
+     */
+    public ServicesUpCheck() {
+      super("SERVICES_UP", UpgradeCheckType.SERVICE, "All services must be up");
+    }
+
+    @Override
+    public void perform(UpgradeCheck upgradeCheck, PreUpgradeCheckRequest request) throws AmbariException {
+      final String clusterName = request.getClusterName();
+      final Cluster cluster = clustersProvider.get().getCluster(clusterName);
+      for (Map.Entry<String, Service> serviceEntry : cluster.getServices().entrySet()) {
+        final Service service = serviceEntry.getValue();
+        if (!service.isClientOnlyService() && service.getDesiredState() != State.STARTED) {
+          upgradeCheck.getFailedOn().add(service.getName());
+        }
+      }
+      if (!upgradeCheck.getFailedOn().isEmpty()) {
+        upgradeCheck.setStatus(UpgradeCheckStatus.FAIL);
+        upgradeCheck.setFailReason("Some services are down");
+      }
+    }
+  }
+
   /**
    * Checks that services are in the maintenance mode.
    */
@@ -178,7 +213,7 @@ public class UpgradeCheckHelper {
       final Cluster cluster = clustersProvider.get().getCluster(clusterName);
       for (Map.Entry<String, Service> serviceEntry : cluster.getServices().entrySet()) {
         final Service service = serviceEntry.getValue();
-        if (service.getDesiredState() != State.STARTED || service.getMaintenanceState() == MaintenanceState.ON) {
+        if (service.getMaintenanceState() == MaintenanceState.ON) {
           upgradeCheck.getFailedOn().add(service.getName());
         }
       }
@@ -283,10 +318,16 @@ public class UpgradeCheckHelper {
       final String clusterName = request.getClusterName();
       final Cluster cluster = clustersProvider.get().getCluster(clusterName);
       final Map<String, Host> clusterHosts = clustersProvider.get().getHostsForCluster(clusterName);
+      final RepositoryVersionEntity repositoryVersion = repositoryVersionDaoProvider.get().findByDisplayName(request.getRepositoryVersionName());
+      if (repositoryVersion == null) {
+        upgradeCheck.setStatus(UpgradeCheckStatus.FAIL);
+        upgradeCheck.setFailReason("Repository version " + request.getRepositoryVersionName() + " doesn't exist");
+        upgradeCheck.getFailedOn().addAll(clusterHosts.keySet());
+        return;
+      }
       for (Map.Entry<String, Host> hostEntry : clusterHosts.entrySet()) {
         final Host host = hostEntry.getValue();
         if (host.getMaintenanceState(cluster.getClusterId()) == MaintenanceState.OFF) {
-          final RepositoryVersionEntity repositoryVersion = repositoryVersionDaoProvider.get().findByDisplayName(request.getRepositoryVersionName());
           final HostVersionEntity hostVersion = hostVersionDaoProvider.get().findByClusterStackVersionAndHost(clusterName, repositoryVersion.getStack(), repositoryVersion.getVersion(), host.getHostName());
           if (hostVersion == null || hostVersion.getState() != RepositoryVersionState.INSTALLED) {
             upgradeCheck.getFailedOn().add(host.getHostName());
@@ -297,7 +338,6 @@ public class UpgradeCheckHelper {
         upgradeCheck.setStatus(UpgradeCheckStatus.FAIL);
         upgradeCheck.setFailReason("Some hosts do not have repository version " + request.getRepositoryVersionName() + " installed");
       }
-
     }
   }
 

+ 47 - 0
ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeCheckHelperTest.java

@@ -22,12 +22,24 @@ import java.util.List;
 import junit.framework.Assert;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PreUpgradeCheckRequest;
+import org.apache.ambari.server.orm.dao.HostVersionDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.state.UpgradeCheckHelper.UpgradeCheckDescriptor;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeCheckStatus;
 import org.easymock.EasyMock;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.util.Providers;
 
 /**
  * Tests the {@link UpgradeCheckHelper} class
@@ -85,4 +97,39 @@ public class UpgradeCheckHelperTest {
     Assert.assertEquals(UpgradeCheckStatus.FAIL, upgradeChecks.get(0).getStatus());
   }
 
+  @Test
+  public void performPreUpgradeChecksTest_clusterIsMissing() throws Exception {
+    final Clusters clusters = Mockito.mock(Clusters.class);
+    Mockito.when(clusters.getCluster(Mockito.anyString())).thenAnswer(new Answer<Cluster>() {
+      @Override
+      public Cluster answer(InvocationOnMock invocation) throws Throwable {
+        final String clusterName = invocation.getArguments()[0].toString();
+        if (clusterName.equals("existing")) {
+          return Mockito.mock(Cluster.class);
+        } else {
+          throw new ClusterNotFoundException(clusterName);
+        }
+      }
+    });
+    final Injector injector = Guice.createInjector(new AbstractModule() {
+
+      @Override
+      protected void configure() {
+        bind(Clusters.class).toInstance(clusters);
+        bind(Configuration.class).toProvider(Providers.<Configuration> of(null));
+        bind(HostVersionDAO.class).toProvider(Providers.<HostVersionDAO> of(null));
+        bind(RepositoryVersionDAO.class).toProvider(Providers.<RepositoryVersionDAO> of(null));
+      }
+    });
+    final UpgradeCheckHelper helper = injector.getInstance(UpgradeCheckHelper.class);
+    helper.registry.clear();
+    helper.registry.add(helper.new ServicesUpCheck()); //mocked Cluster has no services, so the check should always be PASS
+    List<UpgradeCheck> upgradeChecks = helper.performPreUpgradeChecks(new PreUpgradeCheckRequest("existing"));
+    Assert.assertEquals(UpgradeCheckStatus.PASS, upgradeChecks.get(0).getStatus());
+    upgradeChecks = helper.performPreUpgradeChecks(new PreUpgradeCheckRequest("non-existing"));
+    Assert.assertEquals(UpgradeCheckStatus.FAIL, upgradeChecks.get(0).getStatus());
+    //non existing cluster is an expected error
+    Assert.assertTrue(!upgradeChecks.get(0).getFailReason().equals("Unexpected server error happened"));
+  }
+
 }