Updated Branches: refs/heads/trunk eec3548f1 -> 369aeb4e5
AMBARI-4543. Changes to Components should ignore PASSIVE HostComponents (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/369aeb4e Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/369aeb4e Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/369aeb4e Branch: refs/heads/trunk Commit: 369aeb4e5b551f91fb034aba6ce1b59490925e04 Parents: eec3548 Author: Nate Cole <[email protected]> Authored: Thu Feb 6 09:24:08 2014 -0800 Committer: Nate Cole <[email protected]> Committed: Thu Feb 6 09:24:08 2014 -0800 ---------------------------------------------------------------------- .../AmbariManagementControllerImpl.java | 5 ++- .../internal/ComponentResourceProvider.java | 21 +++++++++++-- .../AmbariManagementControllerTest.java | 33 +++++++++++++++++++- .../internal/ComponentResourceProviderTest.java | 5 +++ 4 files changed, 60 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/369aeb4e/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index 2e1c3cd..0efc935 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -1506,7 +1506,10 @@ public class AmbariManagementControllerImpl implements PassiveState oldPassive = getEffectivePassiveState(cluster, s, sch); if (newPassive != oldPassive) { - if (newPassive.equals(PassiveState.IMPLIED)) { + if (sc.isClientComponent()) { + throw new IllegalArgumentException("Invalid arguments, cannot set " + + "passive state on a client component"); + } else if (newPassive.equals(PassiveState.IMPLIED)) { throw new IllegalArgumentException("Invalid arguments, can only set " + "passive state to one of " + EnumSet.of(PassiveState.ACTIVE, PassiveState.PASSIVE)); } else { http://git-wip-us.apache.org/repos/asf/ambari/blob/369aeb4e/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java index 5e9b3b4..feb0469 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java @@ -49,6 +49,7 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; 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.PassiveState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentFactory; @@ -557,8 +558,9 @@ public class ComponentResourceProvider extends AbstractControllerResourceProvide return null; } - Clusters clusters = getManagementController().getClusters(); - AmbariMetaInfo ambariMetaInfo = getManagementController().getAmbariMetaInfo(); + AmbariManagementController controller = getManagementController(); + Clusters clusters = controller.getClusters(); + AmbariMetaInfo ambariMetaInfo = controller.getAmbariMetaInfo(); Map<State, List<ServiceComponent>> changedComps = new HashMap<State, List<ServiceComponent>>(); @@ -732,6 +734,21 @@ public class ComponentResourceProvider extends AbstractControllerResourceProvide } continue; } + + // do not update or alter any HC that is not active + PassiveState schPassive = controller.getEffectivePassiveState(cluster, s, sch); + if (PassiveState.ACTIVE != schPassive) { + if (LOG.isDebugEnabled()) { + LOG.debug("Ignoring ServiceComponentHost" + + ", clusterName=" + request.getClusterName() + + ", serviceName=" + s.getName() + + ", componentName=" + sc.getName() + + ", hostname=" + sch.getHostName() + + ", passive=" + schPassive); + } + continue; + } + if (!State.isValidStateTransition(oldSchState, newState)) { // FIXME throw correct error throw new AmbariException("Invalid transition for" http://git-wip-us.apache.org/repos/asf/ambari/blob/369aeb4e/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java index f483068..5bea305 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java @@ -9026,7 +9026,6 @@ public class AmbariManagementControllerTest { Map<String, String> requestProperties = new HashMap<String, String>(); requestProperties.put("context", "Called from a test"); - Cluster cluster = clusters.getCluster(clusterName); Service service = cluster.getService(serviceName); Map<String, Host> hosts = clusters.getHostsForCluster(clusterName); @@ -9128,6 +9127,38 @@ public class AmbariManagementControllerTest { targetSch.setPassiveState(PassiveState.PASSIVE); Assert.assertEquals(PassiveState.PASSIVE, controller.getEffectivePassiveState(cluster, service, targetSch)); + // check the host components active state vs desired state + for (ServiceComponent sc : service.getServiceComponents().values()) { + for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) { + Assert.assertEquals(State.INIT, sch.getState()); + } + } + + // attempt install on DATANODE only + ServiceComponentRequest scr = new ServiceComponentRequest(clusterName, + serviceName, componentName2, State.INSTALLED.name()); + RequestStatusResponse rsr = ComponentResourceProviderTest.updateComponents( + controller, Collections.singleton(scr), requestProperties, false); + + if (rsr != null) { + // manually change live state to stopped as no running action manager + List<HostRoleCommand> commands = actionDB.getRequestTasks(rsr.getRequestId()); + for (HostRoleCommand cmd : commands) { + clusters.getCluster(clusterName).getService(serviceName).getServiceComponent(cmd.getRole().name()) + .getServiceComponentHost(cmd.getHostName()).setState(State.INSTALLED); + } + } + + // verify passive sch was skipped + for (ServiceComponent sc : service.getServiceComponents().values()) { + if (!sc.getName().equals(componentName2)) + continue; + + for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) { + Assert.assertEquals(sch == targetSch ? State.INIT : State.INSTALLED, sch.getState()); + } + } + } @Test http://git-wip-us.apache.org/repos/asf/ambari/blob/369aeb4e/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java index a8770ac..81c1daf 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java @@ -60,6 +60,7 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper; 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.PassiveState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentFactory; @@ -238,6 +239,10 @@ public class ComponentResourceProviderTest { // set expectations expect(managementController.getClusters()).andReturn(clusters).anyTimes(); expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes(); + expect(managementController.getEffectivePassiveState( + capture(new Capture<Cluster>()), capture(new Capture<Service>()), + capture(new Capture<ServiceComponentHost>()))).andReturn(PassiveState.ACTIVE).anyTimes(); + expect(clusters.getCluster("Cluster100")).andReturn(cluster).anyTimes(); expect(cluster.getDesiredStackVersion()).andReturn(stackId);
