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"));