SLIDER-1141 add status for unique components
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/454f2cf2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/454f2cf2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/454f2cf2 Branch: refs/heads/feature/SLIDER-1107_AM_config_generation Commit: 454f2cf2e391bc261f7905181a310994976973cf Parents: 24a5062 Author: Billie Rinaldi <billie.rina...@gmail.com> Authored: Wed Jun 15 07:18:42 2016 -0700 Committer: Billie Rinaldi <billie.rina...@gmail.com> Committed: Wed Jun 15 08:08:37 2016 -0700 ---------------------------------------------------------------------- .../java/org/apache/slider/api/RoleKeys.java | 5 ++++ .../slider/server/appmaster/state/AppState.java | 14 ++++++++-- .../appstate/TestMockAppStateUniqueNames.groovy | 29 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/454f2cf2/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java b/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java index 647ac23..812a6b3 100644 --- a/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java +++ b/slider-core/src/main/java/org/apache/slider/api/RoleKeys.java @@ -30,6 +30,11 @@ public interface RoleKeys { String ROLE_NAME = "role.name"; /** + * The group of a role: {@value} + */ + String ROLE_GROUP = "role.group"; + + /** * Status report: number actually granted : {@value} */ String ROLE_ACTUAL_INSTANCES = "role.actual.instances"; http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/454f2cf2/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 b4465a8..3213d93 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 @@ -42,7 +42,6 @@ import org.apache.slider.api.ClusterDescriptionOperations; import org.apache.slider.api.ClusterNode; import org.apache.slider.api.InternalKeys; import org.apache.slider.api.ResourceKeys; -import org.apache.slider.api.RoleKeys; import org.apache.slider.api.StatusKeys; import org.apache.slider.api.types.ApplicationLivenessInformation; import org.apache.slider.api.types.ComponentInformation; @@ -1346,7 +1345,7 @@ public class AppState { * These are returned as integers, but there is special handling of the * string {@link ResourceKeys#YARN_RESOURCE_MAX}, which triggers * the return of the maximum value. - * @param name component to get from + * @param group component to get from * @param option option name * @param defVal default value * @param maxVal value to return if the max val is requested @@ -1800,11 +1799,20 @@ public class AppState { for (RoleStatus role : getRoleStatusMap().values()) { String rolename = role.getName(); + if (hasUniqueNames(instanceDefinition.getResourceOperations(), + role.getGroup())) { + cd.setRoleOpt(rolename, COMPONENT_PRIORITY, role.getPriority()); + cd.setRoleOpt(rolename, ROLE_GROUP, role.getGroup()); + MapOperations groupOptions = instanceDefinition.getResourceOperations() + .getComponent(role.getGroup()); + SliderUtils.mergeMapsIgnoreDuplicateKeys(cd.getRole(rolename), + groupOptions.options); + } List<String> instances = instanceMap.get(rolename); int nodeCount = instances != null ? instances.size(): 0; cd.setRoleOpt(rolename, COMPONENT_INSTANCES, role.getDesired()); - cd.setRoleOpt(rolename, RoleKeys.ROLE_ACTUAL_INSTANCES, nodeCount); + cd.setRoleOpt(rolename, ROLE_ACTUAL_INSTANCES, nodeCount); cd.setRoleOpt(rolename, ROLE_REQUESTED_INSTANCES, role.getRequested()); cd.setRoleOpt(rolename, ROLE_RELEASING_INSTANCES, role.getReleasing()); cd.setRoleOpt(rolename, ROLE_FAILED_INSTANCES, role.getFailed()); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/454f2cf2/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 index d3ba798..84d6bc7 100644 --- 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 @@ -22,6 +22,7 @@ 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.api.RoleKeys import org.apache.slider.core.conf.AggregateConf import org.apache.slider.core.conf.ConfTreeOperations import org.apache.slider.core.exceptions.BadConfigException @@ -86,6 +87,25 @@ class TestMockAppStateUniqueNames extends BaseMockAppStateTest return new ConfTreeOperations(resources) } + private static void checkRole(MockAppState appState, + String roleName, + String roleGroup, + Map<String, String> expectedOpts) { + + for (String key : expectedOpts.keySet()) { + if (ResourceKeys.COMPONENT_PRIORITY.equals(key) || + ResourceKeys.COMPONENT_INSTANCES.equals(key)) { + continue + } + assert expectedOpts.get(key).equals(appState.getClusterStatus() + .getMandatoryRoleOpt(roleName, key)) + } + assert 1 == appState.getClusterStatus().getMandatoryRoleOptInt( + roleName, ResourceKeys.COMPONENT_INSTANCES) + assert roleGroup.equals(appState.getClusterStatus().getMandatoryRoleOpt( + roleName, RoleKeys.ROLE_GROUP)) + } + @Test public void testDynamicFlexAddRole() throws Throwable { def cd = init() @@ -113,6 +133,10 @@ class TestMockAppStateUniqueNames extends BaseMockAppStateTest assert 2 == appState.lookupRoleStatus("group11").resourceRequirements.virtualCores assert 4 == appState.lookupRoleStatus("group21").resourceRequirements.virtualCores assert 4 == appState.lookupRoleStatus("group22").resourceRequirements.virtualCores + + appState.refreshClusterStatus() + checkRole(appState, "group21", "group2", opts) + checkRole(appState, "group22", "group2", opts) } @Test @@ -167,6 +191,11 @@ class TestMockAppStateUniqueNames extends BaseMockAppStateTest assert 8 == appState.lookupRoleStatus("group11").resourceRequirements.virtualCores assert 8 == appState.lookupRoleStatus("group12").resourceRequirements.virtualCores assert 8 == appState.lookupRoleStatus("group13").resourceRequirements.virtualCores + + appState.refreshClusterStatus() + checkRole(appState, "group11", "group1", opts) + checkRole(appState, "group12", "group1", opts) + checkRole(appState, "group13", "group1", opts) } }