diff --git a/lib/ansible/module_utils/k8s_common.py b/lib/ansible/module_utils/k8s_common.py index a36f9d44c6..c54c046870 100644 --- a/lib/ansible/module_utils/k8s_common.py +++ b/lib/ansible/module_utils/k8s_common.py @@ -23,10 +23,11 @@ import os from ansible.module_utils.basic import AnsibleModule try: - from openshift.helper.ansible import AnsibleModuleHelper, OpenShiftException, ARG_ATTRIBUTES_BLACKLIST - HAS_OPENSHIFT = True + from openshift.helper.ansible import KubernetesAnsibleModuleHelper, ARG_ATTRIBUTES_BLACKLIST + from openshift.helper.exceptions import KubernetesException + HAS_K8S_MODULE_HELPER = True except ImportError as exc: - HAS_OPENSHIFT = False + HAS_K8S_MODULE_HELPER = False try: import yaml @@ -35,31 +36,34 @@ except ImportError: HAS_YAML = False -class OpenShiftAnsibleException(Exception): +class KubernetesAnsibleException(Exception): pass -class OpenShiftAnsibleModule(AnsibleModule): +class KubernetesAnsibleModule(AnsibleModule): + @staticmethod + def get_helper(api_version, kind): + return KubernetesAnsibleModuleHelper(api_version, kind) def __init__(self, kind, api_version): self.api_version = api_version self.kind = kind self.argspec_cache = None - if not HAS_OPENSHIFT: - raise OpenShiftAnsibleException( + if not HAS_K8S_MODULE_HELPER: + raise KubernetesAnsibleException( "This module requires the OpenShift Python client. Try `pip install openshift`" ) if not HAS_YAML: - raise OpenShiftAnsibleException( + raise KubernetesAnsibleException( "This module requires PyYAML. Try `pip install PyYAML`" ) try: - self.helper = AnsibleModuleHelper(api_version, kind) + self.helper = self.get_helper(api_version, kind) except Exception as exc: - raise OpenShiftAnsibleException( + raise KubernetesAnsibleException( "Error initializing AnsibleModuleHelper: {}".format(exc) ) @@ -134,7 +138,7 @@ class OpenShiftAnsibleModule(AnsibleModule): if value.get('auth_option') and self.params.get(key) is not None: auth_options[key] = self.params[key] self.helper.set_client_config(**auth_options) - except OpenShiftException as e: + except KubernetesException as e: self.fail_json(msg='Error loading config', error=str(e)) if state is None: @@ -156,7 +160,7 @@ class OpenShiftAnsibleModule(AnsibleModule): # CRUD modules try: existing = self.helper.get_object(name, namespace) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg='Failed to retrieve requested object: {}'.format(exc.message), error=exc.value.get('status')) @@ -169,18 +173,14 @@ class OpenShiftAnsibleModule(AnsibleModule): if not self.check_mode: try: self.helper.delete_object(name, namespace) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to delete object: {}".format(exc.message), error=exc.value.get('status')) return_attributes['changed'] = True self.exit_json(**return_attributes) else: if not existing: - # create new object - if self.kind.lower() == 'project': - k8s_obj = self._create_project() - else: - k8s_obj = self._create(namespace) + k8s_obj = self._create(namespace) return_attributes[self.kind] = k8s_obj.to_dict() return_attributes['changed'] = True self.exit_json(**return_attributes) @@ -191,7 +191,7 @@ class OpenShiftAnsibleModule(AnsibleModule): if not self.check_mode: try: k8s_obj = self.helper.replace_object(name, namespace, body=request_body) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to replace object: {}".format(exc.message), error=exc.value.get('status')) return_attributes[self.kind] = k8s_obj.to_dict() @@ -202,7 +202,7 @@ class OpenShiftAnsibleModule(AnsibleModule): k8s_obj = copy.deepcopy(existing) try: self.helper.object_from_params(self.params, obj=k8s_obj) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to patch object: {}".format(exc.message)) match, diff = self.helper.objects_match(existing, k8s_obj) if match: @@ -217,7 +217,7 @@ class OpenShiftAnsibleModule(AnsibleModule): if not self.check_mode: try: k8s_obj = self.helper.patch_object(name, namespace, k8s_obj) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to patch object: {}".format(exc.message)) return_attributes[self.kind] = k8s_obj.to_dict() return_attributes['changed'] = True @@ -228,37 +228,21 @@ class OpenShiftAnsibleModule(AnsibleModule): k8s_obj = None try: request_body = self.helper.request_body_from_params(self.params) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to create object: {}".format(exc.message)) if not self.check_mode: try: k8s_obj = self.helper.create_object(namespace, body=request_body) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg="Failed to create object: {}".format(exc.message), error=exc.value.get('status')) return k8s_obj - def _create_project(self): - new_obj = None - k8s_obj = None - try: - new_obj = self.helper.object_from_params(self.params) - except OpenShiftException as exc: - self.fail_json(msg="Failed to create object: {}".format(exc.message)) - try: - k8s_obj = self.helper.create_project(metadata=new_obj.metadata, - display_name=self.params.get('display_name'), - description=self.params.get('description')) - except OpenShiftException as exc: - self.fail_json(msg='Failed to retrieve requested object', - error=exc.value.get('status')) - return k8s_obj - def _read(self, name, namespace): k8s_obj = None try: k8s_obj = self.helper.get_object(name, namespace) - except OpenShiftException as exc: + except KubernetesException as exc: self.fail_json(msg='Failed to retrieve requested object', error=exc.value.get('status')) return k8s_obj diff --git a/lib/ansible/module_utils/openshift_common.py b/lib/ansible/module_utils/openshift_common.py new file mode 100644 index 0000000000..7b20f2b586 --- /dev/null +++ b/lib/ansible/module_utils/openshift_common.py @@ -0,0 +1,69 @@ +# +# Copyright 2017 Red Hat | Ansible +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see <http://www.gnu.org/licenses/>. + +from ansible.module_utils.k8s_common import KubernetesAnsibleException, KubernetesAnsibleModule + +try: + from openshift.helper.ansible import OpenShiftAnsibleModuleHelper, ARG_ATTRIBUTES_BLACKLIST + from openshift.helper.exceptions import KubernetesException, OpenShiftException + HAS_OPENSHIFT_HELPER = True +except ImportError as exc: + HAS_OPENSHIFT_HELPER = False + + +class OpenShiftAnsibleException(KubernetesAnsibleException): + pass + + +class OpenShiftAnsibleModule(KubernetesAnsibleModule): + def __init__(self, kind, api_version): + if not HAS_OPENSHIFT_HELPER: + raise OpenShiftAnsibleException( + "This module requires the OpenShift Python client. Try `pip install openshift`" + ) + + try: + super(OpenShiftAnsibleModule, self).__init__(kind, api_version) + except KubernetesAnsibleException as exc: + raise OpenShiftAnsibleException(exc.args) + + @staticmethod + def get_helper(api_version, kind): + return OpenShiftAnsibleModuleHelper(api_version, kind) + + def _create(self, namespace): + if self.kind.lower() == 'project': + return self._create_project() + else: + return super(OpenShiftAnsibleModule, self)._create(namespace) + + def _create_project(self): + new_obj = None + k8s_obj = None + try: + new_obj = self.helper.object_from_params(self.params) + except KubernetesException as exc: + self.fail_json(msg="Failed to create object: {}".format(exc.message)) + try: + k8s_obj = self.helper.create_project(metadata=new_obj.metadata, + display_name=self.params.get('display_name'), + description=self.params.get('description')) + except KubernetesException as exc: + self.fail_json(msg='Failed to retrieve requested object', + error=exc.value.get('status')) + return k8s_obj