Sfoglia il codice sorgente

AMBARI-4760 : Client-only services transition to the STARTED state

tbeerbower 11 anni fa
parent
commit
6d522cb9d6

+ 43 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java

@@ -801,6 +801,14 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
 
   /**
    * Default calculator of service state.
+   * The following rules should apply :
+   * For services that have all components DISABLED, the service state should be DISABLED.
+   * For services that have any master components, the service state should
+   * be STARTED if all master components are STARTED.
+   * For services that have all client components, the service state should
+   * be INSTALLED if all of the components are INSTALLED.
+   * For all other cases the state of the service should match the highest state of all
+   * of its component states or UNKNOWN if the component states can not be determined.
    */
   protected static class DefaultServiceState implements ServiceState {
 
@@ -821,25 +829,50 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider
             Set<ServiceComponentHostResponse> hostComponentResponses =
                 controller.getHostComponents(Collections.singleton(request));
 
+            State   serviceState = null;
+            boolean hasDisabled  = false;
+            boolean hasMaster    = false;
+            boolean hasOther     = false;
+            boolean hasClient    = false;
+
             for (ServiceComponentHostResponse hostComponentResponse : hostComponentResponses ) {
               ComponentInfo componentInfo = ambariMetaInfo.getComponentCategory(stackId.getStackName(),
                   stackId.getStackVersion(), hostComponentResponse.getServiceName(),
                   hostComponentResponse.getComponentName());
 
-              if (componentInfo != null) {
-                if (componentInfo.isMaster()) {
-                  State state = getHostComponentState(hostComponentResponse);
-                  switch (state) {
-                    case STARTED:
-                    case DISABLED:
-                      break;
-                    default:
-                      return state;
+            if (componentInfo != null) {
+                State state = getHostComponentState(hostComponentResponse);
+
+                if (state.equals(State.DISABLED)) {
+                  hasDisabled = true;
+                } else {
+                  if (componentInfo.isMaster()) {
+                    hasMaster = true;
+                    if(!state.equals(State.STARTED) &&
+                        ( serviceState == null || state.ordinal() > serviceState.ordinal())) {
+                      serviceState = state;
+                    }
+                  } else if (componentInfo.isClient()) {
+                    hasClient = true;
+                    if (!(hasMaster || hasOther) && !state.equals(State.INSTALLED) &&
+                        (serviceState == null || state.ordinal() > serviceState.ordinal())) {
+                      serviceState = state;
+                    }
+                  } else {
+                    hasOther  = true;
+                    if (!hasMaster &&
+                        (serviceState == null || state.ordinal() > serviceState.ordinal())) {
+                      serviceState = state;
+                    }
                   }
                 }
               }
             }
-            return State.STARTED;
+
+            return hasMaster   ? serviceState == null ? State.STARTED : serviceState :
+                   hasOther    ? serviceState :
+                   hasClient   ? serviceState == null ? State.INSTALLED : serviceState :
+                   hasDisabled ? State.DISABLED : State.UNKNOWN;
           }
         } catch (AmbariException e) {
           LOG.error("Can't determine service state.", e);

+ 84 - 1
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ServiceResourceProviderTest.java

@@ -700,7 +700,6 @@ public class ServiceResourceProviderTest {
     expect(ambariMetaInfo.getComponentCategory((String) anyObject(), (String) anyObject(),
         (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
 
-    expect(componentInfo.isMaster()).andReturn(true);
     expect(componentInfo.isMaster()).andReturn(false);
     expect(componentInfo.isMaster()).andReturn(false);
 
@@ -860,6 +859,90 @@ public class ServiceResourceProviderTest {
     verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
   }
 
+  @Test
+  public void testDefaultServiceState_ClientOnly_INSTALLED() 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 = createNiceMock(ComponentInfo.class);
+
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "PIG", "PIG", "Host100", "INSTALLED", "", null, null, null);
+
+    Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+
+    // 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);
+
+    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(true);
+
+    // replay
+    replay(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
+
+    ServiceResourceProvider.ServiceState serviceState = new ServiceResourceProvider.DefaultServiceState();
+
+    State state = serviceState.getState(managementController, "C1", "PIG");
+    Assert.assertEquals(State.INSTALLED, state);
+
+    // verify
+    verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
+  }
+
+  @Test
+  public void testDefaultServiceState_ClientOnly_INSTALL_FAILED() 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 = createNiceMock(ComponentInfo.class);
+
+    ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "PIG", "PIG", "Host100", "INSTALL_FAILED", "", null, null, null);
+
+    Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>();
+    responses.add(shr1);
+
+    // 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);
+
+    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(true);
+
+    // replay
+    replay(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
+
+    ServiceResourceProvider.ServiceState serviceState = new ServiceResourceProvider.DefaultServiceState();
+
+    State state = serviceState.getState(managementController, "C1", "PIG");
+    Assert.assertEquals(State.INSTALL_FAILED, state);
+
+    // verify
+    verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo);
+  }
+
   public static ServiceResourceProvider getServiceProvider(AmbariManagementController managementController) {
     Resource.Type type = Resource.Type.Service;
     return new ServiceResourceProvider(PropertyHelper.getPropertyIds(type),