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)