diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java index 8f544648a8e..7a1a848bce5 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java @@ -2336,6 +2336,19 @@ public void testGettingPropertiesWithPrefix() throws Exception { assertTrue(props.isEmpty()); } + public void testQuotesInValue() throws IOException { + out=new BufferedWriter(new FileWriter(CONFIG)); + startConfig(); + appendProperty("prop", "\"value\""); + appendProperty("env", "A=\"t1,t2\",B=C"); + endConfig(); + Path fileResource = new Path(CONFIG); + conf.addResource(fileResource); + + assertEquals("\"value\"", conf.get("prop")); + assertEquals("A=\"t1,t2\",B=C", conf.get("env")); + } + public static void main(String[] argv) throws Exception { junit.textui.TestRunner.main(new String[]{ TestConfiguration.class.getName() diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/Apps.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/Apps.java index 1c90d551b7b..6318319318a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/Apps.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/Apps.java @@ -52,7 +52,7 @@ "(?<=^|,)" // preceded by ',' or line begin + '(' + Shell.ENV_NAME_REGEX + ')' // var group + '=' - + "([^,]*)" // val group + + "(\"[^\"]*|[^,]*)" // val group ); public static ApplicationId toAppID(String aid) { @@ -86,7 +86,8 @@ public static void setEnvFromInputString(Map env, Matcher varValMatcher = VARVAL_SPLITTER.matcher(envString); while (varValMatcher.find()) { String envVar = varValMatcher.group(1); - Matcher m = VAR_SUBBER.matcher(varValMatcher.group(2)); + String envVal = varValMatcher.group(2).replaceAll("^\"|\"$", ""); + Matcher m = VAR_SUBBER.matcher(envVal); StringBuffer sb = new StringBuffer(); while (m.find()) { String var = m.group(1); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestApps.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestApps.java index 66d2d231344..93100315c41 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestApps.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestApps.java @@ -58,4 +58,29 @@ public void testSetEnvFromInputString() { assertEquals("=", environment.get("e1")); assertEquals("a1=a2", environment.get("e2")); } + + @Test + public void testSetEnvFromInputStringWithQuotes() { + Map environment = new HashMap(); + String envString = "YARN_CONTAINER_RUNTIME_TYPE=docker" + + ",YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=hadoop-docker" + + ",YARN_CONTAINER_RUNTIME_DOCKER_LOCAL_RESOURCE_MOUNTS=\"/dir1:/targetdir1,/dir2:/targetdir2\"" + + ",YARN_CONTAINER_RUNTIME_DOCKER_ENVIRONMENT_VARIABLES=\"HADOOP_CONF_DIR=$HADOOP_CONF_DIR,HADOOP_HDFS_HOME=/hadoop\"" + ; + + Apps.setEnvFromInputString(environment, envString, File.pathSeparator); + assertEquals("docker", environment.get("YARN_CONTAINER_RUNTIME_TYPE")); + assertEquals("hadoop-docker", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_IMAGE")); + assertEquals("/dir1:/targetdir1,/dir2:/targetdir2", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_LOCAL_RESOURCE_MOUNTS")); + assertEquals("HADOOP_CONF_DIR=,HADOOP_HDFS_HOME=/hadoop", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_ENVIRONMENT_VARIABLES")); + + environment.clear(); + + environment.put("HADOOP_CONF_DIR", "etc/hadoop"); + Apps.setEnvFromInputString(environment, envString, File.pathSeparator); + assertEquals("docker", environment.get("YARN_CONTAINER_RUNTIME_TYPE")); + assertEquals("hadoop-docker", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_IMAGE")); + assertEquals("/dir1:/targetdir1,/dir2:/targetdir2", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_LOCAL_RESOURCE_MOUNTS")); + assertEquals("HADOOP_CONF_DIR=etc/hadoop,HADOOP_HDFS_HOME=/hadoop", environment.get("YARN_CONTAINER_RUNTIME_DOCKER_ENVIRONMENT_VARIABLES")); + } }