You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by sm...@apache.org on 2015/03/16 17:48:38 UTC
[05/19] incubator-slider git commit: SLIDER-756 revise
accumulo-slider script to work with slider client --install command
SLIDER-756 revise accumulo-slider script to work with slider client --install 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/670bfb32
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/670bfb32
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/670bfb32
Branch: refs/heads/feature/package_simplification_II
Commit: 670bfb32fd26769fd5f08b4609f05fb6c915da45
Parents: 909b7c1
Author: Billie Rinaldi <bi...@gmail.com>
Authored: Wed Mar 4 23:14:24 2015 -0800
Committer: Billie Rinaldi <bi...@gmail.com>
Committed: Wed Mar 4 23:14:24 2015 -0800
----------------------------------------------------------------------
app-packages/accumulo/accumulo-slider | 53 ---
app-packages/accumulo/accumulo-slider.py | 378 -------------------
.../accumulo/clientInstallConfig-default.json | 7 +
app-packages/accumulo/metainfo.xml | 2 +-
.../accumulo/package/files/accumulo-slider | 59 +++
.../accumulo/package/files/accumulo-slider.py | 182 +++++++++
.../accumulo/package/scripts/accumulo_client.py | 37 +-
.../accumulo/package/scripts/client_params.py | 39 ++
.../package/templates/accumulo-slider-env.sh.j2 | 17 +
app-packages/accumulo/pom.xml | 14 +-
app-packages/accumulo/src/assembly/accumulo.xml | 8 +-
.../funtest/accumulo/AccumuloScriptIT.groovy | 91 +++--
.../funtest/accumulo/AccumuloSliderShell.groovy | 7 -
.../resources/clientInstallConfig-test.json | 8 +
14 files changed, 415 insertions(+), 487 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/accumulo-slider
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/accumulo-slider b/app-packages/accumulo/accumulo-slider
deleted file mode 100644
index 8f9cb06..0000000
--- a/app-packages/accumulo/accumulo-slider
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-
-# Resolve links - $0 may be a softlink
-PRG="${0}"
-
-while [ -h "${PRG}" ]; do
- ls=`ls -ld "${PRG}"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "${PRG}"`/"$link"
- fi
-done
-
-# find python >= 2.6
-if [ -a /usr/bin/python2.6 ]; then
- PYTHON=/usr/bin/python2.6
-fi
-
-if [ -z "$PYTHON" ]; then
- PYTHON=/usr/bin/python
-fi
-
-# check for version
-majversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f1`
-minversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f2`
-numversion=$(( 10 * $majversion + $minversion))
-if (( $numversion < 26 )); then
- echo "Need python version > 2.6"
- exit 1
-fi
-
-ACCUMULO_SLIDER_BIN_DIR=`dirname ${PRG}`
-
-$PYTHON ${ACCUMULO_SLIDER_BIN_DIR}/accumulo-slider.py $@
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/accumulo-slider.py
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/accumulo-slider.py b/app-packages/accumulo/accumulo-slider.py
deleted file mode 100644
index 1eccf59..0000000
--- a/app-packages/accumulo/accumulo-slider.py
+++ /dev/null
@@ -1,378 +0,0 @@
-#!/usr/bin/python
-# 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.
-
-import os
-import sys
-import json
-import glob
-import tempfile
-import subprocess
-import shutil
-
-SLIDER_DIR = os.getenv('SLIDER_HOME', None)
-if SLIDER_DIR == None or (not os.path.exists(SLIDER_DIR)):
- print "Unable to find SLIDER_HOME. Please configure SLIDER_HOME before running accumulo-slider"
- sys.exit(1)
-SLIDER_CMD = os.path.join(SLIDER_DIR, 'bin', 'slider.py')
-
-TMP_DIR = os.path.join(tempfile.gettempdir(), "accumulo-slider-tmp."+str(os.getpid()))
-
-CMD_OPTS = {}
-
-def call(cmd):
- print "Running: " + " ".join(cmd)
- retcode = subprocess.call(cmd)
- if retcode != 0:
- raise Exception("return code from running %s was %d" % (cmd[0], retcode))
-
-def exec_accumulo_command(command, args=[]):
- ACCUMULO_DIR = os.getenv('ACCUMULO_HOME', None)
- if ACCUMULO_DIR == None or (not os.path.exists(ACCUMULO_DIR)):
- print "Unable to find ACCUMULO_HOME. Please configure ACCUMULO_HOME before running accumulo-slider " + command
- sys.exit(1)
- ACCUMULO_CMD = os.path.join(ACCUMULO_DIR, 'bin', 'accumulo')
-
- confdir = get_all_conf()
- if command == 'shell' or command == 'admin':
- cmd = [ACCUMULO_CMD, command, '--config-file', os.path.join(confdir, 'client.conf')] + list(args)
- else:
- cmd = [ACCUMULO_CMD, command] + list(args)
- print "Setting ACCUMULO_CONF_DIR=" + confdir
- os.putenv("ACCUMULO_CONF_DIR", confdir)
- call(cmd)
-
-def exec_tool_command(jarfile, mainclass, args=[]):
- ACCUMULO_DIR = os.getenv('ACCUMULO_HOME', None)
- if ACCUMULO_DIR == None or (not os.path.exists(ACCUMULO_DIR)):
- print "Unable to find ACCUMULO_HOME. Please configure ACCUMULO_HOME before running accumulo-slider tool"
- sys.exit(1)
- TOOL_CMD = os.path.join(ACCUMULO_DIR, 'bin', 'tool.sh')
-
- confdir = get_all_conf()
- cmd = [TOOL_CMD, jarfile, mainclass] + list(args)
- print "Setting ACCUMULO_CONF_DIR=" + confdir
- os.putenv("ACCUMULO_CONF_DIR", confdir)
- call(cmd)
-
-def jar(jarfile, *args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] jar jarfile [mainclass]]
- OR: [accumulo-slider --appconf confdir jar jarfile [mainclass]]
- Runs a class from a specified jar
- """
- exec_accumulo_command("jar", jarfile, args=args)
-
-def classname(mainclass, *args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] classname mainclass]
- OR: [accumulo-slider --appconf confdir classname mainclass]
- Runs a specified class on the existing accumulo classpath
- """
- exec_accumulo_command(mainclass, args=args)
-
-def shell(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] shell]
- OR: [accumulo-slider --appconf confdir shell]
- Runs an accumulo shell
- """
- exec_accumulo_command("shell", args=args)
-
-def admin(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] admin cmd]
- OR: [accumulo-slider --appconf confdir admin cmd]
- Executes an admin command (run without cmd argument for a list of commands)
- """
- exec_accumulo_command("admin", args=args)
-
-def classpath(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] classpath]
- OR: [accumulo-slider --appconf confdir classpath]
- Prints the classpath of the accumulo client install
- """
- exec_accumulo_command("classpath", args=args)
-
-def info(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] info]
- OR: [accumulo-slider --appconf confdir info]
- Prints information about an accumulo instance (monitor, masters, and zookeepers)
- """
- exec_accumulo_command("info", args=args)
-
-def rfileinfo(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] rfile-info rfilename]
- OR: [accumulo-slider --appconf confdir rfile-info rfilename]
- Prints information about a specified RFile
- """
- exec_accumulo_command("rfile-info", args=args)
-
-def logininfo(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] login-info]
- OR: [accumulo-slider --appconf confdir login-info]
- Prints the supported authentication token types for the accumulo instance
- """
- exec_accumulo_command("login-info", args=args)
-
-def createtoken(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] create-token]
- OR: [accumulo-slider --appconf confdir create-token]
- Saves a given accumulo authentication token to a file
- """
- exec_accumulo_command("create-token", args=args)
-
-def version(*args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] version]
- OR: [accumulo-slider --appconf confdir version]
- Prints the version of the accumulo client install
- """
- exec_accumulo_command("version", args=args)
-
-def tool(jarfile, mainclass, *args):
- """Syntax: [accumulo-slider --app appname[ --appconf confdir] tool jarfile classname]
- OR: [accumulo-slider --appconf confdir tool jarfile classname]
- Runs a mapreduce job using accumulo's tool.sh
- """
- exec_tool_command(jarfile, mainclass, args=args)
-
-def quicklinks():
- """Syntax: [accumulo-slider --app appname quicklinks]
- Prints the quicklinks information of accumulo-slider registry
- """
- global CMD_OPTS
- if not 'app_name' in CMD_OPTS.keys():
- print_usage()
- sys.exit(1)
-
- cmd = [SLIDER_CMD, "registry", "--getconf", "quicklinks", "--format", "json",
- "--name", CMD_OPTS['app_name']]
-
- if 'user' in CMD_OPTS.keys():
- cmd.append( "--user "+CMD_OPTS['user'])
-
- call(cmd)
-
-def proxies():
- """Syntax: [accumulo-slider --app appname proxies]
- Prints the componentinstancedata information of accumulo-slider registry
- """
- global CMD_OPTS
- if not 'app_name' in CMD_OPTS.keys():
- print_usage()
- sys.exit(1)
-
- cmd = [SLIDER_CMD, "registry", "--getconf", "componentinstancedata",
- "--format", "json", "--name", CMD_OPTS['app_name']]
-
- if 'user' in CMD_OPTS.keys():
- cmd.append( "--user "+CMD_OPTS['user'])
-
- call(cmd)
-
-def install(dir):
- """Syntax: [accumulo-slider --app appname install dir]
- Installs a fully configured accumulo client in the specified dir
- The resulting client may be used on its own without accumulo-slider
- """
- global CMD_OPTS
- if not 'app_name' in CMD_OPTS.keys():
- print_usage()
- sys.exit(1)
- if os.path.exists(dir):
- raise Exception("Install dir must not exist: " + dir)
-
- global TMP_DIR
- workdir = os.path.join(TMP_DIR, 'install-work-dir')
-
- statusfile = os.path.join(workdir, 'status.json')
- cmd = [SLIDER_CMD, "status", CMD_OPTS['app_name'], "--out", statusfile]
- call(cmd)
-
- infile = open(statusfile)
- try:
- content = json.load(infile)
- finally:
- infile.close()
-
- appdef = content['options']['application.def']
- appdeffile = appdef[appdef.rfind('/')+1:]
- cmd = ["hadoop", "fs", "-copyToLocal", appdef, workdir]
- call(cmd)
-
- cmd = ["unzip", os.path.join(workdir, appdeffile), "-d", workdir]
- call(cmd)
-
- gzfile = glob.glob(os.path.join(workdir, 'package', 'files', 'accumulo*gz'))
- if len(gzfile) != 1:
- raise Exception("got " + gzfile + " from glob")
- cmd = ["tar", "xvzf", gzfile[0], '-C', workdir]
- call(cmd)
-
- tmp_accumulo = glob.glob(os.path.join(workdir, 'accumulo-[0-9]*'))
- if len(tmp_accumulo) != 1:
- raise Exception("got " + tmp_accumulo + " from glob")
- tmp_accumulo = tmp_accumulo[0]
-
- confdir = os.path.join(tmp_accumulo, 'conf')
- tmpconf = os.path.join(workdir, 'conf-tmp')
- shutil.move(confdir, tmpconf)
- make_conf(os.path.join(tmpconf, 'templates'), confdir)
-
- libdir = os.path.join(tmp_accumulo, 'lib')
- for jar in glob.glob(os.path.join(workdir, 'package', 'files', '*jar')):
- shutil.move(jar, libdir)
- shutil.move(tmp_accumulo, dir)
-
-def get_all_conf():
- """Syntax: [accumulo-slider --app appname [--appconf confdir] getconf]
- Downloads configuration for an accumulo instance
- If --appconf is specified, creates the specified conf dir and populates it
- """
- ACCUMULO_CONF_DIR = os.getenv('ACCUMULO_CONF_DIR', None)
- if ACCUMULO_CONF_DIR == None or (not os.path.exists(ACCUMULO_CONF_DIR)):
- ACCUMULO_DIR = os.getenv('ACCUMULO_HOME', None)
- if ACCUMULO_DIR == None or (not os.path.exists(ACCUMULO_DIR)):
- print "Unable to find ACCUMULO_HOME. Please configure ACCUMULO_HOME before running this command"
- sys.exit(1)
- ACCUMULO_CONF_DIR = os.path.join(ACCUMULO_DIR, 'conf')
-
- global CMD_OPTS
- global TMP_DIR
- confdir = os.path.join(TMP_DIR, 'conf')
- if 'app_conf' in CMD_OPTS.keys():
- confdir = CMD_OPTS['app_conf']
- if os.path.exists(confdir):
- print "Using existing app conf instead of downloading it again: " + confdir
- return confdir
-
- if not 'app_name' in CMD_OPTS.keys():
- print_usage()
- sys.exit(1)
-
- make_conf(ACCUMULO_CONF_DIR, confdir)
- return confdir
-
-def make_conf(oldconf, newconf):
- client_file = os.path.join(newconf, 'client.conf')
- site_file = os.path.join(newconf, 'accumulo-site.xml')
- env_file = os.path.join(newconf, 'accumulo-env.sh')
- env_json = os.path.join(newconf, 'accumulo-env.json')
-
- print "Copying base conf from " + oldconf + " to " + newconf
- shutil.copytree(oldconf, newconf)
-
- try_remove(client_file)
- try_remove(site_file)
- try_remove(env_file)
- try_remove(env_json)
-
- get_conf("client", "properties", client_file)
- get_conf("accumulo-site", "xml", site_file)
- get_conf("accumulo-env", "json", env_json)
-
- infile = open(env_json)
- outfile = open(env_file, 'w')
- try:
- content = json.load(infile)
- outfile.write(content['content'])
- finally:
- outfile.close()
- infile.close()
-
-def try_remove(path):
- try:
- os.remove(path)
- except:
- if os.path.exists(path):
- raise
-
-def get_conf(confname, fileformat, destfile):
- if os.path.exists(destfile):
- print "Conf file " + destfile + " already exists, remove it to re-download"
- return
-
- cmd = [SLIDER_CMD, "registry", "--getconf", confname, "--format",
- fileformat, "--dest", destfile, "--name", CMD_OPTS['app_name']]
- if 'user' in CMD_OPTS.keys():
- cmd.append("--user " + CMD_OPTS['user'])
-
- call(cmd)
- if not os.path.exists(destfile):
- raise Exception("Failed to read slider deployed accumulo config " + confname)
-
-def print_commands():
- """Print all client commands and link to documentation"""
- print "Commands:\n\t", "\n\t".join(sorted(COMMANDS.keys()))
- print "\nHelp:", "\n\thelp", "\n\thelp <command>"
-
-def print_usage(command=None):
- """Print one help message or list of available commands"""
- if command != None:
- if COMMANDS.has_key(command):
- print (COMMANDS[command].__doc__ or
- "No documentation provided for <%s>" % command)
- else:
- print "<%s> is not a valid command" % command
- else:
- print "Usage:"
- print "accumulo-slider --app <name>[ --appconf <confdir> --user <username>] <command>"
- print " The option --appconf creates a conf dir that can be reused;"
- print " on subsequent calls to accumulo-slider, --app can be left off if"
- print " --appconf is specified. If --appconf is not specified, a"
- print " temporary conf dir is created each time accumulo-slider is run."
- print_commands()
-
-def unknown_command(*args):
- print "Unknown command: [accumulo-slider %s]" % ' '.join(sys.argv[1:])
- print_usage()
-
-COMMANDS = {"shell": shell, "tool": tool, "admin": admin, "classpath": classpath,
- "info": info, "version": version, "jar": jar, "classname": classname,
- "quicklinks" : quicklinks, "proxies": proxies, "getconf": get_all_conf,
- "rfile-info": rfileinfo, "login-info": logininfo, "create-token": createtoken,
- "install": install, "help": print_usage}
-
-def parse_config_opts(args):
- curr = args[:]
- curr.reverse()
- global CMD_OPTS
- args_list = []
- while len(curr) > 0:
- token = curr.pop()
- if token == "--app":
- CMD_OPTS['app_name'] = curr.pop() if (len(curr) != 0) else None
- elif token == "--user":
- CMD_OPTS['user'] = curr.pop() if (len(curr) != 0) else None
- elif token == "--appconf":
- CMD_OPTS['app_conf'] = curr.pop() if (len(curr) != 0) else None
- else:
- args_list.append(token)
- return args_list
-
-def main():
- args = parse_config_opts(sys.argv[1:])
- if len(args) < 1:
- print_usage()
- sys.exit(-1)
- COMMAND = args[0]
- ARGS = args[1:]
- try:
- (COMMANDS.get(COMMAND, unknown_command))(*ARGS)
- finally:
- global CMD_OPTS
- if os.path.exists(TMP_DIR):
- print "Cleaning up tmp dir " + TMP_DIR
- shutil.rmtree(TMP_DIR)
-
-if __name__ == "__main__":
- main()
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/clientInstallConfig-default.json
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/clientInstallConfig-default.json b/app-packages/accumulo/clientInstallConfig-default.json
new file mode 100644
index 0000000..02176dc
--- /dev/null
+++ b/app-packages/accumulo/clientInstallConfig-default.json
@@ -0,0 +1,7 @@
+{
+ "schema":"http://example.org/specification/v2.0.0",
+ "global":{
+ "client_root": "{app_install_dir}/accumulo-${accumulo.version}",
+ "slider_home_dir": "${slider.dir}"
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/metainfo.xml
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/metainfo.xml b/app-packages/accumulo/metainfo.xml
index f0ae34d..b425aef 100644
--- a/app-packages/accumulo/metainfo.xml
+++ b/app-packages/accumulo/metainfo.xml
@@ -140,7 +140,7 @@
<component>
<name>ACCUMULO_PROXY</name>
- <category>CLIENT</category>
+ <category>SLAVE</category>
<componentExports>
<componentExport>
<name>proxies</name>
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/package/files/accumulo-slider
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/package/files/accumulo-slider b/app-packages/accumulo/package/files/accumulo-slider
new file mode 100644
index 0000000..0d203d7
--- /dev/null
+++ b/app-packages/accumulo/package/files/accumulo-slider
@@ -0,0 +1,59 @@
+#!/bin/bash
+#
+# 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.
+#
+
+# Resolve links - $0 may be a softlink
+PRG="${0}"
+
+while [ -h "${PRG}" ]; do
+ ls=`ls -ld "${PRG}"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "${PRG}"`/"$link"
+ fi
+done
+
+# find python >= 2.6
+if [ -a /usr/bin/python2.6 ]; then
+ PYTHON=/usr/bin/python2.6
+fi
+
+if [ -z "$PYTHON" ]; then
+ PYTHON=/usr/bin/python
+fi
+
+# check for version
+majversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f1`
+minversion=`$PYTHON -V 2>&1 | awk '{print $2}' | cut -d'.' -f2`
+numversion=$(( 10 * $majversion + $minversion))
+if (( $numversion < 26 )); then
+ echo "Need python version > 2.6"
+ exit 1
+fi
+
+ACCUMULO_BIN_DIR=`dirname ${PRG}`
+ACCUMULO_HOME=`cd ${ACCUMULO_BIN_DIR}/..;pwd`
+ACCUMULO_CONF_DIR="${ACCUMULO_CONF_DIR:-$ACCUMULO_HOME/conf}"
+
+if [ -f "${ACCUMULO_CONF_DIR}/accumulo-slider-env.sh" ]; then
+ . "${ACCUMULO_CONF_DIR}/accumulo-slider-env.sh"
+fi
+
+$PYTHON ${ACCUMULO_BIN_DIR}/accumulo-slider.py $@
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/package/files/accumulo-slider.py
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/package/files/accumulo-slider.py b/app-packages/accumulo/package/files/accumulo-slider.py
new file mode 100644
index 0000000..e685293
--- /dev/null
+++ b/app-packages/accumulo/package/files/accumulo-slider.py
@@ -0,0 +1,182 @@
+#!/usr/bin/python
+# 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.
+
+import os
+import sys
+import json
+import glob
+import tempfile
+import subprocess
+import shutil
+
+SLIDER_DIR = os.getenv('SLIDER_HOME', None)
+if SLIDER_DIR == None or (not os.path.exists(SLIDER_DIR)):
+ print "Unable to find SLIDER_HOME. Please configure SLIDER_HOME before running accumulo-slider"
+ sys.exit(1)
+SLIDER_CMD = os.path.join(SLIDER_DIR, 'bin', 'slider.py')
+
+CMD_OPTS = {}
+
+def call(cmd):
+ print "Running: " + " ".join(cmd)
+ retcode = subprocess.call(cmd)
+ if retcode != 0:
+ raise Exception("return code from running %s was %d" % (cmd[0], retcode))
+
+def quicklinks():
+ """Syntax: [accumulo-slider --app appname quicklinks]
+ Prints the quicklinks information of accumulo-slider registry
+ """
+ global CMD_OPTS
+ if not 'app_name' in CMD_OPTS.keys():
+ print_usage()
+ sys.exit(1)
+
+ cmd = [SLIDER_CMD, "registry", "--getconf", "quicklinks", "--format", "json",
+ "--name", CMD_OPTS['app_name']]
+
+ if 'user' in CMD_OPTS.keys():
+ cmd.append( "--user "+CMD_OPTS['user'])
+
+ call(cmd)
+
+def proxies():
+ """Syntax: [accumulo-slider --app appname proxies]
+ Prints the componentinstancedata information of accumulo-slider registry
+ """
+ global CMD_OPTS
+ if not 'app_name' in CMD_OPTS.keys():
+ print_usage()
+ sys.exit(1)
+
+ cmd = [SLIDER_CMD, "registry", "--getconf", "componentinstancedata",
+ "--format", "json", "--name", CMD_OPTS['app_name']]
+
+ if 'user' in CMD_OPTS.keys():
+ cmd.append( "--user "+CMD_OPTS['user'])
+
+ call(cmd)
+
+def get_all_conf():
+ """Syntax: [accumulo-slider --app appname --appconf confdir getconf]
+ Downloads configuration for an accumulo instance to a specified conf dir,
+ overwriting if the files already exist
+ """
+ if not 'app_conf' in CMD_OPTS.keys():
+ print_usage()
+ sys.exit(1)
+ confdir = CMD_OPTS['app_conf']
+
+ if not 'app_name' in CMD_OPTS.keys():
+ print_usage()
+ sys.exit(1)
+
+ client_file = os.path.join(confdir, 'client.conf')
+ site_file = os.path.join(confdir, 'accumulo-site.xml')
+ env_file = os.path.join(confdir, 'accumulo-env.sh')
+ env_json = os.path.join(confdir, 'accumulo-env.json')
+
+ if os.path.exists(client_file):
+ os.remove(client_file)
+ if os.path.exists(site_file):
+ os.remove(site_file)
+ if os.path.exists(env_file):
+ os.remove(env_file)
+ if os.path.exists(env_json):
+ os.remove(env_json)
+
+ get_conf("client", "properties", client_file)
+ get_conf("accumulo-site", "xml", site_file)
+ get_conf("accumulo-env", "json", env_json)
+
+ infile = open(env_json)
+ outfile = open(env_file, 'w')
+ try:
+ content = json.load(infile)
+ outfile.write(content['content'])
+ finally:
+ outfile.close()
+ infile.close()
+
+def get_conf(confname, fileformat, destfile):
+ if os.path.exists(destfile):
+ raise Exception("conf file %s was removed but still exists" % (destfile))
+
+ cmd = [SLIDER_CMD, "registry", "--getconf", confname, "--format",
+ fileformat, "--dest", destfile, "--name", CMD_OPTS['app_name']]
+ if 'user' in CMD_OPTS.keys():
+ cmd.append("--user " + CMD_OPTS['user'])
+
+ call(cmd)
+ if not os.path.exists(destfile):
+ raise Exception("Failed to read slider deployed accumulo config " + confname)
+
+def print_commands():
+ """Print all client commands and link to documentation"""
+ print "Commands:\n\t", "\n\t".join(sorted(COMMANDS.keys()))
+ print "\nHelp:", "\n\thelp", "\n\thelp <command>"
+
+def print_usage(command=None):
+ """Print one help message or list of available commands"""
+ if command != None:
+ if COMMANDS.has_key(command):
+ print (COMMANDS[command].__doc__ or
+ "No documentation provided for <%s>" % command)
+ else:
+ print "<%s> is not a valid command" % command
+ else:
+ print "Usage:"
+ print "accumulo-slider --app <name> [--user <username>] quicklinks"
+ print "accumulo-slider --app <name> [--user <username>] proxies"
+ print "accumulo-slider --app <name> --appconf <confdir> [--user <username>] getconf"
+ print_commands()
+
+def unknown_command(*args):
+ print "Unknown command: [accumulo-slider %s]" % ' '.join(sys.argv[1:])
+ print_usage()
+
+COMMANDS = {"quicklinks" : quicklinks, "proxies": proxies, "getconf": get_all_conf,
+ "help": print_usage}
+
+def parse_config_opts(args):
+ curr = args[:]
+ curr.reverse()
+ global CMD_OPTS
+ args_list = []
+ while len(curr) > 0:
+ token = curr.pop()
+ if token == "--app":
+ CMD_OPTS['app_name'] = curr.pop() if (len(curr) != 0) else None
+ elif token == "--user":
+ CMD_OPTS['user'] = curr.pop() if (len(curr) != 0) else None
+ elif token == "--appconf":
+ CMD_OPTS['app_conf'] = curr.pop() if (len(curr) != 0) else None
+ else:
+ args_list.append(token)
+ return args_list
+
+def main():
+ args = parse_config_opts(sys.argv[1:])
+ if len(args) < 1:
+ print_usage()
+ sys.exit(-1)
+ COMMAND = args[0]
+ ARGS = args[1:]
+ (COMMANDS.get(COMMAND, unknown_command))(*ARGS)
+
+if __name__ == "__main__":
+ main()
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/package/scripts/accumulo_client.py
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/package/scripts/accumulo_client.py b/app-packages/accumulo/package/scripts/accumulo_client.py
index f50addf..2da02dc 100644
--- a/app-packages/accumulo/package/scripts/accumulo_client.py
+++ b/app-packages/accumulo/package/scripts/accumulo_client.py
@@ -18,22 +18,43 @@ limitations under the License.
"""
-import sys
from resource_management import *
-from accumulo_configuration import setup_conf_dir
-
-
class AccumuloClient(Script):
def install(self, env):
+ import client_params
+ env.set_params(client_params)
self.install_packages(env)
- self.configure(env)
+ Directory(client_params.conf_dir,
+ content=format("{conf_dir}/templates"))
+ jarname = "SliderAccumuloUtils.jar"
+ File(format("{client_root}/lib/{jarname}"),
+ mode=0644,
+ content=StaticFile(jarname)
+ )
+ File(format("{bin_dir}/accumulo-slider"),
+ content=StaticFile("accumulo-slider"),
+ mode=0755
+ )
+ File(format("{bin_dir}/accumulo-slider.py"),
+ content=StaticFile("accumulo-slider.py"),
+ mode=0755
+ )
+ TemplateConfig(format("{conf_dir}/accumulo-slider-env.sh"),
+ mode=0755
+ )
+ if client_params.app_name:
+ Execute( format("{bin_dir}/accumulo-slider "
+ "--appconf {client_root}/conf --app {app_name} getconf "))
def configure(self, env):
- import params
- env.set_params(params)
+ pass
- setup_conf_dir(name='client')
+ def start(self, env):
+ pass
+
+ def stop(self, env):
+ pass
def status(self, env):
pass
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/package/scripts/client_params.py
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/package/scripts/client_params.py b/app-packages/accumulo/package/scripts/client_params.py
new file mode 100644
index 0000000..1fc5219
--- /dev/null
+++ b/app-packages/accumulo/package/scripts/client_params.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+"""
+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.
+
+"""
+
+from resource_management import *
+import os
+
+config = Script.get_config()
+
+app_install_dir = config['configurations']['global']['app_install_dir']
+client_root = config['configurations']['global']['client_root']
+bin_dir = os.path.join(client_root, 'bin')
+conf_dir = os.path.join(client_root, 'conf')
+
+app_name = None
+if 'app_name' in config['configurations']['global']:
+ app_name = config['configurations']['global']['app_name']
+
+slider_home_dir = config['configurations']['global']['slider_home_dir']
+if os.environ.has_key('SLIDER_CONF_DIR'):
+ slider_conf_dir = os.environ.get('SLIDER_CONF_DIR')
+else:
+ slider_conf_dir = os.path.join(slider_home_dir, 'conf')
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/package/templates/accumulo-slider-env.sh.j2
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/package/templates/accumulo-slider-env.sh.j2 b/app-packages/accumulo/package/templates/accumulo-slider-env.sh.j2
new file mode 100644
index 0000000..3cca1a8
--- /dev/null
+++ b/app-packages/accumulo/package/templates/accumulo-slider-env.sh.j2
@@ -0,0 +1,17 @@
+# 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.
+
+export SLIDER_HOME={{slider_home_dir}}
+export SLIDER_CONF_DIR={{slider_conf_dir}}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/pom.xml
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/pom.xml b/app-packages/accumulo/pom.xml
index c062f95..678ace5 100644
--- a/app-packages/accumulo/pom.xml
+++ b/app-packages/accumulo/pom.xml
@@ -38,7 +38,7 @@
<slider.bin.dir>../../slider-assembly/target/slider-${project.version}-all/slider-${project.version}</slider.bin.dir>
<test.app.pkg.dir>${project.build.directory}</test.app.pkg.dir>
<test.app.resources.dir>${project.build.directory}/test-config</test.app.resources.dir>
- <test.app.scripts.dir>${project.build.directory}/${app.package.name}</test.app.scripts.dir>
+ <test.client.install.dir>${project.build.directory}/${work.dir}</test.client.install.dir>
<!-- these properties are used in the default and the test appConfigs -->
<hadoop.dir>/usr/lib/hadoop</hadoop.dir>
<hdfs.dir>/usr/lib/hadoop-hdfs</hdfs.dir>
@@ -48,6 +48,8 @@
<app.java.home>${java.home}</app.java.home>
<app.user>yarn</app.user>
<app.user.group>hadoop</app.user.group>
+ <!-- default slider home for clientInstallConfig -->
+ <slider.dir>${slider.bin.dir}</slider.dir>
<!-- these are for accumulo processes -->
<accumulo.keytab />
<accumulo.principal />
@@ -65,6 +67,7 @@
<yarn.dir>/usr/hdp/current/hadoop-yarn-client</yarn.dir>
<mapred.dir>/usr/hdp/current/hadoop-mapreduce-client</mapred.dir>
<zk.dir>/usr/hdp/current/zookeeper-client</zk.dir>
+ <slider.dir>/usr/hdp/current/slider-client</slider.dir>
</properties>
</profile>
<profile>
@@ -215,7 +218,8 @@
<test.app.pkg.file>${app.package.name}.zip</test.app.pkg.file>
<test.app.pkg.name>ACCUMULO</test.app.pkg.name>
<test.app.resources.dir>${test.app.resources.dir}</test.app.resources.dir>
- <test.app.scripts.dir>${test.app.scripts.dir}</test.app.scripts.dir>
+ <test.client.install.dir>${test.client.install.dir}</test.client.install.dir>
+ <test.client.home.dir>${test.client.install.dir}/accumulo-${accumulo.version}</test.client.home.dir>
</systemPropertyVariables>
</configuration>
</plugin>
@@ -290,6 +294,12 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.apache.accumulo</groupId>
+ <artifactId>accumulo-examples-simple</artifactId>
+ <version>${accumulo.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.1</version>
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/src/assembly/accumulo.xml
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/src/assembly/accumulo.xml b/app-packages/accumulo/src/assembly/accumulo.xml
index 3bc0e1f..d63fb28 100644
--- a/app-packages/accumulo/src/assembly/accumulo.xml
+++ b/app-packages/accumulo/src/assembly/accumulo.xml
@@ -42,15 +42,15 @@
<fileMode>0755</fileMode>
</file>
<file>
- <source>metainfo.xml</source>
+ <source>clientInstallConfig-default.json</source>
<outputDirectory>/</outputDirectory>
<filtered>true</filtered>
<fileMode>0755</fileMode>
</file>
<file>
- <source>accumulo-slider</source>
+ <source>metainfo.xml</source>
<outputDirectory>/</outputDirectory>
- <filtered>false</filtered>
+ <filtered>true</filtered>
<fileMode>0755</fileMode>
</file>
<file>
@@ -78,8 +78,8 @@
<exclude>target/**</exclude>
<exclude>appConfig-default.json</exclude>
<exclude>appConfig-secured-default.json</exclude>
+ <exclude>clientInstallConfig-default.json</exclude>
<exclude>metainfo.xml</exclude>
- <exclude>accumulo-slider</exclude>
</excludes>
<fileMode>0755</fileMode>
<directoryMode>0755</directoryMode>
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloScriptIT.groovy
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloScriptIT.groovy b/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloScriptIT.groovy
index 2ba06af..4fea600 100644
--- a/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloScriptIT.groovy
+++ b/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloScriptIT.groovy
@@ -17,18 +17,25 @@
package org.apache.slider.funtest.accumulo
import groovy.util.logging.Slf4j
+import org.apache.accumulo.examples.simple.helloworld.InsertWithBatchWriter
+import org.apache.accumulo.examples.simple.helloworld.ReadData
+import org.apache.hadoop.registry.client.api.RegistryConstants
import org.apache.slider.api.ClusterDescription
import org.apache.slider.client.SliderClient
import org.apache.slider.funtest.framework.AccumuloSliderShell
+import org.apache.slider.funtest.framework.FuntestProperties
+import org.apache.slider.funtest.framework.SliderShell
import org.junit.BeforeClass
-import java.nio.ByteBuffer
-
@Slf4j
class AccumuloScriptIT extends AccumuloBasicIT {
- public static final String RESOURCES_DIR = sysprop("test.app.resources.dir")
- public static final String ACCUMULO_HOME = RESOURCES_DIR + "/install"
- public static final String ACCUMULO_CONF = sysprop("test.app.resources.dir") + "/conf"
+ public static final String CLIENT_INSTALL_DIR = sysprop("test.client.install.dir")
+ public static final String CLIENT_HOME_DIR = sysprop("test.client.home.dir")
+ public static final String CLIENT_INSTALL_CONF = sysprop("test.app.resources.dir") + "/clientInstallConfig-test.json"
+
+ public static final File ACCUMULO_SLIDER_SCRIPT = new File(CLIENT_HOME_DIR + "/bin", "accumulo-slider").canonicalFile
+ public static final File ACCUMULO_SCRIPT = new File(CLIENT_HOME_DIR + "/bin", "accumulo").canonicalFile
+ public static final File ACCUMULO_TOOL_SCRIPT = new File(CLIENT_HOME_DIR + "/bin", "tool.sh").canonicalFile
@Override
public String getClusterName() {
@@ -42,47 +49,63 @@ class AccumuloScriptIT extends AccumuloBasicIT {
@BeforeClass
public static void setShell() {
- AccumuloSliderShell.scriptFile = new File(sysprop("test.app.scripts.dir"),
- "accumulo-slider").canonicalFile
AccumuloSliderShell.setEnv("SLIDER_HOME", SLIDER_TAR_DIR)
AccumuloSliderShell.setEnv("SLIDER_CONF_DIR", SLIDER_CONF_DIR)
- AccumuloSliderShell.setEnv("ACCUMULO_HOME", ACCUMULO_HOME)
+ }
+
+ public static AccumuloSliderShell accumulo_slider(String cmd) {
+ AccumuloSliderShell.scriptFile = ACCUMULO_SLIDER_SCRIPT
+ return AccumuloSliderShell.run(0, cmd)
+ }
+
+ public static AccumuloSliderShell accumulo(String cmd) {
+ AccumuloSliderShell.scriptFile = ACCUMULO_SCRIPT
+ return AccumuloSliderShell.run(0, cmd)
+ }
+
+ public static AccumuloSliderShell tool(String cmd) {
+ AccumuloSliderShell.scriptFile = ACCUMULO_TOOL_SCRIPT
+ return AccumuloSliderShell.run(0, cmd)
}
@Override
public void clusterLoadOperations(ClusterDescription cd, SliderClient sliderClient) {
String clusterName = getClusterName()
- AccumuloSliderShell.run(0, "--app $clusterName quicklinks")
- AccumuloSliderShell.run(0, "--app $clusterName install $ACCUMULO_HOME")
- AccumuloSliderShell.run(0, "--app $clusterName --appconf $ACCUMULO_CONF getconf")
- runBoth("shell -u $USER -p $PASSWORD -e tables")
- runBoth("login-info")
- AccumuloSliderShell info = runOne("info")
+ SliderShell shell = slider(EXIT_SUCCESS,
+ [
+ ACTION_CLIENT, ARG_INSTALL,
+ ARG_PACKAGE, TEST_APP_PKG_DIR+"/"+TEST_APP_PKG_FILE,
+ ARG_DEST, CLIENT_INSTALL_DIR,
+ ARG_CONFIG, CLIENT_INSTALL_CONF
+ ])
+ logShell(shell)
+
+ accumulo_slider("--app $clusterName quicklinks")
+
+ accumulo("shell -u $USER -p $PASSWORD -e tables")
+ accumulo("login-info")
+
+ AccumuloSliderShell info = accumulo("info")
String monitor = getMonitorUrl(sliderClient, getClusterName())
assert info.outputContains(monitor.substring(monitor.indexOf("://")+3)),
"accumulo info output did not contain monitor"
- runOne("version")
- runOne("classpath")
- runOne("create-token -u $USER -p $PASSWORD -f $RESOURCES_DIR/token")
- runOne("admin checkTablets")
- runOne("admin listInstances")
- runOne("admin ping")
- runOne("admin dumpConfig -a -d $RESOURCES_DIR")
- runOne("admin volumes")
-
- // TODO: test tool, jar, classname, rfile-info
- // runOne("shell -u $USER -p $PASSWORD -e \"createtable testtable\"")
- }
+ accumulo("version")
+ accumulo("classpath")
+ accumulo("admin checkTablets")
+ accumulo("admin listInstances")
+ accumulo("admin ping")
+ accumulo("admin volumes")
- public AccumuloSliderShell runOne(String cmd) {
- return AccumuloSliderShell.run(0, "--appconf $ACCUMULO_CONF $cmd")
- }
-
- public void runBoth(String cmd) {
- String clusterName = getClusterName()
- AccumuloSliderShell.run(0, "--app $clusterName $cmd")
- AccumuloSliderShell.run(0, "--appconf $ACCUMULO_CONF $cmd")
+ String zookeepers = SLIDER_CONFIG.get(
+ RegistryConstants.KEY_REGISTRY_ZK_QUORUM,
+ FuntestProperties.DEFAULT_SLIDER_ZK_HOSTS)
+ String instance = tree.global.get("site.client.instance.name")
+ accumulo("shell -u $USER -p $PASSWORD -e \"createtable test1\"")
+ accumulo(InsertWithBatchWriter.class.getName() + " -i $instance -z " +
+ "$zookeepers -u $USER -p $PASSWORD -t test1")
+ accumulo(ReadData.class.getName() + " -i $instance -z $zookeepers -u " +
+ "$USER -p $PASSWORD -t test1 --startKey row_0 --endKey row_101")
}
}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloSliderShell.groovy
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloSliderShell.groovy b/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloSliderShell.groovy
index 09b8a39..cb7ad6b 100644
--- a/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloSliderShell.groovy
+++ b/app-packages/accumulo/src/test/groovy/org/apache/slider/funtest/accumulo/AccumuloSliderShell.groovy
@@ -18,13 +18,6 @@
package org.apache.slider.funtest.framework
-import org.apache.bigtop.itest.shell.Shell
-import org.apache.slider.core.exceptions.SliderException
-import org.apache.slider.common.tools.SliderUtils
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-
class AccumuloSliderShell extends ShellBase {
public static File scriptFile;
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/670bfb32/app-packages/accumulo/src/test/resources/clientInstallConfig-test.json
----------------------------------------------------------------------
diff --git a/app-packages/accumulo/src/test/resources/clientInstallConfig-test.json b/app-packages/accumulo/src/test/resources/clientInstallConfig-test.json
new file mode 100644
index 0000000..c8431ce
--- /dev/null
+++ b/app-packages/accumulo/src/test/resources/clientInstallConfig-test.json
@@ -0,0 +1,8 @@
+{
+ "schema":"http://example.org/specification/v2.0.0",
+ "global":{
+ "client_root": "{app_install_dir}/accumulo-${accumulo.version}",
+ "slider_home_dir": "${slider.dir}",
+ "app_name": "test_script"
+ }
+}