Repository: ambari
Updated Branches:
  refs/heads/trunk 3105ccdbe -> 7c1142b32


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


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7c1142b3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7c1142b3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7c1142b3

Branch: refs/heads/trunk
Commit: 7c1142b322be5528d69403610073b4482cecb4d5
Parents: 3105ccd
Author: Nate Cole <[email protected]>
Authored: Wed Jan 7 13:50:07 2015 -0500
Committer: Nate Cole <[email protected]>
Committed: Wed Jan 7 13:50:07 2015 -0500

----------------------------------------------------------------------
 .../ambari/server/state/UpgradeCheckHelper.java | 46 +++++++++++++++++--
 .../server/state/UpgradeCheckHelperTest.java    | 47 ++++++++++++++++++++
 2 files changed, 90 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7c1142b3/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeCheckHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeCheckHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeCheckHelper.java
index 355532f..4d16a83 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeCheckHelper.java
+++ 
b/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);
@@ -161,6 +167,35 @@ public class UpgradeCheckHelper {
   }
 
   /**
+   * 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.
    */
   protected class ServicesMaintenanceModeCheck extends UpgradeCheckDescriptor {
@@ -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");
       }
-
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7c1142b3/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeCheckHelperTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeCheckHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeCheckHelperTest.java
index 2cbe088..c5f27c7 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeCheckHelperTest.java
+++ 
b/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"));
+  }
+
 }

Reply via email to