Repository: incubator-slider Updated Branches: refs/heads/develop d6844f98a -> 3ad0e566d
SLIDER-636 add CLI keytab command with install, delete, and list options Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/3ad0e566 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/3ad0e566 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/3ad0e566 Branch: refs/heads/develop Commit: 3ad0e566d95cef35de1b6c749489509cf42b1c0c Parents: d6844f9 Author: Jon Maron <jma...@hortonworks.com> Authored: Tue Dec 23 18:13:50 2014 -0500 Committer: Jon Maron <jma...@hortonworks.com> Committed: Tue Dec 23 18:13:50 2014 -0500 ---------------------------------------------------------------------- .../org/apache/slider/client/SliderClient.java | 93 ++++- .../apache/slider/client/SliderClientAPI.java | 14 + .../slider/common/params/ActionKeytabArgs.java | 81 +++++ .../apache/slider/common/params/Arguments.java | 3 + .../apache/slider/common/params/ClientArgs.java | 8 + .../slider/common/params/SliderActions.java | 2 + .../TestDeprecatedInstallKeytabCommand.groovy | 210 +++++++++++ .../slider/client/TestInstallKeytab.groovy | 210 ----------- .../client/TestKeytabCommandOptions.groovy | 360 +++++++++++++++++++ 9 files changed, 757 insertions(+), 224 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/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 225b0e0..98bb36f 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 @@ -24,8 +24,10 @@ import com.google.common.base.Preconditions; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PathNotFoundException; +import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.fs.permission.FsAction; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.hdfs.DFSConfigKeys; @@ -82,6 +84,7 @@ import org.apache.slider.common.params.ActionCreateArgs; import org.apache.slider.common.params.ActionEchoArgs; import org.apache.slider.common.params.ActionFlexArgs; import org.apache.slider.common.params.ActionFreezeArgs; +import org.apache.slider.common.params.ActionKeytabArgs; import org.apache.slider.common.params.ActionKillContainerArgs; import org.apache.slider.common.params.ActionListArgs; import org.apache.slider.common.params.ActionLookupArgs; @@ -377,13 +380,15 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe exitCode = actionInstallPkg(serviceArgs.getActionInstallPackageArgs()); } else if (ACTION_INSTALL_KEYTAB.equals(action)) { exitCode = actionInstallKeytab(serviceArgs.getActionInstallKeytabArgs()); + } else if (ACTION_KEYTAB.equals(action)) { + exitCode = actionKeytab(serviceArgs.getActionKeytabArgs()); } else if (ACTION_BUILD.equals(action)) { exitCode = actionBuild(clusterName, serviceArgs.getActionBuildArgs()); } else if (ACTION_CREATE.equals(action)) { exitCode = actionCreate(clusterName, serviceArgs.getActionCreateArgs()); } else if (ACTION_FREEZE.equals(action)) { exitCode = actionFreeze(clusterName, - serviceArgs.getActionFreezeArgs()); + serviceArgs.getActionFreezeArgs()); } else if (ACTION_THAW.equals(action)) { exitCode = actionThaw(clusterName, serviceArgs.getActionThawArgs()); } else if (ACTION_DESTROY.equals(action)) { @@ -392,17 +397,17 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe exitCode = actionDiagnostic(serviceArgs.getActionDiagnosticArgs()); } else if (ACTION_EXISTS.equals(action)) { exitCode = actionExists(clusterName, - serviceArgs.getActionExistsArgs()); + serviceArgs.getActionExistsArgs()); } else if (ACTION_FLEX.equals(action)) { exitCode = actionFlex(clusterName, serviceArgs.getActionFlexArgs()); } else if (ACTION_HELP.equals(action)) { log.info(serviceArgs.usage()); } else if (ACTION_KILL_CONTAINER.equals(action)) { exitCode = actionKillContainer(clusterName, - serviceArgs.getActionKillContainerArgs()); + serviceArgs.getActionKillContainerArgs()); } else if (ACTION_AM_SUICIDE.equals(action)) { exitCode = actionAmSuicide(clusterName, - serviceArgs.getActionAMSuicideArgs()); + serviceArgs.getActionAMSuicideArgs()); } else if (ACTION_LIST.equals(action)) { exitCode = actionList(clusterName, serviceArgs.getActionListArgs()); } else if (ACTION_LOOKUP.equals(action)) { @@ -413,7 +418,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe exitCode = actionResolve(serviceArgs.getActionResolveArgs()); } else if (ACTION_STATUS.equals(action)) { exitCode = actionStatus(clusterName, - serviceArgs.getActionStatusArgs()); + serviceArgs.getActionStatusArgs()); } else if (ACTION_UPDATE.equals(action)) { exitCode = actionUpdate(clusterName, serviceArgs.getActionUpdateArgs()); } else if (ACTION_VERSION.equals(action)) { @@ -713,20 +718,73 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe } @Override - public int actionInstallKeytab(ActionInstallKeytabArgs installKeytabInfo) + public int actionKeytab(ActionKeytabArgs keytabInfo) throws YarnException, IOException { + if (keytabInfo.install) { + return actionInstallKeytab(keytabInfo); + } else if (keytabInfo.delete) { + return actionDeleteKeytab(keytabInfo); + } else if (keytabInfo.list) { + return actionListKeytab(keytabInfo); + } else { + throw new BadCommandArgumentsException( + "Keytab option specified not found.\n" + + CommonArgs.usage(serviceArgs, ACTION_KEYTAB)); + } + } + + private int actionListKeytab(ActionKeytabArgs keytabInfo) throws IOException { + String folder = keytabInfo.folder != null ? keytabInfo.folder : StringUtils.EMPTY; + Path keytabPath = sliderFileSystem.buildKeytabInstallationDirPath(folder); + RemoteIterator<LocatedFileStatus> files = + sliderFileSystem.getFileSystem().listFiles(keytabPath, true); + log.info("Keytabs:"); + while (files.hasNext()) { + log.info("\t" + files.next().getPath().toString()); + } + + return EXIT_SUCCESS; + } + + private int actionDeleteKeytab(ActionKeytabArgs keytabInfo) + throws BadCommandArgumentsException, IOException { + if (StringUtils.isEmpty(keytabInfo.folder)) { + throw new BadCommandArgumentsException( + "A valid destination keytab sub-folder name is required (e.g. 'security').\n" + + CommonArgs.usage(serviceArgs, ACTION_KEYTAB)); + } + if (StringUtils.isEmpty(keytabInfo.keytab)) { + throw new BadCommandArgumentsException("A keytab name is required."); + } + + Path pkgPath = sliderFileSystem.buildKeytabInstallationDirPath(keytabInfo.folder); + + Path fileInFs = new Path(pkgPath, keytabInfo.keytab ); + log.info("Deleting keytab {}", fileInFs); + if (!sliderFileSystem.getFileSystem().exists(fileInFs)) { + throw new BadCommandArgumentsException("No keytab to delete found at " + + fileInFs.toUri().toString()); + } + + sliderFileSystem.getFileSystem().delete(fileInFs, false); + + return EXIT_SUCCESS; + } + + private int actionInstallKeytab(ActionKeytabArgs keytabInfo) + throws BadCommandArgumentsException, IOException { Path srcFile = null; - if (StringUtils.isEmpty(installKeytabInfo.folder)) { + if (StringUtils.isEmpty(keytabInfo.folder)) { throw new BadCommandArgumentsException( "A valid destination keytab sub-folder name is required (e.g. 'security').\n" - + CommonArgs.usage(serviceArgs, ACTION_INSTALL_KEYTAB)); + + CommonArgs.usage(serviceArgs, ACTION_KEYTAB)); } - if (StringUtils.isEmpty(installKeytabInfo.keytabUri)) { + if (StringUtils.isEmpty(keytabInfo.keytab)) { throw new BadCommandArgumentsException("A valid local keytab location is required."); } else { - File keytabFile = new File(installKeytabInfo.keytabUri); + File keytabFile = new File(keytabInfo.keytab); if (!keytabFile.exists() || keytabFile.isDirectory()) { throw new BadCommandArgumentsException("Unable to access supplied keytab file at " + keytabFile.getAbsolutePath()); @@ -735,20 +793,20 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe } } - Path pkgPath = sliderFileSystem.buildKeytabInstallationDirPath(installKeytabInfo.folder); + Path pkgPath = sliderFileSystem.buildKeytabInstallationDirPath(keytabInfo.folder); sliderFileSystem.getFileSystem().mkdirs(pkgPath); sliderFileSystem.getFileSystem().setPermission(pkgPath, new FsPermission( FsAction.ALL, FsAction.NONE, FsAction.NONE)); Path fileInFs = new Path(pkgPath, srcFile.getName()); - log.info("Installing keytab {} at {} and overwrite is {}.", srcFile, fileInFs, installKeytabInfo.overwrite); - if (sliderFileSystem.getFileSystem().exists(fileInFs) && !installKeytabInfo.overwrite) { + log.info("Installing keytab {} at {} and overwrite is {}.", srcFile, fileInFs, keytabInfo.overwrite); + if (sliderFileSystem.getFileSystem().exists(fileInFs) && !keytabInfo.overwrite) { throw new BadCommandArgumentsException("Keytab exists at " + fileInFs.toUri().toString() + ". Use --overwrite to overwrite."); } - sliderFileSystem.getFileSystem().copyFromLocalFile(false, installKeytabInfo.overwrite, srcFile, fileInFs); + sliderFileSystem.getFileSystem().copyFromLocalFile(false, keytabInfo.overwrite, srcFile, fileInFs); sliderFileSystem.getFileSystem().setPermission(fileInFs, new FsPermission( FsAction.READ_WRITE, FsAction.NONE, FsAction.NONE)); @@ -756,6 +814,13 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe } @Override + public int actionInstallKeytab(ActionInstallKeytabArgs installKeytabInfo) + throws YarnException, IOException { + log.warn("The 'install-keytab' option has been deprecated. Please use 'keytab --install'."); + return actionKeytab(new ActionKeytabArgs(installKeytabInfo)); + } + + @Override public int actionInstallPkg(ActionInstallPackageArgs installPkgInfo) throws YarnException, IOException { http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java b/slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java index 40b71a0..9b0f10f 100644 --- a/slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java +++ b/slider-core/src/main/java/org/apache/slider/client/SliderClientAPI.java @@ -32,6 +32,7 @@ import org.apache.slider.common.params.ActionFlexArgs; import org.apache.slider.common.params.ActionFreezeArgs; import org.apache.slider.common.params.ActionInstallKeytabArgs; import org.apache.slider.common.params.ActionInstallPackageArgs; +import org.apache.slider.common.params.ActionKeytabArgs; import org.apache.slider.common.params.ActionKillContainerArgs; import org.apache.slider.common.params.ActionListArgs; import org.apache.slider.common.params.ActionRegistryArgs; @@ -94,11 +95,24 @@ public interface SliderClientAPI extends Service { * @throws YarnException Yarn problems * @throws IOException other problems * @throws BadCommandArgumentsException bad arguments. + * @deperecated use #actionKeytab */ int actionInstallKeytab(ActionInstallKeytabArgs installKeytabInfo) throws YarnException, IOException; /** + * Manage keytabs leveraged by slider + * + * @param keytabInfo the arguments needed to manage the keytab + * @throws YarnException Yarn problems + * @throws IOException other problems + * @throws BadCommandArgumentsException bad arguments. + * @deperecated use #actionKeytab + */ + int actionKeytab(ActionKeytabArgs keytabInfo) + throws YarnException, IOException; + + /** * Upload application package to user home directory * * @param installPkgInfo the arguments needed to upload the package http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/main/java/org/apache/slider/common/params/ActionKeytabArgs.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/ActionKeytabArgs.java b/slider-core/src/main/java/org/apache/slider/common/params/ActionKeytabArgs.java new file mode 100644 index 0000000..32b1d2b --- /dev/null +++ b/slider-core/src/main/java/org/apache/slider/common/params/ActionKeytabArgs.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.slider.common.params; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; + +@Parameters(commandNames = {SliderActions.ACTION_KEYTAB}, + commandDescription = SliderActions.DESCRIBE_ACTION_KEYTAB) + +public class ActionKeytabArgs extends AbstractActionArgs { + + public ActionKeytabArgs(ActionInstallKeytabArgs installKeytabInfo) { + this.install = true; + this.overwrite = installKeytabInfo.overwrite; + this.keytab = installKeytabInfo.keytabUri; + this.folder = installKeytabInfo.folder; + } + + public ActionKeytabArgs() { + super(); + } + + @Override + public String getActionName() { + return SliderActions.ACTION_INSTALL_KEYTAB; + } + + @Parameter(names = {ARG_KEYTABINSTALL}, + description = "Install the keytab") + public boolean install; + + @Parameter(names = {ARG_KEYTABDELETE}, + description = "Delete the keytab") + public boolean delete; + + @Parameter(names = {ARG_KEYTABLIST}, + description = "List of installed keytabs") + public boolean list; + + @Parameter(names = {ARG_KEYTAB}, + description = "Path or name of the keytab") + public String keytab; + + @Parameter(names = {ARG_FOLDER}, + description = "The name of the folder in which to store the keytab") + public String folder; + + @Parameter(names = {ARG_OVERWRITE}, description = "Overwrite existing keytab") + public boolean overwrite = false; + + /** + * Get the min #of params expected + * @return the min number of params in the {@link #parameters} field + */ + public int getMinParams() { + return 0; + } + + @Override + public int getMaxParams() { + return 3; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/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 42efb33..002b77d 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 @@ -60,6 +60,9 @@ public interface Arguments { String ARG_IMAGE = "--image"; String ARG_INTERNAL = "--internal"; String ARG_KEYTAB = "--keytab"; + String ARG_KEYTABINSTALL = "--install"; + String ARG_KEYTABDELETE = "--delete"; + String ARG_KEYTABLIST = "--list"; String ARG_LEVEL = "--level"; String ARG_LIST = "--list"; String ARG_LISTCONF = "--listconf"; http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/main/java/org/apache/slider/common/params/ClientArgs.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/ClientArgs.java b/slider-core/src/main/java/org/apache/slider/common/params/ClientArgs.java index a3b7997..a0f82e6 100644 --- a/slider-core/src/main/java/org/apache/slider/common/params/ClientArgs.java +++ b/slider-core/src/main/java/org/apache/slider/common/params/ClientArgs.java @@ -58,6 +58,7 @@ public class ClientArgs extends CommonArgs { private final ActionHelpArgs actionHelpArgs = new ActionHelpArgs(); private final ActionInstallPackageArgs actionInstallPackageArgs = new ActionInstallPackageArgs(); private final ActionInstallKeytabArgs actionInstallKeytabArgs = new ActionInstallKeytabArgs(); + private final ActionKeytabArgs actionKeytabArgs = new ActionKeytabArgs(); private final ActionKillContainerArgs actionKillContainerArgs = new ActionKillContainerArgs(); private final ActionListArgs actionListArgs = new ActionListArgs(); @@ -94,6 +95,7 @@ public class ClientArgs extends CommonArgs { actionHelpArgs, actionInstallPackageArgs, actionInstallKeytabArgs, + actionKeytabArgs, actionKillContainerArgs, actionListArgs, actionLookupArgs, @@ -143,6 +145,9 @@ public class ClientArgs extends CommonArgs { public ActionInstallKeytabArgs getActionInstallKeytabArgs() { return actionInstallKeytabArgs; } + public ActionKeytabArgs getActionKeytabArgs() { + return actionKeytabArgs; } + public ActionUpdateArgs getActionUpdateArgs() { return actionUpdateArgs; } @@ -241,6 +246,9 @@ public class ClientArgs extends CommonArgs { } else if (SliderActions.ACTION_INSTALL_PACKAGE.equals(action)) { bindCoreAction(actionInstallPackageArgs); + } else if (SliderActions.ACTION_KEYTAB.equals(action)) { + bindCoreAction(actionKeytabArgs); + } else if (SliderActions.ACTION_INSTALL_KEYTAB.equals(action)) { bindCoreAction(actionInstallKeytabArgs); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java b/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java index 4b92a32..3dee8ff 100644 --- a/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java +++ b/slider-core/src/main/java/org/apache/slider/common/params/SliderActions.java @@ -47,6 +47,7 @@ public interface SliderActions { String ACTION_DIAGNOSTICS = "diagnostics"; String ACTION_INSTALL_PACKAGE = "install-package"; String ACTION_INSTALL_KEYTAB = "install-keytab"; + String ACTION_KEYTAB = "keytab"; String DESCRIBE_ACTION_AM_SUICIDE = "Tell the Slider Application Master to simulate a process failure by terminating itself"; String DESCRIBE_ACTION_BUILD = @@ -85,6 +86,7 @@ public interface SliderActions { "Print the Slider version information"; String DESCRIBE_ACTION_INSTALL_PACKAGE = "Install the application package in the home directory under sub-folder packages"; String DESCRIBE_ACTION_INSTALL_KEYTAB = "Install the Kerberos keytab file in the sub-folder 'keytabs' of the user's Slider base directory"; + String DESCRIBE_ACTION_KEYTAB = "Manage a Kerberos keytab file (install, delete, list) in the sub-folder 'keytabs' of the user's Slider base directory"; String DESCRIBE_ACTION_DIAGNOSTIC = "Diagnose the configuration of the running slider application and slider client"; } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/test/groovy/org/apache/slider/client/TestDeprecatedInstallKeytabCommand.groovy ---------------------------------------------------------------------- diff --git a/slider-core/src/test/groovy/org/apache/slider/client/TestDeprecatedInstallKeytabCommand.groovy b/slider-core/src/test/groovy/org/apache/slider/client/TestDeprecatedInstallKeytabCommand.groovy new file mode 100644 index 0000000..a06b3ca --- /dev/null +++ b/slider-core/src/test/groovy/org/apache/slider/client/TestDeprecatedInstallKeytabCommand.groovy @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.slider.client + +import org.apache.commons.io.FileUtils +import org.apache.hadoop.fs.FileUtil +import org.apache.hadoop.fs.Path +import org.apache.hadoop.fs.RawLocalFileSystem +import org.apache.hadoop.yarn.conf.YarnConfiguration +import org.apache.slider.common.params.Arguments +import org.apache.slider.common.params.ClientArgs +import org.apache.slider.common.tools.SliderFileSystem +import org.apache.slider.common.tools.SliderUtils +import org.apache.slider.core.exceptions.BadCommandArgumentsException +import org.apache.slider.core.exceptions.SliderException +import org.apache.slider.core.main.ServiceLauncher +import org.apache.slider.core.main.ServiceLauncherBaseTest +import org.junit.Before +import org.junit.Test + +/** + * Test a keytab installation + */ +class TestDeprecatedInstallKeytabCommand extends ServiceLauncherBaseTest { + final shouldFail = new GroovyTestCase().&shouldFail + + private static SliderFileSystem testFileSystem + + @Before + public void setupFilesystem() { + org.apache.hadoop.fs.FileSystem fileSystem = new RawLocalFileSystem() + YarnConfiguration configuration = SliderUtils.createConfiguration() + fileSystem.setConf(configuration) + testFileSystem = new SliderFileSystem(fileSystem, configuration) + } + + @Test + public void testInstallKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + } + + @Test + public void testInstallKeytabWithNoFolder() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath]) + } + } + + @Test + public void testInstallKeytabWithNoKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_FOLDER, + "testFolder"]) + } + } + + @Test + public void testInstallKeytabAllowingOverwrite() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder", + Arguments.ARG_OVERWRITE] + ) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + } + + @Test + public void testInstallKeytabNotAllowingOverwrite() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) + shouldFail(BadCommandArgumentsException) { + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + } + } + + @Test + public void testInstallKeytabWithMissingKeytab() throws Throwable { + // create a mock keytab file + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + "HeyIDontExist.keytab", + Arguments.ARG_FOLDER, + "testFolder"]) + } + } + + private File getTempLocation () { + return new File(System.getProperty("user.dir") + "/target"); + } + + static class TestSliderClient extends SliderClient { + public TestSliderClient() { + super() + } + + @Override + protected void initHadoopBinding() throws IOException, SliderException { + sliderFileSystem = testFileSystem + } + + } +} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/test/groovy/org/apache/slider/client/TestInstallKeytab.groovy ---------------------------------------------------------------------- diff --git a/slider-core/src/test/groovy/org/apache/slider/client/TestInstallKeytab.groovy b/slider-core/src/test/groovy/org/apache/slider/client/TestInstallKeytab.groovy deleted file mode 100644 index 2bbad6a..0000000 --- a/slider-core/src/test/groovy/org/apache/slider/client/TestInstallKeytab.groovy +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.slider.client - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.fs.FileUtil -import org.apache.hadoop.fs.Path -import org.apache.hadoop.fs.RawLocalFileSystem -import org.apache.hadoop.yarn.conf.YarnConfiguration -import org.apache.slider.common.params.Arguments -import org.apache.slider.common.params.ClientArgs -import org.apache.slider.common.tools.SliderFileSystem -import org.apache.slider.common.tools.SliderUtils -import org.apache.slider.core.exceptions.BadCommandArgumentsException -import org.apache.slider.core.exceptions.SliderException -import org.apache.slider.core.main.ServiceLauncher -import org.apache.slider.core.main.ServiceLauncherBaseTest -import org.junit.Before -import org.junit.Test - -/** - * Test a keytab installation - */ -class TestInstallKeytab extends ServiceLauncherBaseTest { - final shouldFail = new GroovyTestCase().&shouldFail - - private static SliderFileSystem testFileSystem - - @Before - public void setupFilesystem() { - org.apache.hadoop.fs.FileSystem fileSystem = new RawLocalFileSystem() - YarnConfiguration configuration = SliderUtils.createConfiguration() - fileSystem.setConf(configuration) - testFileSystem = new SliderFileSystem(fileSystem, configuration) - } - - @Test - public void testInstallKeytab() throws Throwable { - // create a mock keytab file - File localKeytab = - FileUtil.createLocalTempFile(tempLocation, "test", true); - String contents = UUID.randomUUID().toString() - FileUtils.write(localKeytab, contents); - YarnConfiguration conf = SliderUtils.createConfiguration() - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath, - Arguments.ARG_FOLDER, - "testFolder"]) - Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) - File installedKeytab = new File(installedPath.toUri().path) - assert installedKeytab.exists() - assert FileUtils.readFileToString(installedKeytab).equals( - FileUtils.readFileToString(localKeytab)) - } - - @Test - public void testInstallKeytabWithNoFolder() throws Throwable { - // create a mock keytab file - File localKeytab = - FileUtil.createLocalTempFile(tempLocation, "test", true); - String contents = UUID.randomUUID().toString() - FileUtils.write(localKeytab, contents); - YarnConfiguration conf = SliderUtils.createConfiguration() - shouldFail(BadCommandArgumentsException) { - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath]) - } - } - - @Test - public void testInstallKeytabWithNoKeytab() throws Throwable { - // create a mock keytab file - File localKeytab = - FileUtil.createLocalTempFile(tempLocation, "test", true); - String contents = UUID.randomUUID().toString() - FileUtils.write(localKeytab, contents); - YarnConfiguration conf = SliderUtils.createConfiguration() - shouldFail(BadCommandArgumentsException) { - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_FOLDER, - "testFolder"]) - } - } - - @Test - public void testInstallKeytabAllowingOverwrite() throws Throwable { - // create a mock keytab file - File localKeytab = - FileUtil.createLocalTempFile(tempLocation, "test", true); - String contents = UUID.randomUUID().toString() - FileUtils.write(localKeytab, contents); - YarnConfiguration conf = SliderUtils.createConfiguration() - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath, - Arguments.ARG_FOLDER, - "testFolder"]) - Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) - File installedKeytab = new File(installedPath.toUri().path) - assert installedKeytab.exists() - assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) - launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath, - Arguments.ARG_FOLDER, - "testFolder", - Arguments.ARG_OVERWRITE] - ) - assert installedKeytab.exists() - assert FileUtils.readFileToString(installedKeytab).equals( - FileUtils.readFileToString(localKeytab)) - } - - @Test - public void testInstallKeytabNotAllowingOverwrite() throws Throwable { - // create a mock keytab file - File localKeytab = - FileUtil.createLocalTempFile(tempLocation, "test", true); - String contents = UUID.randomUUID().toString() - FileUtils.write(localKeytab, contents); - YarnConfiguration conf = SliderUtils.createConfiguration() - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath, - Arguments.ARG_FOLDER, - "testFolder"]) - Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) - File installedKeytab = new File(installedPath.toUri().path) - assert installedKeytab.exists() - assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) - shouldFail(BadCommandArgumentsException) { - launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - localKeytab.absolutePath, - Arguments.ARG_FOLDER, - "testFolder"]) - } - } - - @Test - public void testInstallKeytabWithMissingKeytab() throws Throwable { - // create a mock keytab file - YarnConfiguration conf = SliderUtils.createConfiguration() - shouldFail(BadCommandArgumentsException) { - ServiceLauncher launcher = launch(TestSliderClient, - conf, - [ - ClientArgs.ACTION_INSTALL_KEYTAB, - ClientArgs.ARG_KEYTAB, - "HeyIDontExist.keytab", - Arguments.ARG_FOLDER, - "testFolder"]) - } - } - - private File getTempLocation () { - return new File(System.getProperty("user.dir") + "/target"); - } - - static class TestSliderClient extends SliderClient { - public TestSliderClient() { - super() - } - - @Override - protected void initHadoopBinding() throws IOException, SliderException { - sliderFileSystem = testFileSystem - } - - } -} http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/3ad0e566/slider-core/src/test/groovy/org/apache/slider/client/TestKeytabCommandOptions.groovy ---------------------------------------------------------------------- diff --git a/slider-core/src/test/groovy/org/apache/slider/client/TestKeytabCommandOptions.groovy b/slider-core/src/test/groovy/org/apache/slider/client/TestKeytabCommandOptions.groovy new file mode 100644 index 0000000..38662ef --- /dev/null +++ b/slider-core/src/test/groovy/org/apache/slider/client/TestKeytabCommandOptions.groovy @@ -0,0 +1,360 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.slider.client + +import org.apache.commons.io.FileUtils +import org.apache.hadoop.fs.FileUtil +import org.apache.hadoop.fs.Path +import org.apache.hadoop.fs.RawLocalFileSystem +import org.apache.hadoop.util.StringUtils +import org.apache.hadoop.yarn.conf.YarnConfiguration +import org.apache.log4j.AppenderSkeleton +import org.apache.log4j.Logger +import org.apache.log4j.spi.LoggingEvent +import org.apache.slider.common.params.Arguments +import org.apache.slider.common.params.ClientArgs +import org.apache.slider.common.tools.SliderFileSystem +import org.apache.slider.common.tools.SliderUtils +import org.apache.slider.core.exceptions.BadCommandArgumentsException +import org.apache.slider.core.exceptions.SliderException +import org.apache.slider.core.main.ServiceLauncher +import org.apache.slider.core.main.ServiceLauncherBaseTest +import org.junit.Before +import org.junit.Test + +/** + * Test a keytab installation + */ +class TestKeytabCommandOptions extends ServiceLauncherBaseTest { + final shouldFail = new GroovyTestCase().&shouldFail + + private static SliderFileSystem testFileSystem + + @Before + public void setupFilesystem() { + org.apache.hadoop.fs.FileSystem fileSystem = new RawLocalFileSystem() + YarnConfiguration configuration = SliderUtils.createConfiguration() + fileSystem.setConf(configuration) + testFileSystem = new SliderFileSystem(fileSystem, configuration) + File testFolderDir = new File(testFileSystem.buildKeytabInstallationDirPath("").toUri().path) + testFolderDir.deleteDir() + + } + + @Test + public void testInstallKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + } + + @Test + public void testInstallThenDeleteKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABDELETE, + ClientArgs.ARG_KEYTAB, + localKeytab.name, + Arguments.ARG_FOLDER, + "testFolder"]) + + assert !installedKeytab.exists() + + } + + @Test + public void testInstallThenListKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + + // install an additional copy into another folder to test listing + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_INSTALL_KEYTAB, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder2"]) + + TestAppender testAppender = new TestAppender(); + + Logger.getLogger(SliderClient.class).addAppender(testAppender); + + try { + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABLIST] + ) + assert testAppender.events.size() == 3 + assert testAppender.events.get(1).message == + "\tfile:/Users/jmaron/.slider/keytabs/testFolder/" + installedKeytab.name + assert testAppender.events.get(2).message == + "\tfile:/Users/jmaron/.slider/keytabs/testFolder2/" + installedKeytab.name + } finally { + Logger.getLogger(SliderClient.class).removeAppender(testAppender); + } + + // now listing while specifying the folder name + testAppender = new TestAppender(); + + Logger.getLogger(SliderClient.class).addAppender(testAppender); + + try { + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABLIST, + Arguments.ARG_FOLDER, + "testFolder"]) + assert testAppender.events.size() == 2 + assert testAppender.events.get(1).message == + "\tfile:/Users/jmaron/.slider/keytabs/testFolder/" + installedKeytab.name + } finally { + Logger.getLogger(SliderClient.class).removeAppender(testAppender); + } + } + + @Test + public void testDeleteNonExistentKeytab() throws Throwable { + // create a mock keytab file + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABDELETE, + ClientArgs.ARG_KEYTAB, + "HeyIDontExist.keytab", + Arguments.ARG_FOLDER, + "testFolder"]) + } + } + + @Test + public void testInstallKeytabWithNoFolder() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath]) + } + } + + @Test + public void testInstallKeytabWithNoKeytab() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_FOLDER, + "testFolder"]) + } + } + + @Test + public void testInstallKeytabAllowingOverwrite() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder", + Arguments.ARG_OVERWRITE] + ) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals( + FileUtils.readFileToString(localKeytab)) + } + + @Test + public void testInstallKeytabNotAllowingOverwrite() throws Throwable { + // create a mock keytab file + File localKeytab = + FileUtil.createLocalTempFile(tempLocation, "test", true); + String contents = UUID.randomUUID().toString() + FileUtils.write(localKeytab, contents); + YarnConfiguration conf = SliderUtils.createConfiguration() + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + Path installedPath = new Path(testFileSystem.buildKeytabInstallationDirPath("testFolder"), localKeytab.getName()) + File installedKeytab = new File(installedPath.toUri().path) + assert installedKeytab.exists() + assert FileUtils.readFileToString(installedKeytab).equals(FileUtils.readFileToString(localKeytab)) + shouldFail(BadCommandArgumentsException) { + launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + localKeytab.absolutePath, + Arguments.ARG_FOLDER, + "testFolder"]) + } + } + + @Test + public void testInstallKeytabWithMissingKeytab() throws Throwable { + // create a mock keytab file + YarnConfiguration conf = SliderUtils.createConfiguration() + shouldFail(BadCommandArgumentsException) { + ServiceLauncher launcher = launch(TestSliderClient, + conf, + [ + ClientArgs.ACTION_KEYTAB, + ClientArgs.ARG_KEYTABINSTALL, + ClientArgs.ARG_KEYTAB, + "HeyIDontExist.keytab", + Arguments.ARG_FOLDER, + "testFolder"]) + } + } + + private File getTempLocation () { + return new File(System.getProperty("user.dir") + "/target"); + } + + static class TestSliderClient extends SliderClient { + public TestSliderClient() { + super() + } + + @Override + protected void initHadoopBinding() throws IOException, SliderException { + sliderFileSystem = testFileSystem + } + + } + + static class TestAppender extends AppenderSkeleton{ + public List<LoggingEvent> events = new ArrayList<LoggingEvent>(); + public void close() {} + public boolean requiresLayout() {return false;} + @Override + protected void append(LoggingEvent event) { + events.add(event); + } + }}