SLIDER-5 CLI can now get and save artifacts
git-svn-id: https://svn.apache.org/repos/asf/incubator/slider/trunk@1592599 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 866ee88..83156df 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -84,8 +84,10 @@
import org.apache.slider.core.persist.ConfPersister;
import org.apache.slider.core.persist.LockAcquireFailedException;
import org.apache.slider.core.registry.YARNRegistryClient;
+import org.apache.slider.core.registry.docstore.ConfigFormat;
import org.apache.slider.core.registry.docstore.PublishedConfigSet;
import org.apache.slider.core.registry.docstore.PublishedConfiguration;
+import org.apache.slider.core.registry.docstore.PublishedConfigurationOutputter;
import org.apache.slider.core.registry.info.ServiceInstanceData;
import org.apache.slider.core.registry.retrieve.RegistryRetriever;
import org.apache.slider.core.registry.zk.ZKPathBuilder;
@@ -1962,6 +1964,7 @@
// get a configuration
PublishedConfiguration publishedConfiguration =
actionRegistryGetConfig(registryArgs);
+ outputConfig(publishedConfiguration, registryArgs);
} else {
exitCode = EXIT_FALSE;
@@ -2040,19 +2043,32 @@
}
private void outputConfig(PublishedConfiguration published,
- ActionRegistryArgs registryArgs) {
+ ActionRegistryArgs registryArgs) throws
+ BadCommandArgumentsException,
+ IOException {
// decide whether or not to print
- boolean print = registryArgs.dest == null;
String entry = registryArgs.getConf;
String format = registryArgs.format;
- File destFile;
+ ConfigFormat configFormat = ConfigFormat.resolve(format);
+ if (configFormat == null) {
+ throw new BadCommandArgumentsException(
+ "Unknown/Unsupported format %s ", format);
+ }
+ PublishedConfigurationOutputter outputter =
+ PublishedConfigurationOutputter.createOutputter(configFormat,
+ published);
+ boolean print = registryArgs.dest == null;
if (!print) {
+ File destFile;
destFile = registryArgs.dest;
if (destFile.isDirectory()) {
// creating it under a directory
destFile = new File(destFile, entry + "." + format);
}
log.info("Destination path: {}", destFile);
+ outputter.save(destFile);
+ } else {
+ print(outputter.asString());
}
}
diff --git a/slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormats.java b/slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormat.java
similarity index 71%
rename from slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormats.java
rename to slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormat.java
index b18cebb..3c80dd5 100644
--- a/slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormats.java
+++ b/slider-core/src/main/java/org/apache/slider/core/registry/docstore/ConfigFormat.java
@@ -18,14 +18,14 @@
package org.apache.slider.core.registry.docstore;
-public enum ConfigFormats {
+public enum ConfigFormat {
JSON("json"),
PROPERTIES("properties"),
XML("xml"),
- YAML("yaml");
-
- ConfigFormats(String suffix) {
+// YAML("yaml");
+ ;
+ ConfigFormat(String suffix) {
this.suffix = suffix;
}
@@ -34,5 +34,24 @@
public String getSuffix() {
return suffix;
}
-
+
+
+ @Override
+ public String toString() {
+ return suffix;
+ }
+
+ /**
+ * Get a matching format or null
+ * @param type
+ * @return
+ */
+ public static ConfigFormat resolve(String type) {
+ for (ConfigFormat format: values()) {
+ if (format.getSuffix().equals(type)) {
+ return format;
+ }
+ }
+ return null;
+ }
}
diff --git a/slider-core/src/main/java/org/apache/slider/core/registry/docstore/PublishedConfigurationOutputter.java b/slider-core/src/main/java/org/apache/slider/core/registry/docstore/PublishedConfigurationOutputter.java
index ba38967..f4ffe34 100644
--- a/slider-core/src/main/java/org/apache/slider/core/registry/docstore/PublishedConfigurationOutputter.java
+++ b/slider-core/src/main/java/org/apache/slider/core/registry/docstore/PublishedConfigurationOutputter.java
@@ -18,17 +18,122 @@
package org.apache.slider.core.registry.docstore;
+import com.google.common.base.Charsets;
+import com.google.common.base.Preconditions;
+import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.slider.common.tools.ConfigHelper;
+
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.Properties;
public abstract class PublishedConfigurationOutputter {
+ protected final PublishedConfiguration owner;
+
+ protected PublishedConfigurationOutputter(PublishedConfiguration owner) {
+ this.owner = owner;
+ }
+
public void save(File dest) throws IOException {
}
- public String asString() {
+ public String asString() throws IOException {
return "";
- }
+ }
+ public static PublishedConfigurationOutputter createOutputter(ConfigFormat format,
+ PublishedConfiguration owner) {
+ Preconditions.checkNotNull(owner);
+ switch (format) {
+ case XML:
+ return new XmlOutputter(owner);
+ case PROPERTIES:
+ return new PropertiesOutputter(owner);
+ case JSON:
+ return new JsonOutputter(owner);
+ default:
+ throw new RuntimeException("Unsupported format :" + format);
+ }
+ }
+
+ public static class XmlOutputter extends PublishedConfigurationOutputter {
+
+
+ private final Configuration configuration;
+
+ public XmlOutputter(PublishedConfiguration owner) {
+ super(owner);
+ configuration = owner.asConfiguration();
+ }
+
+ @Override
+ public void save(File dest) throws IOException {
+ FileOutputStream out = new FileOutputStream(dest);
+ try {
+ configuration.writeXml(out);
+ } finally {
+ out.close();
+ }
+ }
+
+ @Override
+ public String asString() throws IOException {
+ return ConfigHelper.toXml(configuration);
+ }
+
+ public Configuration getConfiguration() {
+ return configuration;
+ }
+ }
+
+ public static class PropertiesOutputter extends PublishedConfigurationOutputter {
+
+ private final Properties properties;
+
+ public PropertiesOutputter(PublishedConfiguration owner) {
+ super(owner);
+ properties = owner.asProperties();
+ }
+
+ @Override
+ public void save(File dest) throws IOException {
+ FileOutputStream out = new FileOutputStream(dest);
+ try {
+ properties.store(out, "");
+ } finally {
+ out.close();
+ }
+
+ }
+
+ @Override
+ public String asString() throws IOException {
+ return properties.toString();
+ }
+ }
+
+
+ public static class JsonOutputter extends PublishedConfigurationOutputter {
+
+ public JsonOutputter(PublishedConfiguration owner) {
+ super(owner);
+ }
+
+ @Override
+ public void save(File dest) throws IOException {
+ FileUtils.writeStringToFile(dest, asString(), Charsets.UTF_8);
+ }
+
+ @Override
+ public String asString() throws IOException {
+ return owner.asJson();
+ }
+ }
+
+
+
}
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
index 6de0a9f..37be458 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneRegistryAM.groovy
@@ -30,6 +30,7 @@
import org.apache.slider.common.params.ActionRegistryArgs
import org.apache.slider.core.main.ServiceLauncher
import org.apache.slider.core.persist.JsonSerDeser
+import org.apache.slider.core.registry.docstore.ConfigFormat
import org.apache.slider.core.registry.docstore.PublishedConfigSet
import org.apache.slider.core.registry.docstore.PublishedConfiguration
import org.apache.slider.core.registry.info.CustomRegistryConstants
@@ -232,6 +233,8 @@
assert 0 == client.actionRegistry(registryArgs)
+
+
// listconf --internal
registryArgs.list = false;
registryArgs.listConf = true
@@ -244,6 +247,27 @@
//expected
}
+ registryArgs.list = false;
+ registryArgs.listConf = false
+ registryArgs.internal = false
+ registryArgs.format = "properties"
+ registryArgs.getConf = YARN_SITE
+
+ describe registryArgs.toString()
+ assert 0 == client.actionRegistry(registryArgs)
+
+ File outputDir = new File("target/test_standalone_registry_am/output")
+ outputDir.mkdirs()
+
+ registryArgs.dest = outputDir
+ describe registryArgs.toString()
+ assert 0 == client.actionRegistry(registryArgs)
+ assert new File(outputDir,YARN_SITE + ".properties").exists()
+
+ registryArgs.format = "xml"
+ assert 0 == client.actionRegistry(registryArgs)
+ assert new File(outputDir,YARN_SITE + ".xml").exists()
+
describe "freeze cluster"