From 40caa11082e08c0ef840ca33f01e1543363ab510 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 12 Nov 2014 16:23:49 -0500 Subject: [PATCH] implemented info action for galaxy --- bin/ansible-galaxy | 72 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/bin/ansible-galaxy b/bin/ansible-galaxy index 9018e6c2059..9a73023b83b 100755 --- a/bin/ansible-galaxy +++ b/bin/ansible-galaxy @@ -135,6 +135,7 @@ An optional section for the role authors to include contact information, or a we #------------------------------------------------------------------------------------- VALID_ACTIONS = ("init", "info", "install", "list", "remove") +SKIP_INFO_KEYS = ("platforms","readme_html", "related", "summary_fields", "average_aw_composite", "average_aw_score", "url" ) def get_action(args): """ @@ -237,6 +238,7 @@ def exit_without_ignore(options, rc=1): print '- you can use --ignore-errors to skip failed roles.' sys.exit(rc) + #------------------------------------------------------------------------------------- # Galaxy API functions #------------------------------------------------------------------------------------- @@ -257,7 +259,7 @@ def api_get_config(api_server): except: return None -def api_lookup_role_by_name(api_server, role_name): +def api_lookup_role_by_name(api_server, role_name, notify=True): """ Uses the Galaxy API to do a lookup on the role owner/name. """ @@ -268,7 +270,8 @@ def api_lookup_role_by_name(api_server, role_name): parts = role_name.split(".") user_name = ".".join(parts[0:-1]) role_name = parts[-1] - print "- downloading role '%s', owned by %s" % (role_name, user_name) + if notify: + print "- downloading role '%s', owned by %s" % (role_name, user_name) except: parser.print_help() print "- invalid role name (%s). Specify role as format: username.rolename" % role_name @@ -640,7 +643,7 @@ def execute_init(args, options, parser): categories = [] if not offline: categories = api_get_list(api_server, "categories") or [] - + # group the list of platforms from the api based # on their names, with the release field being # appended to a list of versions @@ -676,7 +679,57 @@ def execute_info(args, options, parser): from the galaxy API. """ - pass + if len(args) == 0: + # the user needs to specify a role + parser.print_help() + print "- you must specify a user/role name" + sys.exit(1) + + api_server = get_opt(options, "api_server", "galaxy.ansible.com") + api_config = api_get_config(api_server) + roles_path = get_opt(options, "roles_path") + + for role in args: + + role_info = {} + + install_info = get_galaxy_install_info(role, options) + if install_info: + if 'version' in install_info: + install_info['intalled_version'] = install_info['version'] + install_info.pop('version', None) + role_info.update(install_info) + + remote_data = api_lookup_role_by_name(api_server, role, False) + if remote_data: + role_info.update(remote_data) + + metadata = get_role_metadata(role, options) + if metadata: + role_info.update(metadata) + + role_spec = ansible.utils.role_spec_parse(role) + if role_spec: + role_info.update(role_spec) + + if role_info: + print "- %s:" % (role) + import pprint + for k in sorted(role_info.keys()): + + if k in SKIP_INFO_KEYS: + continue + + if isinstance(role_info[k], dict): + print "\t%s: " % (k) + for key in sorted(role_info[k].keys()): + if key in SKIP_INFO_KEYS: + continue + print "\t\t%s: %s" % (key, role_info[k][key]) + else: + print "\t%s: %s" % (k, role_info[k]) + else: + print "- the role %s was not found" % role def execute_install(args, options, parser): """ @@ -687,23 +740,24 @@ def execute_install(args, options, parser): """ role_file = get_opt(options, "role_file", None) - api_server = get_opt(options, "api_server", "galaxy.ansible.com") - no_deps = get_opt(options, "no_deps", False) - roles_path = get_opt(options, "roles_path") - if len(args) == 0 and not role_file: + if len(args) == 0 and role_file is None: # the user needs to specify one of either --role-file # or specify a single user/role name parser.print_help() print "- you must specify a user/role name or a roles file" sys.exit() - elif len(args) == 1 and role_file: + elif len(args) == 1 and not role_file is None: # using a role file is mutually exclusive of specifying # the role name on the command line parser.print_help() print "- please specify a user/role name, or a roles file, but not both" sys.exit(1) + api_server = get_opt(options, "api_server", "galaxy.ansible.com") + no_deps = get_opt(options, "no_deps", False) + roles_path = get_opt(options, "roles_path") + roles_done = [] if role_file: f = open(role_file, 'r')