You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2014/09/10 17:30:18 UTC

git commit: AMBARI-7237. No start action for stopped service in MM mode Stack 1.3 (dlysnichenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk dc15b7706 -> dcc00b69b


AMBARI-7237. No start action for stopped service in MM mode Stack 1.3 (dlysnichenko)


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

Branch: refs/heads/trunk
Commit: dcc00b69b3350729123cbf43dd80cf0da314bae6
Parents: dc15b77
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Tue Sep 9 16:50:18 2014 +0300
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Wed Sep 10 18:27:21 2014 +0300

----------------------------------------------------------------------
 .../internal/ServiceResourceProvider.java       |  14 ++-
 .../internal/ServiceResourceProviderTest.java   | 122 ++++++++++++++++++-
 2 files changed, 133 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/dcc00b69/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index aec91fd..31c6c37 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@ -981,11 +981,13 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
             State   masterState = null;
             State   clientState = null;
             State   otherState = null;
+            State   maxMMState = null; // The worst state among components in MM
 
             boolean hasDisabled  = false;
             boolean hasMaster    = false;
             boolean hasOther     = false;
             boolean hasClient    = false;
+            boolean hasMM        = false;
 
             for (ServiceComponentHostResponse hostComponentResponse : hostComponentResponses ) {
               ComponentInfo componentInfo = ambariMetaInfo.getComponentCategory(stackId.getStackName(),
@@ -999,10 +1001,17 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
                 boolean isInMaintenance = ! MaintenanceState.OFF.toString().
                         equals(hostComponentResponse.getMaintenanceState());
 
-                if (state.equals(State.DISABLED) || isInMaintenance) {
+                if (state.equals(State.DISABLED)) {
                   hasDisabled = true;
                 }
 
+                if (isInMaintenance & !componentInfo.isClient()) {
+                  hasMM = true;
+                  if ( maxMMState == null || state.ordinal() > maxMMState.ordinal()) {
+                    maxMMState = state;
+                  }
+                }
+
                 if (componentInfo.isMaster()) {
                   if (state.equals(State.STARTED) || ! isInMaintenance) {
                     // We rely on master's state to determine service state
@@ -1037,7 +1046,8 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
             return hasMaster   ? masterState == null ? State.STARTED : masterState :
                    hasOther    ? otherState == null ? State.STARTED : otherState :
                    hasClient   ? clientState == null ? State.INSTALLED : clientState :
-                   hasDisabled ? State.DISABLED : State.UNKNOWN;
+                   hasDisabled ? State.DISABLED :
+                   hasMM       ? maxMMState : State.UNKNOWN;
           }
         } catch (AmbariException e) {
           LOG.error("Can't determine service state.", e);

http://git-wip-us.apache.org/repos/asf/ambari/blob/dcc00b69/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
index 7dbc38b..05f2e01 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java
@@ -28,6 +28,7 @@ import static org.easymock.EasyMock.eq;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isNull;
 import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
 import static org.easymock.EasyMock.verify;
 
 import java.lang.reflect.Field;
@@ -1149,6 +1150,7 @@ public class ServiceResourceProviderTest {
     ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
 
     ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "PIG", "PIG", "Host100", "INSTALLED", "", null, null, null);
+    shr1.setMaintenanceState(MaintenanceState.OFF.toString());
 
     Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>();
     responses.add(shr1);
@@ -1191,6 +1193,7 @@ public class ServiceResourceProviderTest {
     ComponentInfo componentInfo = createNiceMock(ComponentInfo.class);
 
     ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "PIG", "PIG", "Host100", "INSTALL_FAILED", "", null, null, null);
+    shr1.setMaintenanceState(MaintenanceState.OFF.toString());
 
     Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>();
     responses.add(shr1);
@@ -1316,7 +1319,13 @@ public class ServiceResourceProviderTest {
     expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
             (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
 
-    expect(componentInfo.isMaster()).andReturn(true).times(2);
+    expect(componentInfo.isClient()).andReturn(false).anyTimes();
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false).anyTimes();
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false).anyTimes();
     expect(componentInfo.isMaster()).andReturn(false);
 
     expect(componentInfo.isClient()).andReturn(false);
@@ -1383,6 +1392,117 @@ public class ServiceResourceProviderTest {
   }
 
 
+  @Test
+  @SuppressWarnings("unchecked")
+  /**
+   * Tests the case when all service components are in MM (so we base on MM
+   * components state when calculating entire service state)
+   */
+  public void testDefaultServiceState_All_Components_In_MM() throws Exception{
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    Clusters clusters = createNiceMock(Clusters.class);
+    Cluster cluster = createNiceMock(Cluster.class);
+    AmbariMetaInfo ambariMetaInfo = createNiceMock(AmbariMetaInfo.class);
+    StackId stackId = createNiceMock(StackId.class);
+    ComponentInfo componentInfo = createStrictMock(ComponentInfo.class);
+
+    /*
+     * Any component is started, all other are stopped - service is considered STARTED
+     */
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "YARN", "RESOURCEMANAGER", "Host100", "INSTALLED", "", null, null, null);
+    shr1.setMaintenanceState(MaintenanceState.ON.toString());
+    ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "YARN", "RESOURCEMANAGER", "Host101", "INSTALLED", "", null, null, null);
+    shr2.setMaintenanceState(MaintenanceState.ON.toString());
+    ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "YARN", "NODEMANAGER", "Host100", "STARTED", "", null, null, null);
+    shr3.setMaintenanceState(MaintenanceState.ON.toString());
+    ServiceComponentHostResponse shr4 = new ServiceComponentHostResponse("C1", "YARN", "YARN_CLIENT", "Host100", "INSTALLED", "", null, null, null);
+    shr4.setMaintenanceState(MaintenanceState.ON.toString());
+
+
+    Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+    responses.add(shr2);
+    responses.add(shr3);
+    responses.add(shr4);
+
+    // set expectations
+    expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
+    expect(managementController.getClusters()).andReturn(clusters).anyTimes();
+    expect(clusters.getCluster("C1")).andReturn(cluster).anyTimes();
+    expect(managementController.getHostComponents((Set<ServiceComponentHostRequest>) anyObject())).andReturn(responses).anyTimes();
+    expect(cluster.getDesiredStackVersion()).andReturn(stackId).anyTimes();
+
+    expect(stackId.getStackName()).andReturn("S1").anyTimes();
+    expect(stackId.getStackVersion()).andReturn("V1").anyTimes();
+
+
+    expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
+            (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(false);
+    expect(componentInfo.isClient()).andReturn(false);
+
+    expect(componentInfo.isClient()).andReturn(true);
+    expect(componentInfo.isMaster()).andReturn(false);
+
+    expect(componentInfo.isClient()).andReturn(true).times(2);
+
+    // replay
+    replay(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
+
+    ServiceResourceProvider.ServiceState serviceState = new ServiceResourceProvider.DefaultServiceState();
+
+    State state = serviceState.getState(managementController, "C1", "YARN");
+    Assert.assertEquals(State.STARTED, state);
+
+    /*
+     * All components are stopped, service is considered INSTALLED
+     */
+    reset(componentInfo);
+
+    responses.clear();
+    shr1 = new ServiceComponentHostResponse("C1", "YARN", "RESOURCEMANAGER", "Host100", "INSTALLED", "", null, null, null);
+    shr1.setMaintenanceState(MaintenanceState.ON.toString());
+    shr2 = new ServiceComponentHostResponse("C1", "YARN", "RESOURCEMANAGER", "Host101", "INSTALLED", "", null, null, null);
+    shr2.setMaintenanceState(MaintenanceState.ON.toString());
+    shr3 = new ServiceComponentHostResponse("C1", "YARN", "NODEMANAGER", "Host100", "INSTALLED", "", null, null, null);
+    shr3.setMaintenanceState(MaintenanceState.ON.toString());
+    shr4 = new ServiceComponentHostResponse("C1", "YARN", "YARN_CLIENT", "Host100", "INSTALLED", "", null, null, null);
+    shr4.setMaintenanceState(MaintenanceState.ON.toString());
+    responses.add(shr1);
+    responses.add(shr2);
+    responses.add(shr3);
+    responses.add(shr4);
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(true);
+
+    expect(componentInfo.isClient()).andReturn(false);
+    expect(componentInfo.isMaster()).andReturn(false);
+    expect(componentInfo.isClient()).andReturn(false);
+
+    expect(componentInfo.isClient()).andReturn(true);
+    expect(componentInfo.isMaster()).andReturn(false);
+
+    expect(componentInfo.isClient()).andReturn(true).times(2);
+
+    replay(componentInfo);
+
+    state = serviceState.getState(managementController, "C1", "YARN");
+    Assert.assertEquals(State.INSTALLED, state);
+  }
+
+
   /**
    * This factory method creates default MaintenanceStateHelper mock.
    * It's useful in most cases (when we don't care about Maintenance State)