From 4f33ba7b39a39965de587e4c3b9132cbe621479d Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Tue, 11 Aug 2020 11:12:53 +0530 Subject: [PATCH] raw: Handle exception raised by underlying APIs (#180) kind can be provided by number of ways. It is diffcult to find all cases. So, handle exceptions raised by underlying APIs and provide good error message to user. Fixes: ansible/ansible#63652 Signed-off-by: Abhijeet Kasurde --- plugins/module_utils/raw.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/module_utils/raw.py b/plugins/module_utils/raw.py index 47c7443c..bae8f6ea 100644 --- a/plugins/module_utils/raw.py +++ b/plugins/module_utils/raw.py @@ -27,6 +27,7 @@ import traceback from ansible.module_utils.basic import missing_required_lib from ansible_collections.community.kubernetes.plugins.module_utils.common import AUTH_ARG_SPEC, COMMON_ARG_SPEC from ansible.module_utils.six import string_types +from ansible.module_utils._text import to_native from ansible_collections.community.kubernetes.plugins.module_utils.common import KubernetesAnsibleModule from ansible.module_utils.common.dict_transformations import dict_merge @@ -175,7 +176,7 @@ class KubernetesRawModule(KubernetesAnsibleModule): continue kind = definition.get('kind', self.kind) api_version = definition.get('apiVersion', self.api_version) - if kind.endswith('List'): + if kind and kind.endswith('List'): resource = self.find_resource(kind, api_version, fail=False) flattened_definitions.extend(self.flatten_list_kind(resource, definition)) else: @@ -269,6 +270,9 @@ class KubernetesRawModule(KubernetesAnsibleModule): except DynamicApiError as exc: self.fail_json(msg='Failed to retrieve requested object: {0}'.format(exc.body), error=exc.status, status=exc.status, reason=exc.reason) + except Exception as exc: + self.fail_json(msg='Failed to retrieve requested object: {0}'.format(to_native(exc)), + error='', status='', reason='') if state == 'absent': result['method'] = "delete" @@ -422,6 +426,12 @@ class KubernetesRawModule(KubernetesAnsibleModule): msg += "\n" + "\n ".join(self.warnings) error = dict(msg=msg, error=exc.status, status=exc.status, reason=exc.reason, warnings=self.warnings) return None, error + except Exception as exc: + msg = "Failed to patch object: {0}".format(exc) + if self.warnings: + msg += "\n" + "\n ".join(self.warnings) + error = dict(msg=msg, error=to_native(exc), status='', reason='', warnings=self.warnings) + return None, error def create_project_request(self, definition): definition['kind'] = 'ProjectRequest'