This is an automated email from the ASF dual-hosted git repository.

snemeth pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f76a2a7  YARN-10654. Dots '.' in CSMappingRule path variables should 
be replaced. Contributed by Peter Bacsko
f76a2a7 is described below

commit f76a2a7606760eaf9967dae7ab769d22b11b4447
Author: Szilard Nemeth <snem...@apache.org>
AuthorDate: Fri Apr 23 16:07:58 2021 +0200

    YARN-10654. Dots '.' in CSMappingRule path variables should be replaced. 
Contributed by Peter Bacsko
---
 .../placement/CSMappingPlacementRule.java          | 22 +++++--
 .../csmappingrule/TestCSMappingPlacementRule.java  | 67 +++++++++++++++++++---
 2 files changed, 77 insertions(+), 12 deletions(-)

diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/CSMappingPlacementRule.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/CSMappingPlacementRule.java
index 894bc82..9648769 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/CSMappingPlacementRule.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/placement/CSMappingPlacementRule.java
@@ -42,8 +42,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import static 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.DOT;
-
 /**
  * This class is responsible for making application submissions to queue
  * assignments, based on the configured ruleset. This class supports all
@@ -55,6 +53,8 @@ import static 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.C
 public class CSMappingPlacementRule extends PlacementRule {
   private static final Logger LOG = LoggerFactory
       .getLogger(CSMappingPlacementRule.class);
+  private static final String DOT = ".";
+  private static final String DOT_REPLACEMENT = "_dot_";
 
   private CapacitySchedulerQueueManager queueManager;
   private List<MappingRule> mappingRules;
@@ -194,12 +194,13 @@ public class CSMappingPlacementRule extends PlacementRule 
{
       return;
     }
     Iterator<String> it = groupsSet.iterator();
-    String primaryGroup = it.next();
+    String primaryGroup = cleanName(it.next());
 
     ArrayList<String> secondaryGroupList = new ArrayList<>();
 
     while (it.hasNext()) {
-      secondaryGroupList.add(it.next());
+      String groupName = cleanName(it.next());
+      secondaryGroupList.add(groupName);
     }
 
     if (secondaryGroupList.size() == 0) {
@@ -226,7 +227,7 @@ public class CSMappingPlacementRule extends PlacementRule {
       ApplicationSubmissionContext asc, String user) {
     VariableContext vctx = new VariableContext();
 
-    vctx.put("%user", user);
+    vctx.put("%user", cleanName(user));
     //If the specified matches the default it means NO queue have been 
specified
     //as per ClientRMService#submitApplication which sets the queue to default
     //when no queue is provided.
@@ -522,4 +523,15 @@ public class CSMappingPlacementRule extends PlacementRule {
           " mapping rule. Please see the logs for details");
     }
   }
+
+  private String cleanName(String name) {
+    if (name.contains(DOT)) {
+      String converted = name.replaceAll("\\.", DOT_REPLACEMENT);
+      LOG.warn("Name {} is converted to {} when it is used as a queue name.",
+          name, converted);
+      return converted;
+    } else {
+      return name;
+    }
+  }
 }
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/csmappingrule/TestCSMappingPlacementRule.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/csmappingrule/TestCSMappingPlacementRule.java
index f6bb2a1..0cf1059 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/csmappingrule/TestCSMappingPlacementRule.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/placement/csmappingrule/TestCSMappingPlacementRule.java
@@ -63,13 +63,15 @@ public class TestCSMappingPlacementRule {
   @Rule
   public TemporaryFolder folder = new TemporaryFolder();
 
-  private Map<String, Set<String>> userGroups = ImmutableMap.of(
-      "alice", ImmutableSet.of("p_alice", "unique", "user"),
-      "bob", ImmutableSet.of("p_bob", "user", "developer"),
-      "charlie", ImmutableSet.of("p_charlie", "user", "tester"),
-      "dave", ImmutableSet.of("user"),
-      "emily", ImmutableSet.of("user", "tester", "developer")
-  );
+  private Map<String, Set<String>> userGroups =
+      ImmutableMap.<String, Set<String>>builder()
+      .put("alice", ImmutableSet.of("p_alice", "unique", "user"))
+      .put("bob", ImmutableSet.of("p_bob", "user", "developer"))
+      .put("charlie", ImmutableSet.of("p_charlie", "user", "tester"))
+      .put("dave", ImmutableSet.of("user"))
+      .put("emily", ImmutableSet.of("user", "tester", "developer"))
+      .put("test.user", ImmutableSet.of("main.grp", "sec.test.grp"))
+      .build();
 
   private void createQueueHierarchy(CapacitySchedulerQueueManager 
queueManager) {
     MockQueueHierarchyBuilder.create()
@@ -79,6 +81,9 @@ public class TestCSMappingPlacementRule {
         .withManagedParentQueue("root.man")
         .withQueue("root.user.alice")
         .withQueue("root.user.bob")
+        .withQueue("root.user.test_dot_user")
+        .withQueue("root.groups.main_dot_grp")
+        .withQueue("root.groups.sec_dot_test_dot_grp")
         .withQueue("root.secondaryTests.unique")
         .withQueue("root.secondaryTests.user")
         .withQueue("root.ambiguous.user.charlie")
@@ -718,4 +723,52 @@ public class TestCSMappingPlacementRule {
 
     assertConfigTestResult(rules);
   }
+
+  @Test
+  public void testUserNameCleanup() throws IOException {
+    ArrayList<MappingRule> rules = new ArrayList<>();
+    rules.add(
+        new MappingRule(
+            MappingRuleMatchers.createAllMatcher(),
+            (new MappingRuleActions.PlaceToQueueAction("%user", true))
+                .setFallbackReject()));
+
+    CSMappingPlacementRule engine = setupEngine(true, rules);
+    ApplicationSubmissionContext app = createApp("app");
+    assertPlace(
+        "test.user should be placed to root.users.test_dot_user",
+        engine, app, "test.user", "root.user.test_dot_user");
+  }
+
+  @Test
+  public void testPrimaryGroupNameCleanup() throws IOException {
+    ArrayList<MappingRule> rules = new ArrayList<>();
+    rules.add(
+        new MappingRule(
+            MappingRuleMatchers.createAllMatcher(),
+            (new MappingRuleActions.PlaceToQueueAction("%primary_group", true))
+                .setFallbackReject()));
+
+    CSMappingPlacementRule engine = setupEngine(true, rules);
+    ApplicationSubmissionContext app = createApp("app");
+    assertPlace(
+        "Application should have been placed to root.groups.main_dot_grp",
+        engine, app, "test.user", "root.groups.main_dot_grp");
+  }
+
+  @Test
+  public void testSecondaryGroupNameCleanup() throws IOException {
+    ArrayList<MappingRule> rules = new ArrayList<>();
+    rules.add(
+        new MappingRule(
+            MappingRuleMatchers.createAllMatcher(),
+            (new MappingRuleActions.PlaceToQueueAction("%secondary_group", 
true))
+                .setFallbackReject()));
+
+    CSMappingPlacementRule engine = setupEngine(true, rules);
+    ApplicationSubmissionContext app = createApp("app");
+    assertPlace(
+        "Application should have been placed to 
root.groups.sec_dot_test_dot_grp",
+        engine, app, "test.user", "root.groups.sec_dot_test_dot_grp");
+  }
 }
\ No newline at end of file

---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to