diff --git a/lib/ansible/module_utils/k8s/__init__.py b/lib/ansible/module_utils/k8s/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/lib/ansible/module_utils/k8s/common.py b/lib/ansible/module_utils/k8s/common.py
new file mode 100644
index 0000000000..bb8ee01210
--- /dev/null
+++ b/lib/ansible/module_utils/k8s/common.py
@@ -0,0 +1,368 @@
+#
+# Copyright 2018 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 .
+
+from __future__ import absolute_import, division, print_function
+
+import os
+import re
+import copy
+
+from ansible.module_utils.six import iteritems
+from ansible.module_utils.basic import AnsibleModule
+
+from ansible.module_utils.k8s.helper import\
+ AnsibleMixin,\
+ HAS_STRING_UTILS,\
+ COMMON_ARG_SPEC,\
+ AUTH_ARG_SPEC,\
+ OPENSHIFT_ARG_SPEC
+
+try:
+ from openshift.helper.kubernetes import KubernetesObjectHelper
+ from openshift.helper.openshift import OpenShiftObjectHelper
+ from openshift.helper.exceptions import KubernetesException
+ HAS_K8S_MODULE_HELPER = True
+except ImportError as exc:
+ class KubernetesObjectHelper(object):
+ pass
+
+ class OpenShiftObjectHelper(object):
+ pass
+
+ HAS_K8S_MODULE_HELPER = False
+
+try:
+ import yaml
+ HAS_YAML = True
+except ImportError:
+ HAS_YAML = False
+
+
+class KubernetesAnsibleModuleHelper(AnsibleMixin, KubernetesObjectHelper):
+ pass
+
+
+class KubernetesAnsibleModule(AnsibleModule):
+
+ def __init__(self):
+
+ if not HAS_K8S_MODULE_HELPER:
+ raise Exception(
+ "This module requires the OpenShift Python client. Try `pip install openshift`"
+ )
+
+ if not HAS_YAML:
+ raise Exception(
+ "This module requires PyYAML. Try `pip install PyYAML`"
+ )
+
+ if not HAS_STRING_UTILS:
+ raise Exception(
+ "This module requires Python string utils. Try `pip install python-string-utils`"
+ )
+
+ mutually_exclusive = [
+ ('resource_definition', 'src'),
+ ]
+
+ AnsibleModule.__init__(self,
+ argument_spec=self._argspec,
+ supports_check_mode=True,
+ mutually_exclusive=mutually_exclusive)
+
+ self.kind = self.params.pop('kind')
+ self.api_version = self.params.pop('api_version')
+ self.resource_definition = self.params.pop('resource_definition')
+ self.src = self.params.pop('src')
+ if self.src:
+ self.resource_definition = self.load_resource_definition(self.src)
+
+ if self.resource_definition:
+ self.api_version = self.resource_definition.get('apiVersion')
+ self.kind = self.resource_definition.get('kind')
+
+ self.api_version = self.api_version.lower()
+ self.kind = self._to_snake(self.kind)
+
+ if not self.api_version:
+ self.fail_json(
+ msg=("Error: no api_version specified. Use the api_version parameter, or provide it as part of a ",
+ "resource_definition.")
+ )
+ if not self.kind:
+ self.fail_json(
+ msg="Error: no kind specified. Use the kind parameter, or provide it as part of a resource_definition"
+ )
+
+ self.helper = self._get_helper(self.api_version, self.kind)
+
+ @property
+ def _argspec(self):
+ argspec = copy.deepcopy(COMMON_ARG_SPEC)
+ argspec.update(copy.deepcopy(AUTH_ARG_SPEC))
+ return argspec
+
+ def _get_helper(self, api_version, kind):
+ try:
+ helper = KubernetesAnsibleModuleHelper(api_version=api_version, kind=kind, debug=False)
+ helper.get_model(api_version, kind)
+ return helper
+ except KubernetesException as exc:
+ self.fail_json(msg="Error initializing module helper {0}".format(exc.message))
+
+ def execute_module(self):
+ if self.resource_definition:
+ resource_params = self.resource_to_parameters(self.resource_definition)
+ self.params.update(resource_params)
+
+ self._authenticate()
+
+ state = self.params.pop('state', None)
+ force = self.params.pop('force', False)
+ name = self.params.get('name')
+ namespace = self.params.get('namespace')
+ existing = None
+
+ self._remove_aliases()
+
+ return_attributes = dict(changed=False, result=dict())
+
+ if self._diff:
+ return_attributes['request'] = self.helper.request_body_from_params(self.params)
+
+ if self.helper.base_model_name_snake.endswith('list'):
+ k8s_obj = self._read(name, namespace)
+ return_attributes['result'] = k8s_obj.to_dict()
+ self.exit_json(**return_attributes)
+
+ try:
+ existing = self.helper.get_object(name, namespace)
+ except KubernetesException as exc:
+ self.fail_json(msg='Failed to retrieve requested object: {0}'.format(exc.message),
+ error=exc.value.get('status'))
+
+ if state == 'absent':
+ if not existing:
+ # The object already does not exist
+ self.exit_json(**return_attributes)
+ else:
+ # Delete the object
+ if not self.check_mode:
+ try:
+ self.helper.delete_object(name, namespace)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to delete object: {0}".format(exc.message),
+ error=exc.value.get('status'))
+ return_attributes['changed'] = True
+ self.exit_json(**return_attributes)
+ else:
+ if not existing:
+ k8s_obj = self._create(namespace)
+ return_attributes['result'] = k8s_obj.to_dict()
+ return_attributes['changed'] = True
+ self.exit_json(**return_attributes)
+
+ if existing and force:
+ k8s_obj = None
+ request_body = self.helper.request_body_from_params(self.params)
+ if not self.check_mode:
+ try:
+ k8s_obj = self.helper.replace_object(name, namespace, body=request_body)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to replace object: {0}".format(exc.message),
+ error=exc.value.get('status'))
+ return_attributes['result'] = k8s_obj.to_dict()
+ return_attributes['changed'] = True
+ self.exit_json(**return_attributes)
+
+ # Check if existing object should be patched
+ k8s_obj = copy.deepcopy(existing)
+ try:
+ self.helper.object_from_params(self.params, obj=k8s_obj)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to patch object: {0}".format(exc.message))
+ match, diff = self.helper.objects_match(existing, k8s_obj)
+ if match:
+ return_attributes['result'] = existing.to_dict()
+ self.exit_json(**return_attributes)
+ elif self._diff:
+ return_attributes['differences'] = diff
+ # Differences exist between the existing obj and requested params
+ if not self.check_mode:
+ try:
+ k8s_obj = self.helper.patch_object(name, namespace, k8s_obj)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to patch object: {0}".format(exc.message))
+ return_attributes['result'] = k8s_obj.to_dict()
+ return_attributes['changed'] = True
+ self.exit_json(**return_attributes)
+
+ def _authenticate(self):
+ try:
+ auth_options = {}
+ auth_args = ('host', 'api_key', 'kubeconfig', 'context', 'username', 'password',
+ 'cert_file', 'key_file', 'ssl_ca_cert', 'verify_ssl')
+ for key, value in iteritems(self.params):
+ if key in auth_args and value is not None:
+ auth_options[key] = value
+ self.helper.set_client_config(**auth_options)
+ except KubernetesException as e:
+ self.fail_json(msg='Error loading config', error=str(e))
+
+ def _remove_aliases(self):
+ """
+ The helper doesn't know what to do with aliased keys
+ """
+ for k, v in iteritems(self._argspec):
+ if 'aliases' in v:
+ for alias in v['aliases']:
+ if alias in self.params:
+ self.params.pop(alias)
+
+ def _create(self, namespace):
+ request_body = None
+ k8s_obj = None
+ try:
+ request_body = self.helper.request_body_from_params(self.params)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to create object: {0}".format(exc.message))
+ if not self.check_mode:
+ try:
+ k8s_obj = self.helper.create_object(namespace, body=request_body)
+ except KubernetesException as exc:
+ self.fail_json(msg="Failed to create object: {0}".format(exc.message),
+ 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 KubernetesException as exc:
+ self.fail_json(msg='Failed to retrieve requested object',
+ error=exc.value.get('status'))
+ return k8s_obj
+
+ def load_resource_definition(self, src):
+ """ Load the requested src path """
+ result = None
+ path = os.path.normpath(src)
+ if not os.path.exists(path):
+ self.fail_json(msg="Error accessing {0}. Does the file exist?".format(path))
+ try:
+ result = yaml.safe_load(open(path, 'r'))
+ except (IOError, yaml.YAMLError) as exc:
+ self.fail_json(msg="Error loading resource_definition: {0}".format(exc))
+ return result
+
+ def resource_to_parameters(self, resource):
+ """ Converts a resource definition to module parameters """
+ parameters = {}
+ for key, value in iteritems(resource):
+ if key in ('apiVersion', 'kind', 'status'):
+ continue
+ elif key == 'metadata' and isinstance(value, dict):
+ for meta_key, meta_value in iteritems(value):
+ if meta_key in ('name', 'namespace', 'labels', 'annotations'):
+ parameters[meta_key] = meta_value
+ elif key in self.helper.argspec and value is not None:
+ parameters[key] = value
+ elif isinstance(value, dict):
+ self._add_parameter(value, [key], parameters)
+ return parameters
+
+ def _add_parameter(self, request, path, parameters):
+ for key, value in iteritems(request):
+ if path:
+ param_name = '_'.join(path + [self._to_snake(key)])
+ else:
+ param_name = self.helper.attribute_to_snake(key)
+ if param_name in self.helper.argspec and value is not None:
+ parameters[param_name] = value
+ elif isinstance(value, dict):
+ continue_path = copy.copy(path) if path else []
+ continue_path.append(self.helper.attribute_to_snake(key))
+ self._add_parameter(value, continue_path, parameters)
+ else:
+ self.fail_json(
+ msg=("Error parsing resource definition. Encountered {0}, which does not map to a parameter "
+ "expected by the OpenShift Python module.".format(param_name))
+ )
+
+ @staticmethod
+ def _to_snake(name):
+ """
+ Convert a string from camel to snake
+ :param name: string to convert
+ :return: string
+ """
+ if not name:
+ return name
+
+ def replace(m):
+ m = m.group(0)
+ return m[0] + '_' + m[1:]
+
+ p = r'[a-z][A-Z]|' \
+ r'[A-Z]{2}[a-z]'
+ result = re.sub(p, replace, name)
+ return result.lower()
+
+
+class OpenShiftAnsibleModuleHelper(AnsibleMixin, OpenShiftObjectHelper):
+ pass
+
+
+class OpenShiftAnsibleModule(KubernetesAnsibleModule):
+ def __init__(self):
+ super(OpenShiftAnsibleModule, self).__init__()
+
+ @property
+ def _argspec(self):
+ args = super(OpenShiftAnsibleModule, self)._argspec
+ args.update(copy.deepcopy(OPENSHIFT_ARG_SPEC))
+ return args
+
+ def _get_helper(self, api_version, kind):
+ try:
+ helper = OpenShiftAnsibleModuleHelper(api_version=api_version, kind=kind, debug=False)
+ helper.get_model(api_version, kind)
+ return helper
+ except KubernetesException as exc:
+ self.exit_json(msg="Error initializing module helper {}".format(exc.message))
+
+ def _create(self, namespace):
+ if self.kind.lower() == 'project':
+ return self._create_project()
+ 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
diff --git a/lib/ansible/module_utils/k8s_common.py b/lib/ansible/module_utils/k8s/helper.py
similarity index 70%
rename from lib/ansible/module_utils/k8s_common.py
rename to lib/ansible/module_utils/k8s/helper.py
index 900238fa73..f8f6098dda 100644
--- a/lib/ansible/module_utils/k8s_common.py
+++ b/lib/ansible/module_utils/k8s/helper.py
@@ -1,5 +1,5 @@
#
-# Copyright 2017 Red Hat | Ansible
+# Copyright 2018 Red Hat | Ansible
#
# This file is part of Ansible
#
@@ -16,34 +16,20 @@
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see .
-from __future__ import absolute_import, division, print_function
-
-import os
-import re
-import copy
import base64
+import copy
+from ansible.module_utils.six import iteritems, string_types
from keyword import kwlist
-from ansible.module_utils.six import iteritems
-from ansible.module_utils.basic import AnsibleModule
-
try:
from openshift.helper import PRIMITIVES
- from openshift.helper.kubernetes import KubernetesObjectHelper
from openshift.helper.exceptions import KubernetesException
HAS_K8S_MODULE_HELPER = True
except ImportError as exc:
- class KubernetesObjectHelper(object):
- pass
HAS_K8S_MODULE_HELPER = False
-try:
- import yaml
- HAS_YAML = True
-except ImportError:
- HAS_YAML = False
-
+# TODO Remove string_utils dependency
try:
import string_utils
HAS_STRING_UTILS = True
@@ -55,7 +41,7 @@ ARG_ATTRIBUTES_BLACKLIST = ('property_path',)
PYTHON_KEYWORD_MAPPING = dict(zip(['_{0}'.format(item) for item in kwlist], kwlist))
PYTHON_KEYWORD_MAPPING.update(dict([reversed(item) for item in iteritems(PYTHON_KEYWORD_MAPPING)]))
-ARG_SPEC = {
+COMMON_ARG_SPEC = {
'state': {
'default': 'present',
'choices': ['present', 'absent'],
@@ -74,12 +60,13 @@ ARG_SPEC = {
'kind': {},
'name': {},
'namespace': {},
- 'description': {},
- 'display_name': {},
'api_version': {
'default': 'v1',
'aliases': ['api', 'version'],
},
+}
+
+AUTH_ARG_SPEC = {
'kubeconfig': {
'type': 'path',
},
@@ -106,6 +93,11 @@ ARG_SPEC = {
},
}
+OPENSHIFT_ARG_SPEC = {
+ 'description': {},
+ 'display_name': {},
+}
+
class AnsibleMixin(object):
_argspec_cache = None
@@ -118,8 +110,9 @@ class AnsibleMixin(object):
"""
if self._argspec_cache:
return self._argspec_cache
-
- argument_spec = copy.deepcopy(ARG_SPEC)
+ argument_spec = copy.deepcopy(COMMON_ARG_SPEC)
+ argument_spec.update(copy.deepcopy(AUTH_ARG_SPEC))
+ argument_spec.update(copy.deepcopy(OPENSHIFT_ARG_SPEC))
argument_spec.update(self.__transform_properties(self.properties))
self._argspec_cache = argument_spec
return self._argspec_cache
@@ -638,275 +631,3 @@ class AnsibleMixin(object):
if len(choices) > 0:
args[arg_prefix + prop]['choices'] = choices
return args
-
-
-class KubernetesAnsibleModuleHelper(AnsibleMixin, KubernetesObjectHelper):
- pass
-
-
-class KubernetesAnsibleModule(AnsibleModule):
-
- def __init__(self):
-
- if not HAS_K8S_MODULE_HELPER:
- raise Exception(
- "This module requires the OpenShift Python client. Try `pip install openshift`"
- )
-
- if not HAS_YAML:
- raise Exception(
- "This module requires PyYAML. Try `pip install PyYAML`"
- )
-
- if not HAS_STRING_UTILS:
- raise Exception(
- "This module requires Python string utils. Try `pip install python-string-utils`"
- )
-
- mutually_exclusive = [
- ('resource_definition', 'src'),
- ]
-
- AnsibleModule.__init__(self,
- argument_spec=self._argspec,
- supports_check_mode=True,
- mutually_exclusive=mutually_exclusive)
-
- self.kind = self.params.pop('kind')
- self.api_version = self.params.pop('api_version')
- self.resource_definition = self.params.pop('resource_definition')
- self.src = self.params.pop('src')
- if self.src:
- self.resource_definition = self.load_resource_definition(self.src)
-
- if self.resource_definition:
- self.api_version = self.resource_definition.get('apiVersion')
- self.kind = self.resource_definition.get('kind')
-
- self.api_version = self.api_version.lower()
- self.kind = self._to_snake(self.kind)
-
- if not self.api_version:
- self.fail_json(
- msg=("Error: no api_version specified. Use the api_version parameter, or provide it as part of a ",
- "resource_definition.")
- )
- if not self.kind:
- self.fail_json(
- msg="Error: no kind specified. Use the kind parameter, or provide it as part of a resource_definition"
- )
-
- self.helper = self._get_helper(self.api_version, self.kind)
-
- @property
- def _argspec(self):
- argspec = copy.deepcopy(ARG_SPEC)
- argspec.pop('display_name')
- argspec.pop('description')
- return argspec
-
- def _get_helper(self, api_version, kind):
- try:
- helper = KubernetesAnsibleModuleHelper(api_version=api_version, kind=kind, debug=False)
- helper.get_model(api_version, kind)
- return helper
- except KubernetesException as exc:
- self.fail_json(msg="Error initializing module helper {0}".format(exc.message))
-
- def execute_module(self):
- if self.resource_definition:
- resource_params = self.resource_to_parameters(self.resource_definition)
- self.params.update(resource_params)
-
- self._authenticate()
-
- state = self.params.pop('state', None)
- force = self.params.pop('force', False)
- name = self.params.get('name')
- namespace = self.params.get('namespace')
- existing = None
-
- self._remove_aliases()
-
- return_attributes = dict(changed=False, result=dict())
-
- if self._diff:
- return_attributes['request'] = self.helper.request_body_from_params(self.params)
-
- if self.helper.base_model_name_snake.endswith('list'):
- k8s_obj = self._read(name, namespace)
- return_attributes['result'] = k8s_obj.to_dict()
- self.exit_json(**return_attributes)
-
- try:
- existing = self.helper.get_object(name, namespace)
- except KubernetesException as exc:
- self.fail_json(msg='Failed to retrieve requested object: {0}'.format(exc.message),
- error=exc.value.get('status'))
-
- if state == 'absent':
- if not existing:
- # The object already does not exist
- self.exit_json(**return_attributes)
- else:
- # Delete the object
- if not self.check_mode:
- try:
- self.helper.delete_object(name, namespace)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to delete object: {0}".format(exc.message),
- error=exc.value.get('status'))
- return_attributes['changed'] = True
- self.exit_json(**return_attributes)
- else:
- if not existing:
- k8s_obj = self._create(namespace)
- return_attributes['result'] = k8s_obj.to_dict()
- return_attributes['changed'] = True
- self.exit_json(**return_attributes)
-
- if existing and force:
- k8s_obj = None
- request_body = self.helper.request_body_from_params(self.params)
- if not self.check_mode:
- try:
- k8s_obj = self.helper.replace_object(name, namespace, body=request_body)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to replace object: {0}".format(exc.message),
- error=exc.value.get('status'))
- return_attributes['result'] = k8s_obj.to_dict()
- return_attributes['changed'] = True
- self.exit_json(**return_attributes)
-
- # Check if existing object should be patched
- k8s_obj = copy.deepcopy(existing)
- try:
- self.helper.object_from_params(self.params, obj=k8s_obj)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to patch object: {0}".format(exc.message))
- match, diff = self.helper.objects_match(existing, k8s_obj)
- if match:
- return_attributes['result'] = existing.to_dict()
- self.exit_json(**return_attributes)
- elif self._diff:
- return_attributes['differences'] = diff
- # Differences exist between the existing obj and requested params
- if not self.check_mode:
- try:
- k8s_obj = self.helper.patch_object(name, namespace, k8s_obj)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to patch object: {0}".format(exc.message))
- return_attributes['result'] = k8s_obj.to_dict()
- return_attributes['changed'] = True
- self.exit_json(**return_attributes)
-
- def _authenticate(self):
- try:
- auth_options = {}
- auth_args = ('host', 'api_key', 'kubeconfig', 'context', 'username', 'password',
- 'cert_file', 'key_file', 'ssl_ca_cert', 'verify_ssl')
- for key, value in iteritems(self.params):
- if key in auth_args and value is not None:
- auth_options[key] = value
- self.helper.set_client_config(**auth_options)
- except KubernetesException as e:
- self.fail_json(msg='Error loading config', error=str(e))
-
- def _remove_aliases(self):
- """
- The helper doesn't know what to do with aliased keys
- """
- for k, v in iteritems(self._argspec):
- if 'aliases' in v:
- for alias in v['aliases']:
- if alias in self.params:
- self.params.pop(alias)
-
- def _create(self, namespace):
- request_body = None
- k8s_obj = None
- try:
- request_body = self.helper.request_body_from_params(self.params)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to create object: {0}".format(exc.message))
- if not self.check_mode:
- try:
- k8s_obj = self.helper.create_object(namespace, body=request_body)
- except KubernetesException as exc:
- self.fail_json(msg="Failed to create object: {0}".format(exc.message),
- 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 KubernetesException as exc:
- self.fail_json(msg='Failed to retrieve requested object',
- error=exc.value.get('status'))
- return k8s_obj
-
- def load_resource_definition(self, src):
- """ Load the requested src path """
- result = None
- path = os.path.normpath(src)
- if not os.path.exists(path):
- self.fail_json(msg="Error accessing {0}. Does the file exist?".format(path))
- try:
- result = yaml.safe_load(open(path, 'r'))
- except (IOError, yaml.YAMLError) as exc:
- self.fail_json(msg="Error loading resource_definition: {0}".format(exc))
- return result
-
- def resource_to_parameters(self, resource):
- """ Converts a resource definition to module parameters """
- parameters = {}
- for key, value in iteritems(resource):
- if key in ('apiVersion', 'kind', 'status'):
- continue
- elif key == 'metadata' and isinstance(value, dict):
- for meta_key, meta_value in iteritems(value):
- if meta_key in ('name', 'namespace', 'labels', 'annotations'):
- parameters[meta_key] = meta_value
- elif key in self.helper.argspec and value is not None:
- parameters[key] = value
- elif isinstance(value, dict):
- self._add_parameter(value, [key], parameters)
- return parameters
-
- def _add_parameter(self, request, path, parameters):
- for key, value in iteritems(request):
- if path:
- param_name = '_'.join(path + [self._to_snake(key)])
- else:
- param_name = self.helper.attribute_to_snake(key)
- if param_name in self.helper.argspec and value is not None:
- parameters[param_name] = value
- elif isinstance(value, dict):
- continue_path = copy.copy(path) if path else []
- continue_path.append(self.helper.attribute_to_snake(key))
- self._add_parameter(value, continue_path, parameters)
- else:
- self.fail_json(
- msg=("Error parsing resource definition. Encountered {0}, which does not map to a parameter "
- "expected by the OpenShift Python module.".format(param_name))
- )
-
- @staticmethod
- def _to_snake(name):
- """
- Convert a string from camel to snake
- :param name: string to convert
- :return: string
- """
- if not name:
- return name
-
- def replace(m):
- m = m.group(0)
- return m[0] + '_' + m[1:]
-
- p = r'[a-z][A-Z]|' \
- r'[A-Z]{2}[a-z]'
- result = re.sub(p, replace, name)
- return result.lower()
diff --git a/lib/ansible/module_utils/openshift_common.py b/lib/ansible/module_utils/openshift_common.py
deleted file mode 100644
index 6cccd8b40e..0000000000
--- a/lib/ansible/module_utils/openshift_common.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# Copyright 2018 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 .
-
-import copy
-
-from ansible.module_utils.k8s_common import KubernetesAnsibleModule, AnsibleMixin, ARG_SPEC
-
-try:
- from openshift.helper.openshift import OpenShiftObjectHelper
- from openshift.helper.exceptions import KubernetesException
- HAS_OPENSHIFT_HELPER = True
-except ImportError as exc:
- class OpenShiftObjectHelper(object):
- pass
- HAS_OPENSHIFT_HELPER = False
-
-
-class OpenShiftAnsibleModuleHelper(AnsibleMixin, OpenShiftObjectHelper):
- pass
-
-
-class OpenShiftAnsibleModule(KubernetesAnsibleModule):
- def __init__(self):
-
- if not HAS_OPENSHIFT_HELPER:
- raise Exception(
- "This module requires the OpenShift Python client. Try `pip install openshift`"
- )
-
- super(OpenShiftAnsibleModule, self).__init__()
-
- @property
- def _argspec(self):
- return copy.deepcopy(ARG_SPEC)
-
- def _get_helper(self, api_version, kind):
- try:
- helper = OpenShiftAnsibleModuleHelper(api_version=api_version, kind=kind, debug=False)
- helper.get_model(api_version, kind)
- return helper
- except KubernetesException as exc:
- self.exit_json(msg="Error initializing module helper {}".format(exc.message))
-
- def _create(self, namespace):
- if self.kind.lower() == 'project':
- return self._create_project()
- 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
diff --git a/lib/ansible/modules/clustering/k8s/k8s_raw.py b/lib/ansible/modules/clustering/k8s/k8s_raw.py
index d64d9fc1be..3895451101 100644
--- a/lib/ansible/modules/clustering/k8s/k8s_raw.py
+++ b/lib/ansible/modules/clustering/k8s/k8s_raw.py
@@ -136,7 +136,7 @@ diff:
type: list
'''
-from ansible.module_utils.k8s_common import KubernetesAnsibleModule
+from ansible.module_utils.k8s.common import KubernetesAnsibleModule
def main():
diff --git a/lib/ansible/modules/clustering/openshift/openshift_raw.py b/lib/ansible/modules/clustering/openshift/openshift_raw.py
index 20cbdfbbdc..9a8c2955a2 100644
--- a/lib/ansible/modules/clustering/openshift/openshift_raw.py
+++ b/lib/ansible/modules/clustering/openshift/openshift_raw.py
@@ -176,7 +176,7 @@ diff:
type: list
'''
-from ansible.module_utils.openshift_common import OpenShiftAnsibleModule
+from ansible.module_utils.k8s.common import OpenShiftAnsibleModule
def main():