SLIDER-763 add app name option to client command
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/d9b26524 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/d9b26524 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/d9b26524 Branch: refs/heads/feature/package_simplification_II Commit: d9b265249218122b0df6b8064faef422f8e21158 Parents: dd2a70b Author: Billie Rinaldi <[email protected]> Authored: Fri Mar 13 09:55:14 2015 -0700 Committer: Billie Rinaldi <[email protected]> Committed: Fri Mar 13 10:36:46 2015 -0700 ---------------------------------------------------------------------- slider-assembly/src/main/scripts/slider | 4 ++- .../org/apache/slider/client/SliderClient.java | 3 ++- .../providers/AbstractClientProvider.java | 8 +++--- .../providers/agent/AgentClientProvider.java | 25 +++++++++++++----- .../agent/TestAgentClientProvider2.java | 27 +++++++++++++++++--- 5 files changed, 53 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d9b26524/slider-assembly/src/main/scripts/slider ---------------------------------------------------------------------- diff --git a/slider-assembly/src/main/scripts/slider b/slider-assembly/src/main/scripts/slider index 97dabaf..28dc205 100755 --- a/slider-assembly/src/main/scripts/slider +++ b/slider-assembly/src/main/scripts/slider @@ -41,5 +41,7 @@ cmd = [pyExecPath + " " + currDir + "/slider.py"] cmd.extend(args) finalCmd = " ".join(cmd) -result = subprocess.call(finalCmd, shell=True) +env = os.environ.copy() +env['SLIDER_HOME'] = os.path.dirname(currDir) +result = subprocess.call(finalCmd, env=env, shell=True) sys.exit(result) http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d9b26524/slider-core/src/main/java/org/apache/slider/client/SliderClient.java ---------------------------------------------------------------------- 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 df3ba95..84ed5a4 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 @@ -1067,7 +1067,8 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe "INSTALL", clientInfo.installLocation, pkgFile, - config); + config, + clientInfo.name); return EXIT_SUCCESS; } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d9b26524/slider-core/src/main/java/org/apache/slider/providers/AbstractClientProvider.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/AbstractClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/AbstractClientProvider.java index b5aafd4..1a1baf7 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/AbstractClientProvider.java +++ b/slider-core/src/main/java/org/apache/slider/providers/AbstractClientProvider.java @@ -224,16 +224,18 @@ public abstract class AbstractClientProvider extends Configured { * Process client operations for applications such as install, configure * @param fileSystem * @param operation - * @param config - * @param clientPackage * @param clientInstallPath + * @param clientPackage + * @param config + * @param name * @throws SliderException */ public void processClientOperation(SliderFileSystem fileSystem, String operation, File clientInstallPath, File clientPackage, - JSONObject config) + JSONObject config, + String name) throws SliderException { throw new SliderException("Provider does not support client operations."); } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d9b26524/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java index 94d4c97..9da269d 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java +++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java @@ -26,6 +26,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.registry.client.binding.RegistryUtils; import org.apache.slider.api.InternalKeys; import org.apache.slider.api.ResourceKeys; import org.apache.slider.common.SliderKeys; @@ -291,7 +292,8 @@ public class AgentClientProvider extends AbstractClientProvider String operation, File clientInstallPath, File appPackage, - JSONObject config) throws SliderException { + JSONObject config, + String name) throws SliderException { // create temp folder // create sub-folders app_pkg, agent_pkg, command File tmpDir = Files.createTempDir(); @@ -365,7 +367,7 @@ public class AgentClientProvider extends AbstractClientProvider expandAgentTar(agentPkgDir); - JSONObject commandJson = getCommandJson(defaultConfig, config, metaInfo, clientInstallPath); + JSONObject commandJson = getCommandJson(defaultConfig, config, metaInfo, clientInstallPath, name); FileWriter file = new FileWriter(new File(cmdDir, "command.json")); try { file.write(commandJson.toString()); @@ -502,7 +504,8 @@ public class AgentClientProvider extends AbstractClientProvider protected JSONObject getCommandJson(JSONObject defaultConfig, JSONObject inputConfig, Metainfo metainfo, - File clientInstallPath) throws SliderException { + File clientInstallPath, + String name) throws SliderException { try { JSONObject pkgList = new JSONObject(); pkgList.put(AgentKeys.PACKAGE_LIST, @@ -510,15 +513,20 @@ public class AgentClientProvider extends AbstractClientProvider JSONObject obj = new JSONObject(); obj.put("hostLevelParams", pkgList); + String user = RegistryUtils.currentUser(); JSONObject configuration = new JSONObject(); JSONObject global = new JSONObject(); global.put("app_install_dir", clientInstallPath.getAbsolutePath()); + global.put("app_user", user); + if (name != null) { + global.put("app_name", name); + } if (defaultConfig != null) { - readConfigEntries(defaultConfig, clientInstallPath, global); + readConfigEntries(defaultConfig, clientInstallPath, global, name, user); } if (inputConfig != null) { - readConfigEntries(inputConfig, clientInstallPath, global); + readConfigEntries(inputConfig, clientInstallPath, global, name, user); } configuration.put("global", global); @@ -532,7 +540,8 @@ public class AgentClientProvider extends AbstractClientProvider private void readConfigEntries(JSONObject inpConfig, File clientInstallPath, - JSONObject globalConfig) + JSONObject globalConfig, + String name, String user) throws JSONException { JSONObject globalSection = inpConfig.getJSONObject("global"); Iterator it = globalSection.keys(); @@ -541,6 +550,10 @@ public class AgentClientProvider extends AbstractClientProvider String value = globalSection.getString(key); if (SliderUtils.isSet(value)) { value = value.replace("{app_install_dir}", clientInstallPath.getAbsolutePath()); + value = value.replace("{app_user}", user); + if (name != null) { + value = value.replace("{app_name}", name); + } } if (globalConfig.has(key)) { // last one wins http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/d9b26524/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java ---------------------------------------------------------------------- diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java index 6f637d8..3bc7ce2 100644 --- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java +++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java @@ -20,6 +20,7 @@ import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.registry.client.binding.RegistryUtils; import org.apache.log4j.BasicConfigurator; import org.apache.slider.api.InternalKeys; import org.apache.slider.client.SliderClient; @@ -60,7 +61,7 @@ import static org.easymock.EasyMock.expect; * */ @RunWith(PowerMockRunner.class) -@PrepareForTest({ProviderUtils.class, ProcessBuilder.class, AgentClientProvider.class}) +@PrepareForTest({ProviderUtils.class, ProcessBuilder.class, AgentClientProvider.class, RegistryUtils.class}) public class TestAgentClientProvider2 { protected static final Logger log = LoggerFactory.getLogger(TestAgentClientProvider2.class); @@ -119,6 +120,7 @@ public class TestAgentClientProvider2 { JSONObject global = new JSONObject(); global.put("a", "b"); global.put("d", "{app_install_dir}/d"); + global.put("e", "{app_name}"); inputConfig.put("global", global); Metainfo metainfo = new Metainfo(); @@ -133,29 +135,42 @@ public class TestAgentClientProvider2 { pkg.setType("tarball"); File clientInstallPath = new File("/tmp/file1"); + String appName = "name"; + String user = "username"; + + PowerMock.mockStaticPartial(RegistryUtils.class, "currentUser"); + expect(RegistryUtils.currentUser()).andReturn(user).times(2); + PowerMock.replay(RegistryUtils.class); JSONObject output = provider.getCommandJson(defaultConfig, inputConfig, metainfo, - clientInstallPath); + clientInstallPath, + appName); JSONObject outConfigs = output.getJSONObject("configurations"); Assert.assertNotNull(outConfigs); JSONObject outGlobal = outConfigs.getJSONObject("global"); Assert.assertNotNull(outGlobal); Assert.assertEquals("b", outGlobal.getString("a")); Assert.assertEquals("/tmp/file1/d", outGlobal.getString("d")); + Assert.assertEquals("/tmp/file1", outGlobal.getString("app_install_dir")); + Assert.assertEquals("name", outGlobal.getString("e")); + Assert.assertEquals("name", outGlobal.getString("app_name")); + Assert.assertEquals(user, outGlobal.getString("app_user")); defaultConfig = new JSONObject(); global = new JSONObject(); global.put("a1", "b2"); global.put("a", "b-not"); global.put("d1", "{app_install_dir}/d"); + global.put("e", "{app_name}"); defaultConfig.put("global", global); output = provider.getCommandJson(defaultConfig, inputConfig, metainfo, - clientInstallPath); + clientInstallPath, + null); outConfigs = output.getJSONObject("configurations"); Assert.assertNotNull(outConfigs); outGlobal = outConfigs.getJSONObject("global"); @@ -164,6 +179,12 @@ public class TestAgentClientProvider2 { Assert.assertEquals("/tmp/file1/d", outGlobal.getString("d")); Assert.assertEquals("b2", outGlobal.getString("a1")); Assert.assertEquals("/tmp/file1/d", outGlobal.getString("d1")); + Assert.assertEquals("/tmp/file1", outGlobal.getString("app_install_dir")); + Assert.assertEquals("{app_name}", outGlobal.getString("e")); + Assert.assertFalse(outGlobal.has("app_name")); + Assert.assertEquals(user, outGlobal.getString("app_user")); + + PowerMock.verify(RegistryUtils.class); }
