Repository: incubator-slider
Updated Branches:
  refs/heads/develop 1ab0cbbd8 -> 9130f0eac


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
----------------------------------------------------------------------
diff --git 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index a11ce56..ed87b89 100644
--- 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -77,6 +77,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -85,6 +86,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.slider.api.ResourceKeys.*;
@@ -166,13 +168,13 @@ public class AppState {
   private ClusterDescription clusterStatusTemplate = new ClusterDescription();
 
   private final Map<Integer, RoleStatus> roleStatusMap =
-    new ConcurrentHashMap<>();
+    new ConcurrentSkipListMap<>();
 
   private final Map<String, ProviderRole> roles =
     new ConcurrentHashMap<>();
 
-  private final Map<Integer, ProviderRole> rolePriorityMap = 
-    new ConcurrentHashMap<>();
+  private final ConcurrentSkipListMap<Integer, ProviderRole> rolePriorityMap =
+    new ConcurrentSkipListMap<>();
 
   /**
    * The master node.
@@ -533,14 +535,19 @@ public class AppState {
 
     Set<String> roleNames = resources.getComponentNames();
     for (String name : roleNames) {
-      if (!roles.containsKey(name)) {
-        // this is a new value
-        log.info("Adding role {}", name);
-        MapOperations resComponent = resources.getComponent(name);
-        ProviderRole dynamicRole = createDynamicProviderRole(name, 
resComponent);
-        buildRole(dynamicRole);
-        roleList.add(dynamicRole);
+      if (roles.containsKey(name)) {
+        continue;
+      }
+      if (hasUniqueNames(resources, name)) {
+        log.info("Skipping group {}", name);
+        continue;
       }
+      // this is a new value
+      log.info("Adding role {}", name);
+      MapOperations resComponent = resources.getComponent(name);
+      ProviderRole dynamicRole = createDynamicProviderRole(name, resComponent);
+      buildRole(dynamicRole);
+      roleList.add(dynamicRole);
     }
     //then pick up the requirements
     buildRoleRequirementsFromResources();
@@ -615,6 +622,18 @@ public class AppState {
    */
   public ProviderRole createDynamicProviderRole(String name, MapOperations 
component)
       throws BadConfigException {
+    return createDynamicProviderRole(name, name, component);
+  }
+
+  /**
+   * Build a dynamic provider role
+   * @param name name of role
+   * @param group group of role
+   * @return a new provider role
+   * @throws BadConfigException bad configuration
+   */
+  public ProviderRole createDynamicProviderRole(String name, String group, 
MapOperations component)
+      throws BadConfigException {
     String priOpt = component.getMandatoryOption(COMPONENT_PRIORITY);
     int priority = SliderUtils.parseAndValidate(
         "value of " + name + " " + COMPONENT_PRIORITY, priOpt, 0, 1, -1);
@@ -629,9 +648,10 @@ public class AppState {
             DEFAULT_PLACEMENT_ESCALATE_DELAY_SECONDS);
 
     ProviderRole newRole = new ProviderRole(name,
+        group,
         priority,
         placement,
-        getNodeFailureThresholdForRole(name),
+        getNodeFailureThresholdForRole(group),
         placementTimeout,
         component.getOption(YARN_LABEL_EXPRESSION, DEF_YARN_LABEL_EXPRESSION));
     log.info("New {} ", newRole);
@@ -659,6 +679,10 @@ public class AppState {
     //note the time 
     snapshotTime = now();
 
+    for (String component : 
instanceDefinition.getResourceOperations().getComponentNames()) {
+      instanceDefinition.getAppConfOperations().getOrAddComponent(component);
+    }
+
     // resolve references if not already done
     instanceDefinition.resolve();
 
@@ -709,7 +733,7 @@ public class AppState {
     // and then driving application size
     instanceDefinition.setResources(serDeser.fromInstance(resources));
     onInstanceDefinitionUpdated();
- 
+
     // propagate the role table
     Map<String, Map<String, String>> updated = resources.components;
     getClusterStatus().roles = SliderUtils.deepClone(updated);
@@ -732,6 +756,7 @@ public class AppState {
         instanceDefinition.getResourceOperations();
 
     // Add all the existing roles
+    Map<String, Integer> groupCounts = new HashMap<>();
     for (RoleStatus roleStatus : getRoleStatusMap().values()) {
       if (roleStatus.isExcludeFromFlexing()) {
         // skip inflexible roles, e.g AM itself
@@ -739,14 +764,33 @@ public class AppState {
       }
       long currentDesired = roleStatus.getDesired();
       String role = roleStatus.getName();
-      int desiredInstanceCount = getDesiredInstanceCount(resources, role);
-      if (desiredInstanceCount == 0) {
+      String roleGroup = roleStatus.getGroup();
+      int desiredInstanceCount = getDesiredInstanceCount(resources, roleGroup);
+
+      int newDesired = desiredInstanceCount;
+      if (hasUniqueNames(resources, roleGroup)) {
+        Integer groupCount = 0;
+        if (groupCounts.containsKey(roleGroup)) {
+          groupCount = groupCounts.get(roleGroup);
+        }
+
+        newDesired = desiredInstanceCount - groupCount;
+
+        if (newDesired > 0) {
+          newDesired = 1;
+          groupCounts.put(roleGroup, groupCount + newDesired);
+        } else {
+          newDesired = 0;
+        }
+      }
+
+      if (newDesired == 0) {
         log.info("Role {} has 0 instances specified", role);
       }
-      if (currentDesired != desiredInstanceCount) {
+      if (currentDesired != newDesired) {
         log.info("Role {} flexed from {} to {}", role, currentDesired,
-            desiredInstanceCount);
-        roleStatus.setDesired(desiredInstanceCount);
+            newDesired);
+        roleStatus.setDesired(newDesired);
       }
     }
 
@@ -754,7 +798,34 @@ public class AppState {
     // add any role status entries not in the role status
     Set<String> roleNames = resources.getComponentNames();
     for (String name : roleNames) {
-      if (!roles.containsKey(name)) {
+      if (roles.containsKey(name)) {
+        continue;
+      }
+      if (hasUniqueNames(resources, name)) {
+        int desiredInstanceCount = getDesiredInstanceCount(resources, name);
+        Integer groupCount = 0;
+        if (groupCounts.containsKey(name)) {
+          groupCount = groupCounts.get(name);
+        }
+        for (int i = groupCount + 1; i <= desiredInstanceCount; i++) {
+          int priority = resources.getComponentOptInt(name, 
COMPONENT_PRIORITY, i);
+          // this is a new instance of an existing group
+          String newName = String.format("%s%d", name, i);
+          int newPriority = getNewPriority(priority + i - 1);
+          log.info("Adding new role {}", newName);
+          MapOperations component = resources.getComponent(name,
+              Collections.singletonMap(COMPONENT_PRIORITY,
+                  Integer.toString(newPriority)));
+          ProviderRole dynamicRole = createDynamicProviderRole(newName, name, 
component);
+          RoleStatus roleStatus = buildRole(dynamicRole);
+          roleStatus.setDesired(1);
+          log.info("New role {}", roleStatus);
+          if (roleHistory != null) {
+            roleHistory.addNewRole(roleStatus);
+          }
+          newRoles.add(dynamicRole);
+        }
+      } else {
         // this is a new value
         log.info("Adding new role {}", name);
         MapOperations component = resources.getComponent(name);
@@ -772,6 +843,13 @@ public class AppState {
     return newRoles;
   }
 
+  private int getNewPriority(int start) {
+    if (!rolePriorityMap.containsKey(start)) {
+      return start;
+    }
+    return rolePriorityMap.lastKey() + 1;
+  }
+
   /**
    * Get the desired instance count of a role, rejecting negative values
    * @param resources resource map
@@ -794,6 +872,15 @@ public class AppState {
     return desiredInstanceCount;
   }
 
+  private Boolean hasUniqueNames(ConfTreeOperations resources, String group) {
+    MapOperations component = resources.getComponent(group);
+    if (component == null) {
+      log.info("Component was null for {} when checking unique names", group);
+      return Boolean.FALSE;
+    }
+    return component.getOptionBool(UNIQUE_NAMES, Boolean.FALSE);
+  }
+
   /**
    * Add knowledge of a role.
    * This is a build-time operation that is not synchronized, and
@@ -851,6 +938,7 @@ public class AppState {
     container.setNodeHttpAddress(nodeHttpAddress);
     RoleInstance am = new RoleInstance(container);
     am.role = SliderKeys.COMPONENT_AM;
+    am.group = SliderKeys.COMPONENT_AM;
     am.roleId = SliderKeys.ROLE_AM_PRIORITY_INDEX;
     am.createTime =now();
     am.startTime = am.createTime;
@@ -1863,7 +1951,7 @@ public class AppState {
   private int getFailureThresholdForRole(RoleStatus roleStatus) {
     ConfTreeOperations resources =
         instanceDefinition.getResourceOperations();
-    return resources.getComponentOptInt(roleStatus.getName(),
+    return resources.getComponentOptInt(roleStatus.getGroup(),
         CONTAINER_FAILURE_THRESHOLD,
         failureThreshold);
   }
@@ -2335,6 +2423,7 @@ public class AppState {
     RoleInstance instance = new RoleInstance(container);
     instance.command = roleName;
     instance.role = roleName;
+    instance.group = role.getGroup();
     instance.roleId = roleId;
     instance.environment = new String[0];
     instance.container = container;

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
----------------------------------------------------------------------
diff --git 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
index 345c67e..30cfec9 100644
--- 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
+++ 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
@@ -56,6 +56,7 @@ public final class RoleInstance implements Cloneable {
    * Name of the role
    */
   public String role;
+  public String group;
 
   /**
    * Version of the app

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
----------------------------------------------------------------------
diff --git 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
index ce0d60e..0a3a3c9 100644
--- 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
+++ 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
@@ -45,6 +45,7 @@ import java.util.Map;
 public final class RoleStatus implements Cloneable, MetricSet {
 
   private final String name;
+  private final String group;
 
   /**
    * Role priority
@@ -81,6 +82,7 @@ public final class RoleStatus implements Cloneable, MetricSet 
{
   public RoleStatus(ProviderRole providerRole) {
     this.providerRole = providerRole;
     this.name = providerRole.name;
+    this.group = providerRole.group;
     this.key = providerRole.id;
   }
 
@@ -118,6 +120,10 @@ public final class RoleStatus implements Cloneable, 
MetricSet {
     return name;
   }
 
+  public String getGroup() {
+    return group;
+  }
+
   public int getKey() {
     return key;
   }
@@ -412,6 +418,7 @@ public final class RoleStatus implements Cloneable, 
MetricSet {
   public String toString() {
     final StringBuilder sb = new StringBuilder("RoleStatus{");
     sb.append("name='").append(name).append('\'');
+    sb.append(", group=").append(group);
     sb.append(", key=").append(key);
     sb.append(", desired=").append(desired);
     sb.append(", actual=").append(actual);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
index eb97a55..d3864b8 100644
--- 
a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
+++ 
b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
@@ -259,10 +259,10 @@ public class ExecutionCommand {
     return builder.toString();
   }
   
-  public void addContainerDetails(String componentName, Metainfo metaInfo) {
-    Component component = metaInfo.getApplicationComponent(componentName);
+  public void addContainerDetails(String componentGroup, Metainfo metaInfo) {
+    Component component = metaInfo.getApplicationComponent(componentGroup);
     this.setComponentType(component.getType());
-    log.info("Adding container details for {}", componentName, " from ",
+    log.info("Adding container details for {}", componentGroup, " from ",
         metaInfo.toString());
     for (DockerContainer metaContainer : component.getDockerContainers()) {
       DockerContainer container = new DockerContainer();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.groovy
----------------------------------------------------------------------
diff --git 
a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.groovy
 
b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.groovy
new file mode 100644
index 0000000..5256163
--- /dev/null
+++ 
b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateUniqueNames.groovy
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.model.appstate
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.fs.Path
+import org.apache.slider.api.ResourceKeys
+import org.apache.slider.core.conf.AggregateConf
+import org.apache.slider.core.conf.ConfTreeOperations
+import org.apache.slider.core.exceptions.BadConfigException
+import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest
+import org.apache.slider.server.appmaster.model.mock.MockAppState
+import org.apache.slider.server.appmaster.model.mock.MockRoles
+import org.apache.slider.server.appmaster.model.mock.MockYarnEngine
+import org.apache.slider.server.appmaster.state.AppStateBindingInfo
+import 
org.apache.slider.server.appmaster.state.MostRecentContainerReleaseSelector
+import org.apache.slider.server.avro.RoleHistoryWriter
+import org.junit.Test
+
+/**
+ * Test that if you have more than one role, the right roles are chosen for 
release.
+ */
+@CompileStatic
+@Slf4j
+class TestMockAppStateUniqueNames extends BaseMockAppStateTest
+  implements MockRoles {
+
+  @Override
+  String getTestName() {
+    return "TestMockAppStateUniqueNames"
+  }
+
+  /**
+   * Small cluster with multiple containers per node,
+   * to guarantee many container allocations on each node
+   * @return
+   */
+  @Override
+  MockYarnEngine createYarnEngine() {
+    return new MockYarnEngine(4, 4)
+  }
+
+  @Override
+  AppStateBindingInfo buildBindingInfo() {
+    def bindingInfo = super.buildBindingInfo()
+    bindingInfo.releaseSelector = new MostRecentContainerReleaseSelector()
+    bindingInfo
+  }
+
+  @Override
+  AggregateConf buildInstanceDefinition() {
+    def instance = factory.newInstanceDefinition(0, 0, 0)
+
+    def opts = [
+      (ResourceKeys.COMPONENT_INSTANCES): "1",
+      (ResourceKeys.COMPONENT_PRIORITY) : "6",
+      (ResourceKeys.UNIQUE_NAMES) : "true",
+    ]
+
+    instance.resourceOperations.components["group1"] = opts
+    instance
+  }
+
+  private ConfTreeOperations init() {
+    createAndStartNodes();
+    def resources = appState.instanceDefinition.resources;
+    return new ConfTreeOperations(resources)
+  }
+
+  @Test
+  public void testDynamicFlexAddRole() throws Throwable {
+    def cd = init()
+    def opts = [
+      (ResourceKeys.COMPONENT_INSTANCES): "2",
+      (ResourceKeys.COMPONENT_PRIORITY): "7",
+      (ResourceKeys.UNIQUE_NAMES) : "true",
+    ]
+
+    cd.components["group2"] = opts
+    appState.updateResourceDefinitions(cd.confTree);
+    createAndStartNodes();
+    dumpClusterDescription("updated CD", appState.getClusterStatus())
+    assert 1 == appState.lookupRoleStatus("group11").desired
+    assert 1 == appState.lookupRoleStatus("group21").desired
+    assert 1 == appState.lookupRoleStatus("group22").desired
+    assert 6 == appState.lookupRoleStatus("group11").priority
+    assert 7 == appState.lookupRoleStatus("group21").priority
+    assert 8 == appState.lookupRoleStatus("group22").priority
+  }
+
+  @Test
+  public void testDynamicFlexDown() throws Throwable {
+    def cd = init()
+    def opts = [
+      (ResourceKeys.COMPONENT_INSTANCES): "0",
+      (ResourceKeys.COMPONENT_PRIORITY) : "6",
+      (ResourceKeys.UNIQUE_NAMES) : "true",
+    ]
+
+    cd.components["group1"] = opts
+    appState.updateResourceDefinitions(cd.confTree);
+    createAndStartNodes();
+    dumpClusterDescription("updated CD", appState.getClusterStatus())
+    appState.lookupRoleStatus(6)
+    assert 0 == appState.lookupRoleStatus("group11").desired
+    assert 6 == appState.lookupRoleStatus("group11").priority
+  }
+
+  @Test
+  public void testDynamicFlexUp() throws Throwable {
+    def cd = init()
+    def opts = [
+      (ResourceKeys.COMPONENT_INSTANCES): "3",
+      (ResourceKeys.COMPONENT_PRIORITY) : "6",
+      (ResourceKeys.UNIQUE_NAMES) : "true",
+    ]
+
+    cd.components["group1"] = opts
+    appState.updateResourceDefinitions(cd.confTree);
+    createAndStartNodes();
+    dumpClusterDescription("updated CD", appState.getClusterStatus())
+    appState.lookupRoleStatus(6)
+    appState.lookupRoleStatus(7)
+    appState.lookupRoleStatus(8)
+    assert 1 == appState.lookupRoleStatus("group11").desired
+    assert 1 == appState.lookupRoleStatus("group12").desired
+    assert 1 == appState.lookupRoleStatus("group13").desired
+    assert 6 == appState.lookupRoleStatus("group11").priority
+    assert 7 == appState.lookupRoleStatus("group12").priority
+    assert 8 == appState.lookupRoleStatus("group13").priority
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
----------------------------------------------------------------------
diff --git 
a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
 
b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
index c8914b0..659af0e 100644
--- 
a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
+++ 
b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockProviderService.groovy
@@ -196,7 +196,7 @@ class MockProviderService implements ProviderService {
       ContainerLauncher containerLauncher,
       AggregateConf instanceDefinition,
       Container container,
-      String role,
+      ProviderRole role,
       SliderFileSystem sliderFileSystem,
       Path generatedConfPath,
       MapOperations resourceComponent,

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/9130f0ea/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
----------------------------------------------------------------------
diff --git 
a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
 
b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
index cf5c57b..9fbb3d0 100644
--- 
a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
+++ 
b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
@@ -282,7 +282,7 @@ public class TestAgentProviderService {
     
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.AGENT_VERSION,
 ".");
 
     Container container = createNiceMock(Container.class);
-    String role = "HBASE_MASTER";
+    ProviderRole role = new ProviderRole("HBASE_MASTER", 1);
     SliderFileSystem sliderFileSystem = createNiceMock(SliderFileSystem.class);
     ContainerLauncher launcher = createNiceMock(ContainerLauncher.class);
     Path generatedConfPath = new Path(".", "test");
@@ -323,6 +323,7 @@ public class TestAgentProviderService {
       doReturn(true).when(mockAps).isMaster(anyString());
       doNothing().when(mockAps).addInstallCommand(
           eq("HBASE_MASTER"),
+          eq("HBASE_MASTER"),
           eq("mockcontainer_1"),
           any(HeartBeatResponse.class),
           eq("scripts/hbase_master.py"),
@@ -337,6 +338,7 @@ public class TestAgentProviderService {
         anyString(),
         anyString(),
         anyString(),
+        anyString(),
         anyMap()
     );
 
@@ -400,6 +402,7 @@ public class TestAgentProviderService {
         anyString(),
         anyString(),
         anyString(),
+        anyString(),
         anyMap()
     );
 
@@ -474,7 +477,7 @@ public class TestAgentProviderService {
 
     try {
       doReturn(true).when(mockAps).isMaster(anyString());
-      doNothing().when(mockAps).addInstallCommand(eq("HBASE_MASTER"),
+      doNothing().when(mockAps).addInstallCommand(eq("HBASE_MASTER"), 
eq("HBASE_MASTER"),
           eq("mockcontainer_1"), any(HeartBeatResponse.class),
           eq("scripts/hbase_master.py"), eq((ComponentCommand)null),
           eq(600L), anyString());
@@ -483,7 +486,8 @@ public class TestAgentProviderService {
     }
 
     doNothing().when(mockAps).processAllocatedPorts(anyString(), anyString(),
-                                                    anyString(), anyMap());
+                                                    anyString(), anyString(),
+                                                    anyMap());
     expect(access.isApplicationLive()).andReturn(true).anyTimes();
     ClusterDescription desc = new ClusterDescription();
     desc.setOption(OptionKeys.ZOOKEEPER_QUORUM, "host1:2181");
@@ -535,7 +539,7 @@ public class TestAgentProviderService {
     
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.AGENT_VERSION,
 ".");
 
     Container container = createNiceMock(Container.class);
-    String role_hm = "HBASE_MASTER";
+    ProviderRole role_hm = new ProviderRole("HBASE_MASTER", 1);
     SliderFileSystem sliderFileSystem = createNiceMock(SliderFileSystem.class);
     ContainerLauncher launcher = createNiceMock(ContainerLauncher.class);
     Path generatedConfPath = new Path(".", "test");
@@ -565,6 +569,7 @@ public class TestAgentProviderService {
       doNothing().when(mockAps).addInstallCommand(
           anyString(),
           anyString(),
+          anyString(),
           any(HeartBeatResponse.class),
           anyString(),
           eq((ComponentCommand)null),
@@ -635,6 +640,7 @@ public class TestAgentProviderService {
       Assert.assertTrue(hbr.isTerminateAgent());
       Mockito.verify(mockAps, Mockito.times(3)).addInstallCommand(anyString(),
                                                                   anyString(),
+                                                                  anyString(),
                                                                   
any(HeartBeatResponse.class),
                                                                   anyString(),
                                                                   
eq((ComponentCommand)null),
@@ -683,6 +689,7 @@ public class TestAgentProviderService {
         anyString(),
         anyString(),
         anyString(),
+        anyString(),
         anyMap()
     );
 
@@ -751,6 +758,7 @@ public class TestAgentProviderService {
         anyString(),
         anyString(),
         anyString(),
+        anyString(),
         anyMap()
     );
 
@@ -896,6 +904,7 @@ public class TestAgentProviderService {
     mockAps.processAndPublishComponentSpecificExports(ports,
                                                       "mockcontainer_1",
                                                       "host1",
+                                                      "HBASE_REGIONSERVER",
                                                       "HBASE_REGIONSERVER");
     ArgumentCaptor<Collection> entriesCaptor = ArgumentCaptor.
         forClass(Collection.class);
@@ -946,10 +955,12 @@ public class TestAgentProviderService {
     mockAps.processAndPublishComponentSpecificExports(ports,
                                                       "mockcontainer_1",
                                                       "host1",
+                                                      "HBASE_REGIONSERVER",
                                                       "HBASE_REGIONSERVER");
     mockAps.processAndPublishComponentSpecificExports(ports,
                                                       "mockcontainer_2",
                                                       "host1",
+                                                      "HBASE_REGIONSERVER",
                                                       "HBASE_REGIONSERVER");
     pubExports = pubExpSet.get("QuickLinks".toLowerCase());
     Assert.assertEquals(1, pubExports.entries.size());
@@ -1209,8 +1220,8 @@ public class TestAgentProviderService {
     
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.AGENT_VERSION,
 ".");
 
     Container container = createNiceMock(Container.class);
-    String role_hm = "HBASE_MASTER";
-    String role_hrs = "HBASE_REGIONSERVER";
+    ProviderRole role_hm = new ProviderRole("HBASE_MASTER", 1);
+    ProviderRole role_hrs = new ProviderRole("HBASE_REGIONSERVER", 2);
     SliderFileSystem sliderFileSystem = createNiceMock(SliderFileSystem.class);
     ContainerLauncher launcher = createNiceMock(ContainerLauncher.class);
     ContainerLauncher launcher2 = createNiceMock(ContainerLauncher.class);
@@ -1242,6 +1253,7 @@ public class TestAgentProviderService {
       doNothing().when(mockAps).addInstallCommand(
           anyString(),
           anyString(),
+          anyString(),
           any(HeartBeatResponse.class),
           anyString(),
           eq((ComponentCommand)null),
@@ -1250,6 +1262,7 @@ public class TestAgentProviderService {
       doNothing().when(mockAps).addStartCommand(
           anyString(),
           anyString(),
+          anyString(),
           any(HeartBeatResponse.class),
           anyString(),
           eq((ComponentCommand)null),
@@ -1259,6 +1272,7 @@ public class TestAgentProviderService {
       doNothing().when(mockAps).addGetConfigCommand(
           anyString(),
           anyString(),
+          anyString(),
           any(HeartBeatResponse.class));
       doNothing().when(mockAps).publishFolderPaths(
           anyMap(),
@@ -1335,6 +1349,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(2, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(1)).addInstallCommand(anyString(),
                                                                   anyString(),
+                                                                  anyString(),
                                                                   
any(HeartBeatResponse.class),
                                                                   anyString(),
                                                                   
eq((ComponentCommand)null),
@@ -1348,6 +1363,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(2, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(2)).addInstallCommand(anyString(),
                                                                   anyString(),
+                                                                  anyString(),
                                                                   
any(HeartBeatResponse.class),
                                                                   anyString(),
                                                                   
eq((ComponentCommand)null),
@@ -1369,6 +1385,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(3, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(0)).addStartCommand(anyString(),
                                                                 anyString(),
+                                                                anyString(),
                                                                 
any(HeartBeatResponse.class),
                                                                 anyString(),
                                                                 
eq((ComponentCommand)null),
@@ -1383,6 +1400,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(4, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(0)).addStartCommand(anyString(),
                                                                 anyString(),
+                                                                anyString(),
                                                                 
any(HeartBeatResponse.class),
                                                                 anyString(),
                                                                 
eq((ComponentCommand)null),
@@ -1407,6 +1425,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(3, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(1)).addStartCommand(anyString(),
                                                                 anyString(),
+                                                                anyString(),
                                                                 
any(HeartBeatResponse.class),
                                                                 anyString(),
                                                                 
eq((ComponentCommand)null),
@@ -1426,6 +1445,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(5, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(1)).addStartCommand(anyString(),
                                                                 anyString(),
+                                                                anyString(),
                                                                 
any(HeartBeatResponse.class),
                                                                 anyString(),
                                                                 
eq((ComponentCommand)null),
@@ -1444,6 +1464,7 @@ public class TestAgentProviderService {
       mockAps.handleHeartBeat(hb);
       Mockito.verify(mockAps, 
Mockito.times(1)).addGetConfigCommand(anyString(),
                                                                     
anyString(),
+                                                                    
anyString(),
                                                                     
any(HeartBeatResponse.class));
 
       // RS starts now
@@ -1454,6 +1475,7 @@ public class TestAgentProviderService {
       Assert.assertEquals(6, hbr.getResponseId());
       Mockito.verify(mockAps, Mockito.times(2)).addStartCommand(anyString(),
                                                                 anyString(),
+                                                                anyString(),
                                                                 
any(HeartBeatResponse.class),
                                                                 anyString(),
                                                                 
eq((ComponentCommand)null),
@@ -1619,7 +1641,7 @@ public class TestAgentProviderService {
 
     replay(access);
 
-    mockAps.addInstallCommand("HBASE_MASTER", "cid1", hbr, "", null, 0, null);
+    mockAps.addInstallCommand("HBASE_MASTER", "HBASE_MASTER", "cid1", hbr, "", 
null, 0, null);
     ExecutionCommand cmd = hbr.getExecutionCommands().get(0);
     String pkgs = cmd.getHostLevelParams().get(AgentKeys.PACKAGE_LIST);
     
Assert.assertEquals("[{\"type\":\"tarball\",\"name\":\"files/hbase-0.96.1-hadoop2-bin.tar.gz\"}]",
 pkgs);
@@ -1701,7 +1723,7 @@ public class TestAgentProviderService {
 
     ComponentCommand startCmd = ComponentCommand.getDefaultComponentCommand();
     ComponentCommand stopCmd = 
ComponentCommand.getDefaultComponentCommand("STOP");
-    mockAps.addStartCommand("HBASE_MASTER", "cid1", hbr, "", startCmd, 
stopCmd, 0, Boolean.FALSE);
+    mockAps.addStartCommand("HBASE_MASTER", "HBASE_MASTER", "cid1", hbr, "", 
startCmd, stopCmd, 0, Boolean.FALSE);
     
Assert.assertTrue(hbr.getExecutionCommands().get(0).getConfigurations().containsKey("hbase-site"));
     
Assert.assertTrue(hbr.getExecutionCommands().get(0).getConfigurations().containsKey("core-site"));
     Map<String, String> hbaseSiteConf = 
hbr.getExecutionCommands().get(0).getConfigurations().get("hbase-site");
@@ -1787,7 +1809,7 @@ public class TestAgentProviderService {
 
     replay(access);
 
-    mockAps.addStopCommand("HBASE_MASTER", "cid1", hbr, "/tmp/stop_cmd.sh", 
10, false);
+    mockAps.addStopCommand("HBASE_MASTER", "HBASE_MASTER", "cid1", hbr, 
"/tmp/stop_cmd.sh", 10, false);
 
     
Assert.assertTrue(hbr.getExecutionCommands().get(0).getConfigurations().containsKey("hbase-site"));
     
Assert.assertTrue(hbr.getExecutionCommands().get(0).getConfigurations().containsKey("core-site"));

Reply via email to