Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#658 #659

Merged
merged 2 commits into from
Jul 23, 2012
Merged

#658 #659

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
147 changes: 91 additions & 56 deletions hacking/test-module
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import sys
import os
import subprocess
import traceback
import optparse
import ansible.utils as utils
import ansible.module_common as module_common

Expand All @@ -38,67 +39,101 @@ try:
except ImportError:
import simplejson as json

modfile = None

if len(sys.argv) == 1:
print >>sys.stderr, "usage: test-module ./library/command [key=value ...]"
sys.exit(1)

modfile = sys.argv[1]
if len(sys.argv) > 1:
args = " ".join(sys.argv[2:])
else:
args = ""

argspath = os.path.expanduser("~/.ansible_test_module_arguments")
argsfile = open(argspath, 'w')
argsfile.write(args)
argsfile.close()

module_fh = open(modfile)
module_data = module_fh.read()
included_boilerplate = module_data.find(module_common.REPLACER) != -1
module_fh.close()

if included_boilerplate:
module_data = module_data.replace(module_common.REPLACER, module_common.MODULE_COMMON)
modfile2_path = os.path.expanduser("~/.ansible_module_generated")
print "* including generated source, if any, saving to: %s" % modfile2_path
print "* this will offset any line numbers in tracebacks!"
modfile2 = open(modfile2_path, 'w')
modfile2.write(module_data)
modfile2.close()
modfile = modfile2_path
else:
print "* module boilerplate substitution not requested in module, tracebacks will be unaltered"

os.system("chmod +x %s" % modfile)
cmd = subprocess.Popen("%s %s" % (modfile, argspath),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = cmd.communicate()

try:
print "***********************************"
print "RAW OUTPUT"
print out
print err
results = utils.parse_json(out)
def parse():
"""parse command line

:return : (options, args)"""
parser = optparse.OptionParser()

parser.usage = "%prog [options] (-h for help)"

parser.add_option('-m', '--module-path', dest='module_path',
help="path of module to execute")
parser.add_option('-a', '--args', dest='module_args', default="",
help="module arguments")
parser.add_option('-D', '--debugger', dest='debugger',
help="path to python debugger (e.g. /usr/bin/pdb)")
options, args = parser.parse_args()
if not options.module_path:
parser.print_help()
sys.exit(1)
else:
return options, args

def write_argsfile( argstring):
"""Write args to a file for the module's use.

except:
:return: full path to args file"""
argspath = os.path.expanduser("~/.ansible_test_module_arguments")
argsfile = open(argspath, 'w')
argsfile.write(argstring)
argsfile.close()
return argspath

def boilerplate_module( modfile):
module_fh = open(modfile)
module_data = module_fh.read()
included_boilerplate = module_data.find(module_common.REPLACER) != -1
module_fh.close()

if included_boilerplate:
module_data = module_data.replace(module_common.REPLACER, module_common.MODULE_COMMON)
modfile2_path = os.path.expanduser("~/.ansible_module_generated")
print "* including generated source, if any, saving to: %s" % modfile2_path
print "* this will offset any line numbers in tracebacks/debuggers!"
modfile2 = open(modfile2_path, 'w')
modfile2.write(module_data)
modfile2.close()
modfile = modfile2_path
return modfile2_path
else:
print "* module boilerplate substitution not requested in module, line numbers will be unaltered"
return modfile

def runtest( modfile, argspath):
"""Test run a module, piping it's output for reporting."""
os.system("chmod +x %s" % modfile)
cmd = subprocess.Popen("%s %s" % (modfile, argspath),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = cmd.communicate()

try:
print "***********************************"
print "RAW OUTPUT"
print out
print err
results = utils.parse_json(out)

except:
print "***********************************"
print "INVALID OUTPUT FORMAT"
print out
traceback.print_exc()
sys.exit(1)

print "***********************************"
print "INVALID OUTPUT FORMAT"
print out
traceback.print_exc()
sys.exit(1)
print "PARSED OUTPUT"

print utils.jsonify(results,format=True)

print "***********************************"
print "PARSED OUTPUT"
def rundebug(debugger, modfile, argspath):
"""Run interactively with console debugger."""
subprocess.call( "%s %s %s" % (debugger, modfile, argspath), shell=True)

print utils.jsonify(results,format=True)
def main():
options, args = parse()

sys.exit(0)
argspath = write_argsfile( options.module_args)
modfile = boilerplate_module( options.module_path)

if options.debugger:
rundebug( options.debugger, modfile, argspath)
else:
runtest( modfile, argspath)

if __name__ == "__main__":
main()