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)
   }
 
 }

Reply via email to