AMBARI-6918. After putting RM in MaintMode (and stopping component), service shows stopped (dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4644a826 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4644a826 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4644a826 Branch: refs/heads/branch-alerts-dev Commit: 4644a826ba2b9a13a0815c356faaa9529e1922bc Parents: 5aaa32c Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Authored: Tue Aug 19 17:47:16 2014 +0300 Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com> Committed: Tue Aug 19 22:03:28 2014 +0300 ---------------------------------------------------------------------- .../internal/ServiceResourceProvider.java | 52 +++++---- .../internal/ServiceResourceProviderTest.java | 113 +++++++++++++++++++ 2 files changed, 146 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4644a826/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 c77b8d6..f8a362d 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 @@ -992,34 +992,48 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider if (componentInfo != null) { State state = getHostComponentState(hostComponentResponse); + // Components in MM should not affect service status, + // so we tend to ignore them + boolean isInMaintenance = ! MaintenanceState.OFF.toString(). + equals(hostComponentResponse.getMaintenanceState()); - if (state.equals(State.DISABLED)) { + if (state.equals(State.DISABLED) || isInMaintenance) { hasDisabled = true; - } else { - if (componentInfo.isMaster()) { + } + + if (componentInfo.isMaster()) { + if (state.equals(State.STARTED) || ! isInMaintenance) { + // We rely on master's state to determine service state hasMaster = true; - if(!state.equals(State.STARTED) && - ( masterState == null || state.ordinal() > masterState.ordinal())) { - masterState = state; - } - } else if (componentInfo.isClient()) { - hasClient = true; - if (!state.equals(State.INSTALLED) && - (clientState == null || state.ordinal() > clientState.ordinal())) { - clientState = state; - } - } else { - hasOther = true; - if (otherState == null || state.ordinal() > otherState.ordinal()) { - otherState = state; - } + } + + if (! state.equals(State.STARTED) && + ! isInMaintenance && // Ignore status of MM component + ( masterState == null || state.ordinal() > masterState.ordinal())) { + masterState = state; + } + } else if (componentInfo.isClient()) { + hasClient = true; + if (!state.equals(State.INSTALLED) && + (clientState == null || state.ordinal() > clientState.ordinal())) { + clientState = state; + } + } else { + if (state.equals(State.STARTED) || ! isInMaintenance) { + // We rely on slaves's state to determine service state + hasOther = true; + } + if (! state.equals(State.STARTED) && + ! isInMaintenance && // Ignore status of MM component + ( otherState == null || state.ordinal() > otherState.ordinal())) { + otherState = state; } } } } return hasMaster ? masterState == null ? State.STARTED : masterState : - hasOther ? otherState : + hasOther ? otherState == null ? State.STARTED : otherState : hasClient ? clientState == null ? State.INSTALLED : clientState : hasDisabled ? State.DISABLED : State.UNKNOWN; } http://git-wip-us.apache.org/repos/asf/ambari/blob/4644a826/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 f37dea8..7dbc38b 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 @@ -23,6 +23,7 @@ import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.createStrictMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isNull; @@ -61,6 +62,7 @@ import org.apache.ambari.server.metadata.RoleCommandOrder; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ComponentInfo; +import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; @@ -674,8 +676,11 @@ public class ServiceResourceProviderTest { ComponentInfo componentInfo = createNiceMock(ComponentInfo.class); ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "JOBTRACKER", "Host100", "UNKNOWN", "", null, null, null); + shr1.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "MAPREDUCE_CLIENT", "Host100", "STARTED", "", null, null, null); + shr2.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "TASKTRACKER", "Host100", "STARTED", "", null, null, null); + shr3.setMaintenanceState(MaintenanceState.OFF.toString()); Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>(); responses.add(shr1); @@ -720,8 +725,11 @@ public class ServiceResourceProviderTest { ComponentInfo componentInfo = createNiceMock(ComponentInfo.class); ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "JOBTRACKER", "Host100", "STARTING", "", null, null, null); + shr1.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "MAPREDUCE_CLIENT", "Host100", "STARTED", "", null, null, null); + shr2.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "TASKTRACKER", "Host100", "STARTED", "", null, null, null); + shr3.setMaintenanceState(MaintenanceState.OFF.toString()); Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>(); responses.add(shr1); @@ -766,8 +774,11 @@ public class ServiceResourceProviderTest { ComponentInfo componentInfo = createNiceMock(ComponentInfo.class); ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "JOBTRACKER", "Host100", "INSTALLED", "", null, null, null); + shr1.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "MAPREDUCE_CLIENT", "Host100", "STARTED", "", null, null, null); + shr2.setMaintenanceState(MaintenanceState.OFF.toString()); ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "MAPREDUCE", "TASKTRACKER", "Host100", "STARTED", "", null, null, null); + shr3.setMaintenanceState(MaintenanceState.OFF.toString()); Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>(); responses.add(shr1); @@ -1269,6 +1280,108 @@ public class ServiceResourceProviderTest { verify(managementController, clusters, cluster); } + @Test + @SuppressWarnings("unchecked") + public void testDefaultServiceState_Master_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); + + 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", "STARTED", "", null, null, null); + shr2.setMaintenanceState(MaintenanceState.OFF.toString()); + ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "YARN", "NODEMANAGER", "Host100", "STARTED", "", null, null, null); + shr3.setMaintenanceState(MaintenanceState.OFF.toString()); + + Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>(); + responses.add(shr1); + responses.add(shr2); + responses.add(shr3); + + // 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.isMaster()).andReturn(true).times(2); + expect(componentInfo.isMaster()).andReturn(false); + + expect(componentInfo.isClient()).andReturn(false); + + // 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); + + // verify + verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + } + + @Test + @SuppressWarnings("unchecked") + public void testDefaultServiceState_Slave_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 = createNiceMock(ComponentInfo.class); + + ServiceComponentHostResponse shr1 = new ServiceComponentHostResponse("C1", "YARN", "NODEMANAGER", "Host100", "INSTALLED", "", null, null, null); + shr1.setMaintenanceState(MaintenanceState.ON.toString()); + ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "YARN", "NODEMANAGER", "Host101", "STARTED", "", null, null, null); + shr2.setMaintenanceState(MaintenanceState.OFF.toString()); + + Set<ServiceComponentHostResponse> responses = new LinkedHashSet<ServiceComponentHostResponse>(); + responses.add(shr1); + responses.add(shr2); + + // 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.isMaster()).andReturn(false).anyTimes(); + + expect(componentInfo.isClient()).andReturn(false).anyTimes(); + + // 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); + + // verify + verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + } + /** * This factory method creates default MaintenanceStateHelper mock.