diff --git a/lib/ansible/module_utils/gcp_utils.py b/lib/ansible/module_utils/gcp_utils.py index d5a5b184a32..d3dce29ee68 100644 --- a/lib/ansible/module_utils/gcp_utils.py +++ b/lib/ansible/module_utils/gcp_utils.py @@ -299,6 +299,8 @@ class GcpRequest(object): diff = self._compare_lists(value1, value2) elif isinstance(value2, dict): diff = self._compare_dicts(value1, value2) + elif isinstance(value1, bool): + diff = self._compare_boolean(value1, value2) # Always use to_text values to avoid unicode issues. elif to_text(value1) != to_text(value2): diff = value1 @@ -308,3 +310,25 @@ class GcpRequest(object): pass return diff + + def _compare_boolean(self, value1, value2): + try: + # Both True + if value1 and isinstance(value2, bool) and value2: + return None + # Value1 True, value2 'true' + elif value1 and to_text(value2) == 'true': + return None + # Both False + elif not value1 and isinstance(value2, bool) and not value2: + return None + # Value1 False, value2 'false' + elif not value1 and to_text(value2) == 'false': + return None + else: + return value2 + + # to_text may throw UnicodeErrors. + # These errors shouldn't crash Ansible and should be hidden. + except UnicodeError: + return None diff --git a/lib/ansible/modules/cloud/google/gcp_iam_role_facts.py b/lib/ansible/modules/cloud/google/gcp_iam_role_facts.py new file mode 100644 index 00000000000..9e24ebd65d8 --- /dev/null +++ b/lib/ansible/modules/cloud/google/gcp_iam_role_facts.py @@ -0,0 +1,152 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2017 Google +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# ---------------------------------------------------------------------------- +# +# *** AUTO GENERATED CODE *** AUTO GENERATED CODE *** +# +# ---------------------------------------------------------------------------- +# +# This file is automatically generated by Magic Modules and manual +# changes will be clobbered when the file is regenerated. +# +# Please read more about how to change this file at +# https://www.github.com/GoogleCloudPlatform/magic-modules +# +# ---------------------------------------------------------------------------- + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +################################################################################ +# Documentation +################################################################################ + +ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ["preview"], 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: gcp_iam_role_facts +description: +- Gather facts for GCP Role +short_description: Gather facts for GCP Role +version_added: 2.8 +author: Google Inc. (@googlecloudplatform) +requirements: +- python >= 2.6 +- requests >= 2.18.4 +- google-auth >= 1.3.0 +options: {} +extends_documentation_fragment: gcp +''' + +EXAMPLES = ''' +- name: " a role facts" + gcp_iam_role_facts: + project: test_project + auth_kind: serviceaccount + service_account_file: "/tmp/auth.pem" + state: facts +''' + +RETURN = ''' +items: + description: List of items + returned: always + type: complex + contains: + name: + description: + - The name of the role. + returned: success + type: str + title: + description: + - A human-readable title for the role. Typically this is limited to 100 UTF-8 + bytes. + returned: success + type: str + description: + description: + - Human-readable description for the role. + returned: success + type: str + includedPermissions: + description: + - Names of permissions this role grants when bound in an IAM policy. + returned: success + type: list + stage: + description: + - The current launch stage of the role. + returned: success + type: str + deleted: + description: + - The current deleted state of the role. + returned: success + type: bool +''' + +################################################################################ +# Imports +################################################################################ +from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest +import json + +################################################################################ +# Main +################################################################################ + + +def main(): + module = GcpModule(argument_spec=dict()) + + if not module.params['scopes']: + module.params['scopes'] = ['https://www.googleapis.com/auth/iam'] + + items = fetch_list(module, collection(module)) + if items.get('roles'): + items = items.get('roles') + else: + items = [] + return_value = {'items': items} + module.exit_json(**return_value) + + +def collection(module): + return "https://iam.googleapis.com/v1/projects/{project}/roles".format(**module.params) + + +def fetch_list(module, link): + auth = GcpSession(module, 'iam') + response = auth.get(link) + return return_if_object(module, response) + + +def return_if_object(module, response): + # If not found, return nothing. + if response.status_code == 404: + return None + + # If no content, return nothing. + if response.status_code == 204: + return None + + try: + module.raise_for_status(response) + result = response.json() + except getattr(json.decoder, 'JSONDecodeError', ValueError) as inst: + module.fail_json(msg="Invalid JSON response with error: %s" % inst) + + if navigate_hash(result, ['error', 'errors']): + module.fail_json(msg=navigate_hash(result, ['error', 'errors'])) + + return result + + +if __name__ == "__main__": + main()