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")); + } + }
