SLIDER-1133 Provide support to accept metainfo as a JSON blob from the command line
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/eccefc1e Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/eccefc1e Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/eccefc1e Branch: refs/heads/feature/SLIDER-1107_AM_config_generation Commit: eccefc1e407ffd90ae81612c713787bf712eab9e Parents: 44f4a54 Author: Gour Saha <gourks...@apache.org> Authored: Fri May 27 11:37:14 2016 -0700 Committer: Gour Saha <gourks...@apache.org> Committed: Fri May 27 11:37:14 2016 -0700 ---------------------------------------------------------------------- .../AbstractClusterBuildingActionArgs.java | 6 ++- .../apache/slider/common/params/Arguments.java | 1 + .../core/persist/AppDefinitionPersister.java | 47 ++++++++++++++++---- .../agent/TestAppDefinitionPersister.java | 43 ++++++++++++++++-- 4 files changed, 85 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/eccefc1e/slider-core/src/main/java/org/apache/slider/common/params/AbstractClusterBuildingActionArgs.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/AbstractClusterBuildingActionArgs.java b/slider-core/src/main/java/org/apache/slider/common/params/AbstractClusterBuildingActionArgs.java index 1c694bd..3833394 100644 --- a/slider-core/src/main/java/org/apache/slider/common/params/AbstractClusterBuildingActionArgs.java +++ b/slider-core/src/main/java/org/apache/slider/common/params/AbstractClusterBuildingActionArgs.java @@ -87,9 +87,13 @@ public abstract class AbstractClusterBuildingActionArgs extends public File template; @Parameter(names = {ARG_METAINFO}, - description = "Application meta info") + description = "Application meta info file") public File appMetaInfo; + @Parameter(names = {ARG_METAINFO_JSON}, + description = "Application meta info JSON blob") + public String appMetaInfoJson; + @Parameter(names = {ARG_APPDEF}, description = "Application def (folder or a zip package)") public File appDef; http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/eccefc1e/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java b/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java index bac20d7..0a8388d 100644 --- a/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java +++ b/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java @@ -87,6 +87,7 @@ public interface Arguments { String ARG_MANAGER_SHORT = "--m"; String ARG_MESSAGE = "--message"; String ARG_METAINFO = "--metainfo"; + String ARG_METAINFO_JSON = "--metainfojson"; String ARG_NAME = "--name"; String ARG_OPTION = "--option"; String ARG_OPTION_SHORT = "-O"; http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/eccefc1e/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java b/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java index 2448c72..8efaa5b 100644 --- a/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java +++ b/slider-core/src/main/java/org/apache/slider/core/persist/AppDefinitionPersister.java @@ -24,6 +24,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.hadoop.fs.Path; import org.apache.slider.common.SliderKeys; import org.apache.slider.common.params.AbstractClusterBuildingActionArgs; +import org.apache.slider.common.params.Arguments; import org.apache.slider.common.tools.SliderFileSystem; import org.apache.slider.common.tools.SliderUtils; import org.apache.slider.core.conf.ConfTreeOperations; @@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -109,28 +111,57 @@ public class AppDefinitionPersister { ConfTreeOperations appConf) throws BadConfigException, IOException, BadCommandArgumentsException { // if metainfo is provided add to the app instance - if (buildInfo.appMetaInfo != null) { - - if (!buildInfo.appMetaInfo.canRead() || !buildInfo.appMetaInfo.isFile()) { - throw new BadConfigException("--metainfo file cannot be read."); + if (buildInfo.appMetaInfo != null || buildInfo.appMetaInfoJson != null) { + if (buildInfo.appMetaInfo != null && buildInfo.appMetaInfoJson != null) { + throw new BadConfigException("Both %s and %s cannot be specified", + Arguments.ARG_METAINFO, Arguments.ARG_METAINFO_JSON); } + // Now we know that only one of either file or JSON is used + boolean isFileUsed = buildInfo.appMetaInfo != null ? true : false; + String argUsed = isFileUsed ? Arguments.ARG_METAINFO + : Arguments.ARG_METAINFO_JSON; + if (buildInfo.appDef != null) { - throw new BadConfigException("both --metainfo and --appdef may not be specified."); + throw new BadConfigException("Both %s and %s cannot be specified", + argUsed, Arguments.ARG_APPDEF); } if (SliderUtils.isSet(appConf.getGlobalOptions().get(AgentKeys.APP_DEF))) { - throw new BadConfigException("application.def must not be set if --metainfo is provided."); + throw new BadConfigException( + "%s cannot not be set if %s is specified in the cmd line ", + AgentKeys.APP_DEF, argUsed); + } + + if (isFileUsed) { + if (!buildInfo.appMetaInfo.canRead() || !buildInfo.appMetaInfo.isFile()) { + throw new BadConfigException( + "Path specified with %s either cannot be read or is not a file", + Arguments.ARG_METAINFO); + } + } else { + if (StringUtils.isEmpty(buildInfo.appMetaInfoJson.trim())) { + throw new BadConfigException("Empty string specified with %s", + Arguments.ARG_METAINFO_JSON); + } } File tempDir = Files.createTempDir(); File pkgSrcDir = new File(tempDir, "default"); pkgSrcDir.mkdirs(); - Files.copy(buildInfo.appMetaInfo, new File(pkgSrcDir, "metainfo.json")); + File destMetaInfo = new File(pkgSrcDir, "metainfo.json"); + if (isFileUsed) { + Files.copy(buildInfo.appMetaInfo, destMetaInfo); + } else { + Files.write( + buildInfo.appMetaInfoJson.getBytes(Charset.forName("UTF-8")), + destMetaInfo); + } Path appDirPath = sliderFileSystem.buildAppDefDirPath(clustername); log.info("Using default app def path {}", appDirPath.toString()); - appDefinitions.add(new AppDefinition(appDirPath, pkgSrcDir, SliderKeys.DEFAULT_APP_PKG)); + appDefinitions.add(new AppDefinition(appDirPath, pkgSrcDir, + SliderKeys.DEFAULT_APP_PKG)); Path appDefPath = new Path(appDirPath, SliderKeys.DEFAULT_APP_PKG); appConf.getGlobalOptions().set(AgentKeys.APP_DEF, appDefPath); log.info("Setting app package to {}.", appDefPath); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/eccefc1e/slider-core/src/test/java/org/apache/slider/providers/agent/TestAppDefinitionPersister.java ---------------------------------------------------------------------- diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAppDefinitionPersister.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAppDefinitionPersister.java index eaf496c..dedf4f6 100644 --- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAppDefinitionPersister.java +++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAppDefinitionPersister.java @@ -85,7 +85,9 @@ public class TestAppDefinitionPersister { adp.processSuppliedDefinitions(clustername, buildInfo, appConf); } catch (BadConfigException bce) { log.info(bce.getMessage()); - Assert.assertTrue(bce.getMessage().contains("--metainfo file cannot be read")); + Assert.assertTrue(bce.getMessage().contains( + "Path specified with " + + "--metainfo either cannot be read or is not a file")); } try (PrintWriter writer = new PrintWriter(metainfo.getAbsolutePath(), "UTF-8")) { @@ -98,18 +100,53 @@ public class TestAppDefinitionPersister { adp.processSuppliedDefinitions(clustername, buildInfo, appConf); } catch (BadConfigException bce) { log.info(bce.getMessage()); - Assert.assertTrue(bce.getMessage().contains("both --metainfo and --appdef may not be specified")); + Assert.assertTrue(bce.getMessage().contains( + "Both --metainfo and --appdef cannot be specified")); + } + + // both --metainfojson and --appdef cannot be specified + buildInfo.appMetaInfo = null; + buildInfo.appMetaInfoJson = "{}"; + try { + adp.processSuppliedDefinitions(clustername, buildInfo, appConf); + } catch (BadConfigException bce) { + log.info(bce.getMessage()); + Assert.assertTrue(bce.getMessage().contains( + "Both --metainfojson and --appdef cannot be specified")); } buildInfo.appDef = null; + buildInfo.appMetaInfoJson = ""; + try { + adp.processSuppliedDefinitions(clustername, buildInfo, appConf); + } catch (BadConfigException bce) { + log.info(bce.getMessage()); + Assert.assertTrue(bce.getMessage().contains( + "Empty string specified with --metainfojson")); + } + buildInfo.appMetaInfo = metainfo; + + // both --metainfo and --metainfojson cannot be specified + buildInfo.appMetaInfoJson = "{}"; + try { + adp.processSuppliedDefinitions(clustername, buildInfo, appConf); + } catch (BadConfigException bce) { + log.info(bce.getMessage()); + Assert.assertTrue(bce.getMessage().contains( + "Both --metainfo and --metainfojson cannot be specified")); + } + buildInfo.appMetaInfoJson = null; + appConf.getGlobalOptions().set(AgentKeys.APP_DEF, metainfo.getAbsolutePath()); try { adp.processSuppliedDefinitions(clustername, buildInfo, appConf); } catch (BadConfigException bce) { log.info(bce.getMessage()); - Assert.assertTrue(bce.getMessage().contains("application.def must not be set if --metainfo is provided")); + Assert.assertTrue(bce.getMessage().contains( + "application.def cannot " + + "not be set if --metainfo is specified in the cmd line")); } appConf.getGlobalOptions().remove(AgentKeys.APP_DEF);