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/branch-alerts-dev
Commit: dcc00b69b3350729123cbf43dd80cf0da314bae6
Parents: dc15b77
Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Authored: Tue Sep 9 16:50:18 2014 +0300
Committer: Lisnichenko Dmitro <dlysniche...@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)

Reply via email to