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 74590e9..cea0e36 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 @@ -1355,6 +1355,19 @@ public class TestConfiguration extends TestCase { // it's expected behaviour. } + 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 c356574..a6ea5b6 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 @@ -50,7 +50,7 @@ public class Apps { "(?<=^|,)" // preceded by ',' or line begin + "(" + Shell.ENV_NAME_REGEX + ")" // var group + "=" - + "([^,]*)" // val group + + "(\"[^\"]*|[^,]*)" // val group ); public static ApplicationId toAppID(String aid) { @@ -84,7 +84,8 @@ public class Apps { 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 0613c95..282d5bb 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 @@ -63,4 +63,29 @@ public class TestApps { 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")); + } }