Repository: ambari Updated Branches: refs/heads/trunk 603775cfe -> e14f3530f
AMBARI-9266. When multiple Oozie servers installed and one of them stopped, service icon is red.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e14f3530 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e14f3530 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e14f3530 Branch: refs/heads/trunk Commit: e14f3530fb7fbf86af475221ae1141e6032a43a8 Parents: 603775c Author: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Authored: Sat Jan 10 13:07:55 2015 +0200 Committer: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Committed: Sat Jan 10 13:07:55 2015 +0200 ---------------------------------------------------------------------- .../internal/ServiceResourceProvider.java | 97 ++++++++++++++++---- .../internal/ServiceResourceProviderTest.java | 96 +++++++++++++++++++ 2 files changed, 177 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/e14f3530/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 ac2a3bb..e11accb 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 @@ -17,19 +17,9 @@ */ package org.apache.ambari.server.controller.internal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.google.inject.assistedinject.Assisted; +import com.google.inject.assistedinject.AssistedInject; +import com.google.inject.persist.Transactional; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.DuplicateResourceException; @@ -70,9 +60,18 @@ import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.State; import org.apache.commons.lang.StringUtils; -import com.google.inject.assistedinject.Assisted; -import com.google.inject.assistedinject.AssistedInject; -import com.google.inject.persist.Transactional; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Resource provider for service resources. @@ -110,6 +109,7 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider serviceStateMap.put("HBASE", new HBaseServiceState()); serviceStateMap.put("FLUME", new FlumeServiceState()); serviceStateMap.put("HIVE", new HiveServiceState()); + serviceStateMap.put("OOZIE", new OozieServiceState()); } private static final ServiceState DEFAULT_SERVICE_STATE = new DefaultServiceState(); @@ -1055,6 +1055,71 @@ public class ServiceResourceProvider extends AbstractControllerResourceProvider } /** + * Calculator of Oozie service state. + */ + protected static class OozieServiceState implements ServiceState { + + @Override + public State getState(AmbariManagementController controller,String clusterName, String serviceName) { + AmbariMetaInfo ambariMetaInfo = controller.getAmbariMetaInfo(); + Clusters clusters = controller.getClusters(); + + if (clusterName != null && clusterName.length() > 0) { + try { + Cluster cluster = clusters.getCluster(clusterName); + if (cluster != null) { + StackId stackId = cluster.getDesiredStackVersion(); + + ServiceComponentHostRequest request = new ServiceComponentHostRequest(clusterName, + serviceName, null, null, null); + + Set<ServiceComponentHostResponse> hostComponentResponses = + controller.getHostComponents(Collections.singleton(request)); + + int oozieServerActiveCount = 0; + State nonStartedState = null; + + for (ServiceComponentHostResponse hostComponentResponse : hostComponentResponses ) { + try { + ComponentInfo componentInfo = ambariMetaInfo.getComponent(stackId.getStackName(), + stackId.getStackVersion(), hostComponentResponse.getServiceName(), + hostComponentResponse.getComponentName()); + + if (componentInfo.isMaster()) { + State state = getHostComponentState(hostComponentResponse); + + switch (state) { + case STARTED: + case DISABLED: + String componentName = hostComponentResponse.getComponentName(); + if (componentName.equals("OOZIE_SERVER")) { + ++oozieServerActiveCount; + } + break; + default: + nonStartedState = state; + } + } + } catch (ObjectNotFoundException e) { + // component doesn't exist, nothing to do + } + } + + // should have state INSTALLED when there is no active OOZIE_SERVER + if (oozieServerActiveCount > 0) { + return State.STARTED; + } + return nonStartedState == null ? State.INSTALLED : nonStartedState; + } + } catch (AmbariException e) { + LOG.error("Can't determine service state.", e); + } + } + return State.UNKNOWN; + } + } + + /** * Calculator of HIVE service state. */ protected static class HiveServiceState implements ServiceState { http://git-wip-us.apache.org/repos/asf/ambari/blob/e14f3530/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 0c145fb..210c6a4 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 @@ -1127,6 +1127,102 @@ public class ServiceResourceProviderTest { } @Test + public void testOozieServiceState_STARTED() 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", "OOZIE", "OOZIE_SERVER", "Host100", "STARTED", "", null, null, null); + ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "OOZIE", "OOZIE_SERVER", "Host101", "INSTALLED", "", null, null, null); + ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "OOZIE", "OOZIE_CLIENT", "Host100", "STARTED", "", null, null, null); + + 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.getComponent((String) anyObject(), (String) anyObject(), + (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes(); + + expect(componentInfo.isMaster()).andReturn(true); + expect(componentInfo.isMaster()).andReturn(true); + expect(componentInfo.isMaster()).andReturn(false); + + // replay + replay(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + + ServiceResourceProvider.ServiceState serviceState = new ServiceResourceProvider.OozieServiceState(); + + State state = serviceState.getState(managementController, "C1", "OOZIE"); + Assert.assertEquals(State.STARTED, state); + + // verify + verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + } + + @Test + public void testOozieServiceState_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", "OOZIE", "OOZIE_SERVER", "Host100", "INSTALLED", "", null, null, null); + ServiceComponentHostResponse shr2 = new ServiceComponentHostResponse("C1", "OOZIE", "OOZIE_SERVER", "Host101", "INSTALLED", "", null, null, null); + ServiceComponentHostResponse shr3 = new ServiceComponentHostResponse("C1", "OOZIE", "OOZIE_CLIENT", "Host100", "STARTED", "", null, null, null); + + 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.getComponent((String) anyObject(), (String) anyObject(), + (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes(); + + expect(componentInfo.isMaster()).andReturn(true); + expect(componentInfo.isMaster()).andReturn(true); + expect(componentInfo.isMaster()).andReturn(false); + + // replay + replay(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + + ServiceResourceProvider.ServiceState serviceState = new ServiceResourceProvider.OozieServiceState(); + + State state = serviceState.getState(managementController, "C1", "OOZIE"); + Assert.assertEquals(State.INSTALLED, state); + + // verify + verify(managementController, clusters, cluster, ambariMetaInfo, stackId, componentInfo); + } + + @Test public void testHBaseServiceState_STARTED() throws Exception{ AmbariManagementController managementController = createMock(AmbariManagementController.class); Clusters clusters = createNiceMock(Clusters.class);