Skip to content

Commit d68616b

Browse files
YARN-10130. FS-CS converter: Do not allow output dir to be the same as input dir. Contributed by Adam Antal
1 parent dda00d3 commit d68616b

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/converter/FSConfigToCSConfigArgumentHandler.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.cli.Option;
2626
import org.apache.commons.cli.Options;
2727
import org.apache.commons.cli.ParseException;
28+
import org.apache.hadoop.yarn.conf.YarnConfiguration;
2829
import org.slf4j.Logger;
2930
import org.slf4j.LoggerFactory;
3031

@@ -39,6 +40,13 @@ public class FSConfigToCSConfigArgumentHandler {
3940
private static final Logger LOG =
4041
LoggerFactory.getLogger(FSConfigToCSConfigArgumentHandler.class);
4142

43+
private static final String ALREADY_CONTAINS_EXCEPTION_MSG =
44+
"The %s (provided with %s|%s arguments) contains " +
45+
"the %s provided with the %s|%s options.";
46+
private static final String ALREADY_CONTAINS_FILE_EXCEPTION_MSG =
47+
"The %s %s (provided with %s|%s arguments) already contains a file " +
48+
"or directory named %s which will be the output of the conversion!";
49+
4250
private FSConfigToCSConfigRuleHandler ruleHandler;
4351
private FSConfigToCSConfigConverterParams converterParams;
4452
private ConversionOptions conversionOptions;
@@ -213,6 +221,7 @@ private FSConfigToCSConfigConverterParams validateInputFiles(
213221
checkFile(CliOption.FAIR_SCHEDULER, fairSchedulerXmlFile);
214222
checkFile(CliOption.CONVERSION_RULES, conversionRulesFile);
215223
checkDirectory(CliOption.OUTPUT_DIR, outputDir);
224+
checkOutputDirDoesNotContainXmls(yarnSiteXmlFile, outputDir);
216225

217226
return FSConfigToCSConfigConverterParams.Builder.create()
218227
.withYarnSiteXmlConfig(yarnSiteXmlFile)
@@ -225,6 +234,45 @@ private FSConfigToCSConfigConverterParams validateInputFiles(
225234
.build();
226235
}
227236

237+
private static void checkOutputDirDoesNotContainXmls(String yarnSiteXmlFile,
238+
String outputDir) {
239+
if (yarnSiteXmlFile == null || outputDir == null) {
240+
return;
241+
}
242+
243+
// check whether yarn-site.xml is not in the output folder
244+
File xmlFile = new File(yarnSiteXmlFile);
245+
File xmlParentFolder = xmlFile.getParentFile();
246+
File output = new File(outputDir);
247+
if (output.equals(xmlParentFolder)) {
248+
throw new IllegalArgumentException(
249+
String.format(ALREADY_CONTAINS_EXCEPTION_MSG,
250+
CliOption.OUTPUT_DIR.name, CliOption.OUTPUT_DIR.shortSwitch,
251+
CliOption.OUTPUT_DIR.longSwitch, CliOption.YARN_SITE.name,
252+
CliOption.YARN_SITE.shortSwitch,
253+
CliOption.YARN_SITE.longSwitch));
254+
}
255+
256+
// check whether the output folder does not contain nor yarn-site.xml
257+
// neither capacity-scheduler.xml
258+
checkFileNotInOutputDir(output,
259+
YarnConfiguration.YARN_SITE_CONFIGURATION_FILE);
260+
checkFileNotInOutputDir(output,
261+
YarnConfiguration.CS_CONFIGURATION_FILE);
262+
}
263+
264+
private static void checkFileNotInOutputDir(File output, String fileName) {
265+
File file = new File(output, fileName);
266+
if (file.exists()) {
267+
throw new IllegalArgumentException(
268+
String.format(ALREADY_CONTAINS_FILE_EXCEPTION_MSG,
269+
CliOption.OUTPUT_DIR.name, output,
270+
CliOption.OUTPUT_DIR.shortSwitch,
271+
CliOption.OUTPUT_DIR.longSwitch,
272+
fileName));
273+
}
274+
}
275+
228276
private void printHelp(Options opts) {
229277
HelpFormatter formatter = new HelpFormatter();
230278
formatter.printHelp("General options are: ", opts);

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/converter/FSConfigConverterTestCommons.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
*
3636
*/
3737
public class FSConfigConverterTestCommons {
38-
private final static String TEST_DIR =
38+
public final static String TEST_DIR =
3939
new File(System.getProperty("test.build.data", "/tmp")).getAbsolutePath();
4040
public final static String FS_ALLOC_FILE =
4141
new File(TEST_DIR, "test-fair-scheduler.xml").getAbsolutePath();

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/converter/TestFSConfigToCSConfigArgumentHandler.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
import static org.junit.Assert.assertFalse;
2121
import static org.junit.Assert.assertTrue;
2222

23+
import java.io.File;
2324
import java.io.IOException;
2425
import java.util.Arrays;
2526
import java.util.List;
2627

28+
import org.apache.commons.io.FileUtils;
29+
import org.apache.hadoop.yarn.conf.YarnConfiguration;
2730
import org.junit.After;
2831
import org.junit.Before;
2932
import org.junit.Rule;
@@ -492,4 +495,64 @@ public void testEnabledTerminalRuleCheck() throws Exception {
492495
assertFalse("No terminal rule check was enabled",
493496
conversionOptions.isNoRuleTerminalCheck());
494497
}
498+
499+
@Test
500+
public void testYarnSiteOptionInOutputFolder() throws Exception {
501+
setupFSConfigConversionFiles(true);
502+
503+
FSConfigToCSConfigArgumentHandler argumentHandler =
504+
createArgumentHandler();
505+
506+
String[] args = new String[] {
507+
"-y", FSConfigConverterTestCommons.YARN_SITE_XML,
508+
"-o", FSConfigConverterTestCommons.TEST_DIR};
509+
510+
int retVal = argumentHandler.parseAndConvert(args);
511+
assertEquals("Return value", -1, retVal);
512+
513+
assertTrue(fsTestCommons.getErrContent()
514+
.toString().contains("contains the yarn-site.xml"));
515+
}
516+
517+
private void testFileExistsInOutputFolder(String file) throws Exception {
518+
File testFile = new File(FSConfigConverterTestCommons.OUTPUT_DIR, file);
519+
try {
520+
FileUtils.touch(testFile);
521+
522+
setupFSConfigConversionFiles(true);
523+
524+
FSConfigToCSConfigArgumentHandler argumentHandler =
525+
createArgumentHandler();
526+
527+
String[] args = new String[] {
528+
"-y", FSConfigConverterTestCommons.YARN_SITE_XML,
529+
"-o", FSConfigConverterTestCommons.OUTPUT_DIR};
530+
531+
int retVal = argumentHandler.parseAndConvert(args);
532+
assertEquals("Return value", -1, retVal);
533+
534+
String expectedMessage = String.format(
535+
"already contains a file or directory named %s", file);
536+
537+
assertTrue(fsTestCommons.getErrContent()
538+
.toString().contains(expectedMessage));
539+
} finally {
540+
if (testFile.exists()) {
541+
testFile.delete();
542+
}
543+
}
544+
}
545+
546+
@Test
547+
public void testYarnSiteExistsInOutputFolder() throws Exception {
548+
testFileExistsInOutputFolder(
549+
YarnConfiguration.YARN_SITE_CONFIGURATION_FILE);
550+
}
551+
552+
@Test
553+
public void testCapacitySchedulerXmlExistsInOutputFolder()
554+
throws Exception {
555+
testFileExistsInOutputFolder(
556+
YarnConfiguration.CS_CONFIGURATION_FILE);
557+
}
495558
}

0 commit comments

Comments
 (0)