From f94eabffa117dec3477b5fe73a4c55bd3102f89f Mon Sep 17 00:00:00 2001 From: Bikouo Aubin <79859644+abikouo@users.noreply.github.com> Date: Fri, 3 Feb 2023 07:57:24 +0100 Subject: [PATCH] update collection with latest feature from kubernetes.core (#181) * Rebase code with kubernetes.core stable-2.4 --- README.md | 8 + galaxy.yml | 2 +- molecule/default/files/setup-crd.yml | 42 +++- .../openshift_adm_prune_auth_clusterroles.yml | 1 - .../tasks/openshift_adm_prune_auth_roles.yml | 2 +- .../default/tasks/openshift_prune_images.yml | 13 -- molecule/default/tasks/validate_installed.yml | 1 - .../default/tasks/validate_not_installed.yml | 2 +- plugins/inventory/openshift.py | 16 +- plugins/module_utils/k8s.py | 136 ++++++++----- .../module_utils/openshift_adm_prune_auth.py | 36 +--- .../openshift_adm_prune_deployments.py | 35 +--- .../openshift_adm_prune_images.py | 48 +---- plugins/module_utils/openshift_builds.py | 190 ++++++++---------- plugins/module_utils/openshift_common.py | 93 +++++++++ plugins/module_utils/openshift_groups.py | 33 +-- .../module_utils/openshift_images_common.py | 70 +++---- .../module_utils/openshift_import_image.py | 34 +--- plugins/module_utils/openshift_process.py | 86 ++++---- plugins/module_utils/openshift_registry.py | 39 +--- plugins/modules/k8s.py | 18 +- plugins/modules/openshift_adm_groups_sync.py | 10 +- ...penshift_adm_migrate_template_instances.py | 56 ++---- plugins/modules/openshift_adm_prune_auth.py | 11 +- plugins/modules/openshift_adm_prune_builds.py | 18 +- .../openshift_adm_prune_deployments.py | 6 +- plugins/modules/openshift_adm_prune_images.py | 10 +- plugins/modules/openshift_build.py | 22 +- plugins/modules/openshift_import_image.py | 16 +- plugins/modules/openshift_process.py | 14 +- plugins/modules/openshift_registry_info.py | 16 +- plugins/modules/openshift_route.py | 70 +++---- tests/config.yml | 2 + tests/sanity/ignore-2.11.txt | 5 +- tests/sanity/ignore-2.12.txt | 152 +------------- tests/sanity/ignore-2.13.txt | 102 +--------- tests/sanity/ignore-2.14.txt | 102 +--------- tests/sanity/ignore-2.15.txt | 102 +--------- 38 files changed, 516 insertions(+), 1103 deletions(-) create mode 100644 plugins/module_utils/openshift_common.py create mode 100644 tests/config.yml diff --git a/README.md b/README.md index ca0e68d..af8eb8d 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,14 @@ A collection may contain metadata that identifies these versions. PEP440 is the schema used to describe the versions of Ansible. +## Python Support + +* Collection supports 3.6+ + +## Kubernetes Version Support + +This collection supports Kubernetes versions >=1.19. + ## Included content Click on the name of a plugin or module to view that content's documentation: diff --git a/galaxy.yml b/galaxy.yml index 53e9220..886ca83 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -5,7 +5,7 @@ authors: - willthames (https://github.com/willthames) - Akasurde (https://github.com/akasurde) dependencies: - kubernetes.core: '>=2.1.0,<2.4.0' + kubernetes.core: '>=2.4.0' description: OKD Collection for Ansible. documentation: '' homepage: '' diff --git a/molecule/default/files/setup-crd.yml b/molecule/default/files/setup-crd.yml index 9c01bc1..15debdb 100644 --- a/molecule/default/files/setup-crd.yml +++ b/molecule/default/files/setup-crd.yml @@ -1,11 +1,49 @@ --- -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: certificates.certmanager.k8s.io + annotations: + "api-approved.kubernetes.io": "https://github.com/kubernetes/kubernetes/pull/78458" spec: group: certmanager.k8s.io - version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + properties: + certificate: + type: string + secretName: + type: string + dnsNames: + type: array + items: + type: string + acme: + type: object + properties: + config: + type: array + items: + type: object + properties: + ingressClass: + type: string + domains: + type: array + items: + type: string + issuerRef: + type: object + properties: + name: + type: string + kind: + type: string scope: Namespaced names: kind: Certificate diff --git a/molecule/default/tasks/openshift_adm_prune_auth_clusterroles.yml b/molecule/default/tasks/openshift_adm_prune_auth_clusterroles.yml index c67701b..4de4894 100644 --- a/molecule/default/tasks/openshift_adm_prune_auth_clusterroles.yml +++ b/molecule/default/tasks/openshift_adm_prune_auth_clusterroles.yml @@ -295,7 +295,6 @@ state: absent kind: Namespace name: "{{ test_ns }}" - wait: yes ignore_errors: true - name: Delete ClusterRoleBinding diff --git a/molecule/default/tasks/openshift_adm_prune_auth_roles.yml b/molecule/default/tasks/openshift_adm_prune_auth_roles.yml index 3c9988d..1724a19 100644 --- a/molecule/default/tasks/openshift_adm_prune_auth_roles.yml +++ b/molecule/default/tasks/openshift_adm_prune_auth_roles.yml @@ -96,7 +96,7 @@ kubernetes.core.k8s: definition: kind: Role - apiVersion: rbac.authorization.k8s.io/v1beta1 + apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: "{{ test_ns }}" name: "{{ item.name }}" diff --git a/molecule/default/tasks/openshift_prune_images.yml b/molecule/default/tasks/openshift_prune_images.yml index e8519db..86630da 100644 --- a/molecule/default/tasks/openshift_prune_images.yml +++ b/molecule/default/tasks/openshift_prune_images.yml @@ -204,25 +204,12 @@ - stream.resources | length == 1 - '"tags" not in stream.resources.0.status' - - name: Validate that Image was deleted - kubernetes.core.k8s_info: - version: image.openshift.io/v1 - kind: Image - name: "{{ is_image_name }}" - register: image - - - name: Assert that image was deleted - assert: - that: - - image.resources | length == 0 - always: - name: Delete namespace community.okd.k8s: name: "{{ prune_ns }}" kind: Namespace state: absent - wait: yes ignore_errors: true when: diff --git a/molecule/default/tasks/validate_installed.yml b/molecule/default/tasks/validate_installed.yml index daf82e6..4508efd 100644 --- a/molecule/default/tasks/validate_installed.yml +++ b/molecule/default/tasks/validate_installed.yml @@ -97,7 +97,6 @@ assert: that: - unknown_kind is successful - - "'warnings' in unknown_kind" always: - name: remove custom resource diff --git a/molecule/default/tasks/validate_not_installed.yml b/molecule/default/tasks/validate_not_installed.yml index 44bee7b..a64607c 100644 --- a/molecule/default/tasks/validate_not_installed.yml +++ b/molecule/default/tasks/validate_not_installed.yml @@ -22,4 +22,4 @@ assert: that: - k8s_no_validate is failed - - "k8s_no_validate.msg == 'kubernetes-validate python library is required to validate resources'" + - k8s_no_validate.msg.startswith('Failed to import the required Python library (kubernetes-validate)') diff --git a/plugins/inventory/openshift.py b/plugins/inventory/openshift.py index 5fbfbee..f69c652 100644 --- a/plugins/inventory/openshift.py +++ b/plugins/inventory/openshift.py @@ -112,8 +112,13 @@ connections: context: 'awx/192-168-64-4:8443/developer' ''' -from ansible_collections.kubernetes.core.plugins.inventory.k8s import K8sInventoryException, InventoryModule as K8sInventoryModule, format_dynamic_api_exc -from ansible_collections.kubernetes.core.plugins.module_utils.common import get_api_client +try: + from ansible_collections.kubernetes.core.plugins.inventory.k8s import K8sInventoryException, InventoryModule as K8sInventoryModule, format_dynamic_api_exc + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import get_api_client + HAS_KUBERNETES_COLLECTION = True +except ImportError as e: + HAS_KUBERNETES_COLLECTION = False + try: from kubernetes.dynamic.exceptions import DynamicApiError @@ -127,7 +132,13 @@ class InventoryModule(K8sInventoryModule): connection_plugin = 'community.okd.oc' transport = 'oc' + def check_kubernetes_collection(self): + + if not HAS_KUBERNETES_COLLECTION: + K8sInventoryException("The kubernetes.core collection must be installed") + def fetch_objects(self, connections): + self.check_kubernetes_collection() super(InventoryModule, self).fetch_objects(connections) if connections: @@ -151,6 +162,7 @@ class InventoryModule(K8sInventoryModule): self.get_routes_for_namespace(client, name, namespace) def get_routes_for_namespace(self, client, name, namespace): + self.check_kubernetes_collection() v1_route = client.resources.get(api_version='route.openshift.io/v1', kind='Route') try: obj = v1_route.get(namespace=namespace) diff --git a/plugins/module_utils/k8s.py b/plugins/module_utils/k8s.py index df7c01f..87ec70d 100644 --- a/plugins/module_utils/k8s.py +++ b/plugins/module_utils/k8s.py @@ -6,79 +6,113 @@ __metaclass__ = type import re import operator from functools import reduce -import traceback -from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, -) -from ansible.module_utils._text import to_native +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule +try: + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.resource import create_definitions + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import CoreException +except ImportError: + pass + +from ansible.module_utils._text import to_native try: from kubernetes.dynamic.exceptions import DynamicApiError, NotFoundError, ForbiddenError - HAS_KUBERNETES_COLLECTION = True except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() + pass TRIGGER_ANNOTATION = 'image.openshift.io/triggers' TRIGGER_CONTAINER = re.compile(r"(?P.*)\[((?P[0-9]+)|\?\(@\.name==[\"'\\]*(?P[a-z0-9]([-a-z0-9]*[a-z0-9])?))") -class OKDRawModule(K8sAnsibleMixin): +class OKDRawModule(AnsibleOpenshiftModule): - def __init__(self, module, k8s_kind=None, *args, **kwargs): - self.module = module - self.client = get_api_client(module=module) - self.check_mode = self.module.check_mode - self.params = self.module.params - self.fail_json = self.module.fail_json - self.fail = self.module.fail_json - self.exit_json = self.module.exit_json + def __init__(self, **kwargs): - super(OKDRawModule, self).__init__(module, *args, **kwargs) + super(OKDRawModule, self).__init__(**kwargs) - self.warnings = [] + @property + def module(self): + return self._module - self.kind = k8s_kind or self.params.get('kind') - self.api_version = self.params.get('api_version') - self.name = self.params.get('name') - self.namespace = self.params.get('namespace') + def execute_module(self): + results = [] + changed = False - self.check_library_version() - self.set_resource_definitions(module) + try: + definitions = create_definitions(self.params) + except Exception as e: + msg = "Failed to load resource definition: {0}".format(e) + raise CoreException(msg) from e - def perform_action(self, resource, definition): - state = self.params.get('state', None) - name = definition['metadata'].get('name') - namespace = definition['metadata'].get('namespace') + for definition in definitions: + result = {"changed": False, "result": {}} + warnings = [] - if state != 'absent': + if self.params.get("state") != 'absent': + existing = None + name = definition.get("metadata", {}).get("name") + namespace = definition.get("metadata", {}).get("namespace") + if definition.get("kind") in ['Project', 'ProjectRequest']: + try: + resource = self.svc.find_resource(kind=definition.get("kind"), api_version=definition.get("apiVersion", "v1")) + existing = resource.get(name=name, namespace=namespace).to_dict() + except (NotFoundError, ForbiddenError): + result = self.create_project_request(definition) + changed |= result["changed"] + results.append(result) + continue + 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) - if resource.kind in ['Project', 'ProjectRequest']: - try: - resource.get(name, namespace) - except (NotFoundError, ForbiddenError): - return self.create_project_request(definition) - 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) + if definition.get("kind") not in ['Project', 'ProjectRequest']: + try: + resource = self.svc.find_resource(kind=definition.get("kind"), api_version=definition.get("apiVersion", "v1")) + existing = resource.get(name=name, namespace=namespace).to_dict() + except Exception: + existing = None + + if existing: + if resource.kind == 'DeploymentConfig': + if definition.get('spec', {}).get('triggers'): + definition = self.resolve_imagestream_triggers(existing, definition) + elif existing['metadata'].get('annotations', {}).get(TRIGGER_ANNOTATION): + definition = self.resolve_imagestream_trigger_annotation(existing, definition) + + if self.params.get("validate") is not None: + warnings = self.validate(definition) try: - existing = resource.get(name=name, namespace=namespace).to_dict() - except Exception: - existing = None + result = self.perform_action(definition, self.params) + except Exception as e: + try: + error = e.result + except AttributeError: + error = {} + try: + error["reason"] = e.__cause__.reason + except AttributeError: + pass + error["msg"] = to_native(e) + if warnings: + error.setdefault("warnings", []).extend(warnings) - if existing: - if resource.kind == 'DeploymentConfig': - if definition.get('spec', {}).get('triggers'): - definition = self.resolve_imagestream_triggers(existing, definition) - elif existing['metadata'].get('annotations', {}).get(TRIGGER_ANNOTATION): - definition = self.resolve_imagestream_trigger_annotation(existing, definition) + if self.params.get("continue_on_error"): + result["error"] = error + else: + self.fail_json(**error) - return super(OKDRawModule, self).perform_action(resource, definition) + if warnings: + result.setdefault("warnings", []).extend(warnings) + changed |= result["changed"] + results.append(result) + + if len(results) == 1: + self.exit_json(**results[0]) + + self.exit_json(**{"changed": changed, "result": {"results": results}}) @staticmethod def get_index(desired, objects, keys): @@ -173,7 +207,7 @@ class OKDRawModule(K8sAnsibleMixin): def create_project_request(self, definition): definition['kind'] = 'ProjectRequest' result = {'changed': False, 'result': {}} - resource = self.find_resource('ProjectRequest', definition['apiVersion'], fail=True) + resource = self.svc.find_resource(kind='ProjectRequest', api_version=definition['apiVersion'], fail=True) if not self.check_mode: try: k8s_obj = resource.create(definition) diff --git a/plugins/module_utils/openshift_adm_prune_auth.py b/plugins/module_utils/openshift_adm_prune_auth.py index 584a2cb..e5143ae 100644 --- a/plugins/module_utils/openshift_adm_prune_auth.py +++ b/plugins/module_utils/openshift_adm_prune_auth.py @@ -3,22 +3,9 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -import traceback - from ansible.module_utils._text import to_native -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: from kubernetes import client @@ -27,24 +14,9 @@ except ImportError: pass -class OpenShiftAdmPruneAuth(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftAdmPruneAuth, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) +class OpenShiftAdmPruneAuth(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftAdmPruneAuth, self).__init__(**kwargs) def prune_resource_binding(self, kind, api_version, ref_kind, ref_namespace_names, propagation_policy=None): diff --git a/plugins/module_utils/openshift_adm_prune_deployments.py b/plugins/module_utils/openshift_adm_prune_deployments.py index e127985..418922d 100644 --- a/plugins/module_utils/openshift_adm_prune_deployments.py +++ b/plugins/module_utils/openshift_adm_prune_deployments.py @@ -8,18 +8,7 @@ import traceback from ansible.module_utils._text import to_native -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: from kubernetes import client @@ -42,24 +31,10 @@ def get_deploymentconfig_for_replicationcontroller(replica_controller): return None -class OpenShiftAdmPruneDeployment(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json +class OpenShiftAdmPruneDeployment(AnsibleOpenshiftModule): - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftAdmPruneDeployment, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) + def __init__(self, **kwargs): + super(OpenShiftAdmPruneDeployment, self).__init__(**kwargs) def filter_replication_controller(self, replicacontrollers): def _deployment(obj): @@ -109,7 +84,7 @@ class OpenShiftAdmPruneDeployment(K8sAnsibleMixin): results = filter(pred, results) return list(results) - def execute(self): + def execute_module(self): # list replicationcontroller candidate for pruning kind = 'ReplicationController' api_version = 'v1' diff --git a/plugins/module_utils/openshift_adm_prune_images.py b/plugins/module_utils/openshift_adm_prune_images.py index f280486..442cf90 100644 --- a/plugins/module_utils/openshift_adm_prune_images.py +++ b/plugins/module_utils/openshift_adm_prune_images.py @@ -11,18 +11,7 @@ from ansible.module_utils._text import to_native from ansible.module_utils.parsing.convert_bool import boolean from ansible.module_utils.six import iteritems -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule from ansible_collections.community.okd.plugins.module_utils.openshift_images_common import ( OpenShiftAnalyzeImageStream, @@ -102,36 +91,9 @@ def determine_host_registry(module, images, image_streams): return result['hostname'] -class OpenShiftAdmPruneImages(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftAdmPruneImages, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - try: - self.client = get_api_client(self.module) - except DynamicApiError as e: - self.fail_json( - msg="Failed to get kubernetes client.", - reason=e.reason, - status=e.status, - ) - except Exception as e: - self.fail_json( - msg="Failed to get kubernetes client.", - error=to_native(e) - ) +class OpenShiftAdmPruneImages(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftAdmPruneImages, self).__init__(**kwargs) self.max_creation_timestamp = self.get_max_creation_timestamp() self._rest_client = None @@ -239,7 +201,7 @@ class OpenShiftAdmPruneImages(K8sAnsibleMixin): result = definition if not self.check_mode: try: - result = self.client.request( + result = self.request( "PUT", "/apis/{api_version}/namespaces/{namespace}/imagestreams/{name}/status".format( api_version=api_version, diff --git a/plugins/module_utils/openshift_builds.py b/plugins/module_utils/openshift_builds.py index 741d3c0..02e60fd 100644 --- a/plugins/module_utils/openshift_builds.py +++ b/plugins/module_utils/openshift_builds.py @@ -9,18 +9,7 @@ import time from ansible.module_utils._text import to_native -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: from kubernetes.dynamic.exceptions import DynamicApiError @@ -28,24 +17,9 @@ except ImportError as e: pass -class OpenShiftBuilds(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftBuilds, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) +class OpenShiftBuilds(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftBuilds, self).__init__(**kwargs) def get_build_config(self, name, namespace): params = dict( @@ -57,78 +31,9 @@ class OpenShiftBuilds(K8sAnsibleMixin): result = self.kubernetes_facts(**params) return result["resources"] - def prune(self): - # list replicationcontroller candidate for pruning - kind = 'Build' - api_version = 'build.openshift.io/v1' - resource = self.find_resource(kind=kind, api_version=api_version, fail=True) - - self.max_creation_timestamp = None - keep_younger_than = self.params.get("keep_younger_than") - if keep_younger_than: - now = datetime.now(timezone.utc).replace(tzinfo=None) - self.max_creation_timestamp = now - timedelta(minutes=keep_younger_than) - - def _prunable_build(build): - return build["status"]["phase"] in ("Complete", "Failed", "Error", "Cancelled") - - def _orphan_build(build): - if not _prunable_build(build): - return False - - config = build["status"].get("config", None) - if not config: - return True - build_config = self.get_build_config(config["name"], config["namespace"]) - return len(build_config) == 0 - - def _younger_build(build): - if not self.max_creation_timestamp: - return False - creation_timestamp = datetime.strptime(build['metadata']['creationTimestamp'], '%Y-%m-%dT%H:%M:%SZ') - return creation_timestamp < self.max_creation_timestamp - - predicates = [ - _prunable_build, - ] - if self.params.get("orphans"): - predicates.append(_orphan_build) - if self.max_creation_timestamp: - predicates.append(_younger_build) - - # Get ReplicationController - params = dict( - kind=kind, - api_version=api_version, - namespace=self.params.get("namespace"), - ) - result = self.kubernetes_facts(**params) - candidates = result["resources"] - for pred in predicates: - candidates = list(filter(pred, candidates)) - - if self.check_mode: - changed = len(candidates) > 0 - self.exit_json(changed=changed, builds=candidates) - - changed = False - for build in candidates: - changed = True - try: - name = build["metadata"]["name"] - namespace = build["metadata"]["namespace"] - resource.delete(name=name, namespace=namespace, body={}) - except DynamicApiError as exc: - msg = "Failed to delete Build %s/%s due to: %s" % (namespace, name, exc.body) - self.fail_json(msg=msg, status=exc.status, reason=exc.reason) - except Exception as e: - msg = "Failed to delete Build %s/%s due to: %s" % (namespace, name, to_native(e)) - self.fail_json(msg=msg, error=to_native(e), exception=e) - self.exit_json(changed=changed, builds=candidates) - def clone_build(self, name, namespace, request): try: - result = self.client.request( + result = self.request( method="POST", path="/apis/build.openshift.io/v1/namespaces/{namespace}/builds/{name}/clone".format( namespace=namespace, @@ -147,7 +52,7 @@ class OpenShiftBuilds(K8sAnsibleMixin): def instantiate_build_config(self, name, namespace, request): try: - result = self.client.request( + result = self.request( method="POST", path="/apis/build.openshift.io/v1/namespaces/{namespace}/buildconfigs/{name}/instantiate".format( namespace=namespace, @@ -300,8 +205,9 @@ class OpenShiftBuilds(K8sAnsibleMixin): namespace = self.params.get("namespace") phases = ["new", "pending", "running"] - if len(self.params.get("build_phases")): - phases = [p.lower() for p in self.params.get("build_phases")] + build_phases = self.params.get("build_phases", []) + if build_phases: + phases = [p.lower() for p in build_phases] names = [] if self.params.get("build_name"): @@ -318,7 +224,7 @@ class OpenShiftBuilds(K8sAnsibleMixin): def _filter_builds(build): config = build["metadata"].get("labels", {}).get("openshift.io/build-config.name") - return config in build_config + return build_config is None or (build_config is not None and config in build_config) for item in list(filter(_filter_builds, resources)): name = item["metadata"]["name"] @@ -361,7 +267,7 @@ class OpenShiftBuilds(K8sAnsibleMixin): changed = True try: content_type = "application/json" - cancelled_build = self.client.request( + cancelled_build = self.request( "PUT", "/apis/build.openshift.io/v1/namespaces/{0}/builds/{1}".format( namespace, name @@ -427,3 +333,77 @@ class OpenShiftBuilds(K8sAnsibleMixin): else: restart = bool(state == "restarted") self.cancel_build(restart=restart) + + +class OpenShiftPruneBuilds(OpenShiftBuilds): + def __init__(self, **kwargs): + super(OpenShiftPruneBuilds, self).__init__(**kwargs) + + def execute_module(self): + # list replicationcontroller candidate for pruning + kind = 'Build' + api_version = 'build.openshift.io/v1' + resource = self.find_resource(kind=kind, api_version=api_version, fail=True) + + self.max_creation_timestamp = None + keep_younger_than = self.params.get("keep_younger_than") + if keep_younger_than: + now = datetime.now(timezone.utc).replace(tzinfo=None) + self.max_creation_timestamp = now - timedelta(minutes=keep_younger_than) + + def _prunable_build(build): + return build["status"]["phase"] in ("Complete", "Failed", "Error", "Cancelled") + + def _orphan_build(build): + if not _prunable_build(build): + return False + + config = build["status"].get("config", None) + if not config: + return True + build_config = self.get_build_config(config["name"], config["namespace"]) + return len(build_config) == 0 + + def _younger_build(build): + if not self.max_creation_timestamp: + return False + creation_timestamp = datetime.strptime(build['metadata']['creationTimestamp'], '%Y-%m-%dT%H:%M:%SZ') + return creation_timestamp < self.max_creation_timestamp + + predicates = [ + _prunable_build, + ] + if self.params.get("orphans"): + predicates.append(_orphan_build) + if self.max_creation_timestamp: + predicates.append(_younger_build) + + # Get ReplicationController + params = dict( + kind=kind, + api_version=api_version, + namespace=self.params.get("namespace"), + ) + result = self.kubernetes_facts(**params) + candidates = result["resources"] + for pred in predicates: + candidates = list(filter(pred, candidates)) + + if self.check_mode: + changed = len(candidates) > 0 + self.exit_json(changed=changed, builds=candidates) + + changed = False + for build in candidates: + changed = True + try: + name = build["metadata"]["name"] + namespace = build["metadata"]["namespace"] + resource.delete(name=name, namespace=namespace, body={}) + except DynamicApiError as exc: + msg = "Failed to delete Build %s/%s due to: %s" % (namespace, name, exc.body) + self.fail_json(msg=msg, status=exc.status, reason=exc.reason) + except Exception as e: + msg = "Failed to delete Build %s/%s due to: %s" % (namespace, name, to_native(e)) + self.fail_json(msg=msg, error=to_native(e), exception=e) + self.exit_json(changed=changed, builds=candidates) diff --git a/plugins/module_utils/openshift_common.py b/plugins/module_utils/openshift_common.py new file mode 100644 index 0000000..a1318f9 --- /dev/null +++ b/plugins/module_utils/openshift_common.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import traceback +from abc import abstractmethod + +from ansible.module_utils._text import to_native + +try: + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import get_api_client + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import AnsibleK8SModule + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import ( + K8sService, + diff_objects, + ) + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.runner import ( + perform_action, + validate, + ) + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.resource import ( + create_definitions, + merge_params, + flatten_list_kind, + ) + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import CoreException + HAS_KUBERNETES_COLLECTION = True + k8s_collection_import_exception = None + K8S_COLLECTION_ERROR = None +except ImportError as e: + HAS_KUBERNETES_COLLECTION = False + k8s_collection_import_exception = e + K8S_COLLECTION_ERROR = traceback.format_exc() + + +class AnsibleOpenshiftModule(AnsibleK8SModule): + + def __init__(self, **kwargs): + super(AnsibleOpenshiftModule, self).__init__(**kwargs) + + self.client = get_api_client(module=self) + self.fail = self.fail_json + + self.svc = K8sService(self.client, self._module) + self.find_resource = self.svc.find_resource + self.kubernetes_facts = self.svc.find + + if not HAS_KUBERNETES_COLLECTION: + self.fail_json( + msg="The kubernetes.core collection must be installed", + exception=K8S_COLLECTION_ERROR, + error=to_native(k8s_collection_import_exception), + ) + + @property + def module(self): + return self._module + + @abstractmethod + def execute_module(self): + pass + + def request(self, *args, **kwargs): + return self.client.client.request(*args, **kwargs) + + def set_resource_definitions(self): + self.resource_definitions = create_definitions(self.params) + + def perform_action(self, definition, params): + return perform_action(self.svc, definition, params) + + def validate(self, definition): + validate(self.client, self, definition) + + @staticmethod + def merge_params(definition, params): + return merge_params(definition, params) + + @staticmethod + def flatten_list_kind(definition, params): + return flatten_list_kind(definition, params) + + @staticmethod + def diff_objects(existing, new): + return diff_objects(existing, new) + + def run_module(self): + + try: + self.execute_module() + except CoreException as e: + self.fail_from_exception(e) diff --git a/plugins/module_utils/openshift_groups.py b/plugins/module_utils/openshift_groups.py index 2840258..5d1aaad 100644 --- a/plugins/module_utils/openshift_groups.py +++ b/plugins/module_utils/openshift_groups.py @@ -10,7 +10,6 @@ __metaclass__ = type import traceback from datetime import datetime -from ansible_collections.kubernetes.core.plugins.module_utils.common import (K8sAnsibleMixin, get_api_client) from ansible.module_utils.parsing.convert_bool import boolean from ansible.module_utils._text import to_native from ansible.module_utils.basic import missing_required_lib @@ -31,18 +30,7 @@ except ImportError as e: HAS_PYTHON_LDAP = False PYTHON_LDAP_ERROR = e -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: from kubernetes.dynamic.exceptions import DynamicApiError @@ -264,13 +252,11 @@ class OpenshiftLDAPGroups(object): return result -class OpenshiftGroupsSync(K8sAnsibleMixin): +class OpenshiftGroupsSync(AnsibleOpenshiftModule): - def __init__(self, module): + def __init__(self, **kwargs): - self.module = module - self.params = self.module.params - self.check_mode = self.module.check_mode + super(OpenshiftGroupsSync, self).__init__(**kwargs) self.__k8s_group_api = None self.__ldap_connection = None self.host = None @@ -279,22 +265,11 @@ class OpenshiftGroupsSync(K8sAnsibleMixin): self.scheme = None self.config = self.params.get("sync_config") - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - if not HAS_PYTHON_LDAP: self.fail_json( msg=missing_required_lib('python-ldap'), error=to_native(PYTHON_LDAP_ERROR) ) - super(OpenshiftGroupsSync, self).__init__(self.module) - - self.client = get_api_client(self.module) - @property def k8s_group_api(self): if not self.__k8s_group_api: diff --git a/plugins/module_utils/openshift_images_common.py b/plugins/module_utils/openshift_images_common.py index df21f5a..67d7123 100644 --- a/plugins/module_utils/openshift_images_common.py +++ b/plugins/module_utils/openshift_images_common.py @@ -11,7 +11,7 @@ from ansible.module_utils.six import iteritems def get_image_blobs(image): - blobs = [layer["image"] for layer in image["dockerImageLayers"]] + blobs = [layer["image"] for layer in image["dockerImageLayers"] if "image" in layer] docker_image_metadata = image.get("dockerImageMetadata") if not docker_image_metadata: return blobs, "failed to read metadata for image %s" % image["metadata"]["name"] @@ -53,7 +53,7 @@ class OpenShiftAnalyzeImageStream(object): if error: return error - if len(result['hostname']) == 0 or len(result['namespace']) == 0: + if not result['hostname'] or not result['namespace']: # image reference does not match hostname/namespace/name pattern - skipping return None @@ -161,41 +161,35 @@ class OpenShiftAnalyzeImageStream(object): return name, tag, None from_strategy = _determine_source_strategy() - if not from_strategy: - # Build strategy not found - return - - if from_strategy.get('kind') == "DockerImage": - docker_image_ref = from_strategy.get('name').strip() - if len(docker_image_ref) > 0: - err = self.analyze_reference_image(docker_image_ref, referrer) - - elif from_strategy.get('kind') == "ImageStreamImage": - name, tag, error = _parse_image_stream_image_name(from_strategy.get('name')) - if error: - if not self.ignore_invalid_refs: - return error - else: - namespace = from_strategy.get('namespace') or namespace - self.used_images.append({ - 'namespace': namespace, - 'name': name, - 'tag': tag - }) - elif from_strategy.get('kind') == "ImageStreamTag": - name, tag, error = _parse_image_stream_tag_name(from_strategy.get('name')) - if error: - if not self.ignore_invalid_refs: - return error - else: - namespace = from_strategy.get('namespace') or namespace - self.used_tags.append({ - 'namespace': namespace, - 'name': name, - 'tag': tag - }) - - return None + if from_strategy: + if from_strategy.get('kind') == "DockerImage": + docker_image_ref = from_strategy.get('name').strip() + if len(docker_image_ref) > 0: + err = self.analyze_reference_image(docker_image_ref, referrer) + elif from_strategy.get('kind') == "ImageStreamImage": + name, tag, error = _parse_image_stream_image_name(from_strategy.get('name')) + if error: + if not self.ignore_invalid_refs: + return error + else: + namespace = from_strategy.get('namespace') or namespace + self.used_images.append({ + 'namespace': namespace, + 'name': name, + 'tag': tag + }) + elif from_strategy.get('kind') == "ImageStreamTag": + name, tag, error = _parse_image_stream_tag_name(from_strategy.get('name')) + if error: + if not self.ignore_invalid_refs: + return error + else: + namespace = from_strategy.get('namespace') or namespace + self.used_tags.append({ + 'namespace': namespace, + 'name': name, + 'tag': tag + }) def analyze_refs_from_build_strategy(self, resources): # Json Path is always spec.strategy @@ -212,7 +206,7 @@ class OpenShiftAnalyzeImageStream(object): error = self.analyze_refs_from_strategy(obj['spec']['strategy'], obj['metadata']['namespace'], referrer) - if not error: + if error is not None: return "%s/%s/%s: %s" % (referrer["kind"], referrer["namespace"], referrer["name"], error) def analyze_image_stream(self, resources): diff --git a/plugins/module_utils/openshift_import_image.py b/plugins/module_utils/openshift_import_image.py index 9256fe2..01bba82 100644 --- a/plugins/module_utils/openshift_import_image.py +++ b/plugins/module_utils/openshift_import_image.py @@ -10,18 +10,7 @@ from ansible.module_utils._text import to_native from ansible.module_utils.parsing.convert_bool import boolean from ansible.module_utils.six import string_types -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: from kubernetes.dynamic.exceptions import DynamicApiError @@ -86,24 +75,9 @@ def follow_imagestream_tag_reference(stream, tag): multiple = True -class OpenShiftImportImage(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftImportImage, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) +class OpenShiftImportImage(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftImportImage, self).__init__(**kwargs) self._rest_client = None self.registryhost = self.params.get('registry_url') diff --git a/plugins/module_utils/openshift_process.py b/plugins/module_utils/openshift_process.py index 8e675d5..6fa69d1 100644 --- a/plugins/module_utils/openshift_process.py +++ b/plugins/module_utils/openshift_process.py @@ -6,47 +6,20 @@ __metaclass__ = type import os import traceback -from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, -) from ansible.module_utils._text import to_native -try: - from kubernetes.dynamic.exceptions import DynamicApiError, NotFoundError - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule try: - from kubernetes.dynamic.exceptions import DynamicApiError, NotFoundError + from kubernetes.dynamic.exceptions import DynamicApiError except ImportError: pass -class OpenShiftProcess(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftProcess, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) +class OpenShiftProcess(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftProcess, self).__init__(**kwargs) def execute_module(self): v1_templates = self.find_resource( @@ -76,7 +49,7 @@ class OpenShiftProcess(K8sAnsibleMixin): template = None if src or definition: - self.set_resource_definitions(self.module) + self.set_resource_definitions() if len(self.resource_definitions) < 1: self.fail_json( "Unable to load a Template resource from src or resource_definition" @@ -101,7 +74,7 @@ class OpenShiftProcess(K8sAnsibleMixin): reason=exc.reason, ) except Exception as exc: - self.module.fail_json( + self.fail_json( msg="Failed to retrieve Template with name '{0}' in namespace '{1}': {2}".format( name, namespace, to_native(exc) ), @@ -134,7 +107,7 @@ class OpenShiftProcess(K8sAnsibleMixin): reason=exc.reason, ) except Exception as exc: - self.module.fail_json( + self.fail_json( msg="Server failed to render the Template: {0}".format(to_native(exc)), error="", status="", @@ -146,16 +119,41 @@ class OpenShiftProcess(K8sAnsibleMixin): result["resources"] = response["objects"] if state != "rendered": - self.resource_definitions = response["objects"] - self.kind = self.api_version = self.name = None - self.namespace = self.params.get("namespace_target") - self.append_hash = False - self.apply = False - self.params["validate"] = None - self.params["merge_type"] = None - super(OpenShiftProcess, self).execute_module() + self.create_resources(response["objects"]) - self.module.exit_json(**result) + self.exit_json(**result) + + def create_resources(self, definitions): + + params = {"namespace": self.params.get("namespace_target")} + + self.params["apply"] = False + self.params["validate"] = None + + changed = False + results = [] + + flattened_definitions = [] + for definition in definitions: + if definition is None: + continue + kind = definition.get("kind") + if kind and kind.endswith("List"): + flattened_definitions.extend( + self.flatten_list_kind(definition, params) + ) + else: + flattened_definitions.append(self.merge_params(definition, params)) + + for definition in flattened_definitions: + result = self.perform_action(definition, self.params) + changed = changed or result["changed"] + results.append(result) + + if len(results) == 1: + self.exit_json(**results[0]) + + self.exit_json(**{"changed": changed, "result": {"results": results}}) def update_template_param(self, template, k, v): for i, param in enumerate(template["parameters"]): diff --git a/plugins/module_utils/openshift_registry.py b/plugins/module_utils/openshift_registry.py index caa3137..32a1830 100644 --- a/plugins/module_utils/openshift_registry.py +++ b/plugins/module_utils/openshift_registry.py @@ -6,20 +6,7 @@ __metaclass__ = type import traceback from urllib.parse import urlparse -from ansible.module_utils._text import to_native - -try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, - ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule from ansible_collections.community.okd.plugins.module_utils.openshift_docker_image import ( parse_docker_image_ref, @@ -36,25 +23,9 @@ except ImportError as e: REQUESTS_MODULE_ERROR = traceback.format_exc() -class OpenShiftRegistry(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftRegistry, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) - +class OpenShiftRegistry(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftRegistry, self).__init__(**kwargs) self.check = self.params.get("check") def list_image_streams(self, namespace=None): @@ -103,7 +74,7 @@ class OpenShiftRegistry(K8sAnsibleMixin): self.fail_json(msg="No Image Streams could be located to retrieve registry info.") - def info(self): + def execute_module(self): result = {} result["internal_hostname"], result["public_hostname"] = self.find_registry_info() diff --git a/plugins/modules/k8s.py b/plugins/modules/k8s.py index a6e0d0a..c3b8d1b 100644 --- a/plugins/modules/k8s.py +++ b/plugins/modules/k8s.py @@ -260,13 +260,9 @@ result: ''' # ENDREMOVE (downstream) -try: - from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import AnsibleModule -except ImportError: - from ansible.module_utils.basic import AnsibleModule - from ansible_collections.kubernetes.core.plugins.module_utils.args_common import ( - NAME_ARG_SPEC, RESOURCE_ARG_SPEC, AUTH_ARG_SPEC, WAIT_ARG_SPEC, DELETE_OPTS_ARG_SPEC) + NAME_ARG_SPEC, RESOURCE_ARG_SPEC, AUTH_ARG_SPEC, WAIT_ARG_SPEC, DELETE_OPTS_ARG_SPEC +) def validate_spec(): @@ -303,15 +299,9 @@ def main(): ('template', 'src'), ] - module = AnsibleModule(argument_spec=argspec(), supports_check_mode=True, mutually_exclusive=mutually_exclusive) - from ansible_collections.community.okd.plugins.module_utils.k8s import OKDRawModule - okdraw_module = OKDRawModule(module) - - # remove_aliases from kubernetes.core's common requires the argspec attribute. Ideally, it should - # read that throught the module class, but we cannot change that. - okdraw_module.argspec = argspec() - okdraw_module.execute_module() + module = OKDRawModule(argument_spec=argspec(), supports_check_mode=True, mutually_exclusive=mutually_exclusive) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_adm_groups_sync.py b/plugins/modules/openshift_adm_groups_sync.py index 0685f33..66b0fbb 100644 --- a/plugins/modules/openshift_adm_groups_sync.py +++ b/plugins/modules/openshift_adm_groups_sync.py @@ -194,7 +194,6 @@ builds: import copy import traceback -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC @@ -213,17 +212,12 @@ def argument_spec(): def main(): - module = AnsibleModule(argument_spec=argument_spec(), supports_check_mode=True) - from ansible_collections.community.okd.plugins.module_utils.openshift_groups import ( OpenshiftGroupsSync ) - try: - openshift_groups = OpenshiftGroupsSync(module) - openshift_groups.execute_module() - except Exception as e: - module.fail_json(msg=str(e), exception=traceback.format_exc()) + module = OpenshiftGroupsSync(argument_spec=argument_spec(), supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_adm_migrate_template_instances.py b/plugins/modules/openshift_adm_migrate_template_instances.py index 195db5e..05d5563 100644 --- a/plugins/modules/openshift_adm_migrate_template_instances.py +++ b/plugins/modules/openshift_adm_migrate_template_instances.py @@ -233,33 +233,20 @@ result: """ # ENDREMOVE (downstream) -import traceback - from ansible.module_utils._text import to_native +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule + try: from kubernetes.dynamic.exceptions import DynamicApiError +except ImportError: + pass - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None -except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() - -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import ( AUTH_ARG_SPEC, WAIT_ARG_SPEC, ) -from ansible_collections.kubernetes.core.plugins.module_utils.common import ( - K8sAnsibleMixin, - get_api_client, -) - - transforms = { "Build": "build.openshift.io/v1", "BuildConfig": "build.openshift.io/v1", @@ -268,24 +255,9 @@ transforms = { } -class OpenShiftMigrateTemplateInstances(K8sAnsibleMixin): - def __init__(self, module): - self.module = module - self.fail_json = self.module.fail_json - self.exit_json = self.module.exit_json - - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception), - ) - - super(OpenShiftMigrateTemplateInstances, self).__init__(self.module) - - self.params = self.module.params - self.check_mode = self.module.check_mode - self.client = get_api_client(self.module) +class OpenShiftMigrateTemplateInstances(AnsibleOpenshiftModule): + def __init__(self, **kwargs): + super(OpenShiftMigrateTemplateInstances, self).__init__(**kwargs) def patch_template_instance(self, resource, templateinstance): result = None @@ -293,7 +265,7 @@ class OpenShiftMigrateTemplateInstances(K8sAnsibleMixin): try: result = resource.status.patch(templateinstance) except Exception as exc: - self.module.fail_json( + self.fail_json( msg="Failed to migrate TemplateInstance {0} due to: {1}".format( templateinstance["metadata"]["name"], to_native(exc) ) @@ -351,7 +323,7 @@ class OpenShiftMigrateTemplateInstances(K8sAnsibleMixin): reason=exc.reason, ) except Exception as exc: - self.module.fail_json( + self.fail_json( msg="Failed to retrieve TemplateInstances in namespace '{0}': {1}".format( namespace, to_native(exc) ), @@ -367,7 +339,7 @@ class OpenShiftMigrateTemplateInstances(K8sAnsibleMixin): if ti_to_be_migrated: if self.check_mode: - self.module.exit_json( + self.exit_json( **{"changed": True, "result": ti_to_be_migrated} ) else: @@ -377,7 +349,7 @@ class OpenShiftMigrateTemplateInstances(K8sAnsibleMixin): ) results["changed"] = True - self.module.exit_json(**results) + self.exit_json(**results) def argspec(): @@ -391,10 +363,8 @@ def argspec(): def main(): argument_spec = argspec() - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - openshift_process = OpenShiftMigrateTemplateInstances(module) - openshift_process.argspec = argument_spec - openshift_process.execute_module() + module = OpenShiftMigrateTemplateInstances(argument_spec=argument_spec, supports_check_mode=True) + module.run_module() if __name__ == "__main__": diff --git a/plugins/modules/openshift_adm_prune_auth.py b/plugins/modules/openshift_adm_prune_auth.py index 7abd098..a9833fa 100644 --- a/plugins/modules/openshift_adm_prune_auth.py +++ b/plugins/modules/openshift_adm_prune_auth.py @@ -101,7 +101,6 @@ group: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC @@ -119,16 +118,14 @@ def argument_spec(): def main(): - module = AnsibleModule(argument_spec=argument_spec(), - mutually_exclusive=[("name", "label_selectors")], - supports_check_mode=True) from ansible_collections.community.okd.plugins.module_utils.openshift_adm_prune_auth import ( OpenShiftAdmPruneAuth) - adm_prune_auth = OpenShiftAdmPruneAuth(module) - adm_prune_auth.argspec = argument_spec - adm_prune_auth.execute_module() + module = OpenShiftAdmPruneAuth(argument_spec=argument_spec(), + mutually_exclusive=[("name", "label_selectors")], + supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_adm_prune_builds.py b/plugins/modules/openshift_adm_prune_builds.py index 9b0b3fb..b0b831e 100644 --- a/plugins/modules/openshift_adm_prune_builds.py +++ b/plugins/modules/openshift_adm_prune_builds.py @@ -97,9 +97,7 @@ builds: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC -from ansible.module_utils._text import to_native def argument_spec(): @@ -115,21 +113,11 @@ def argument_spec(): def main(): - module = AnsibleModule(argument_spec=argument_spec(), supports_check_mode=True) - try: - from ansible_collections.community.okd.plugins.module_utils.openshift_builds import ( - OpenShiftBuilds) + from ansible_collections.community.okd.plugins.module_utils.openshift_builds import OpenShiftPruneBuilds - build = OpenShiftBuilds(module) - build.argspec = argument_spec - build.prune() - except Exception as e: - module.fail_json( - msg="An error occurred while running openshift_adm_prune_builds", - error=to_native(e), - exception=e, - ) + module = OpenShiftPruneBuilds(argument_spec=argument_spec(), supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_adm_prune_deployments.py b/plugins/modules/openshift_adm_prune_deployments.py index 424531f..bdef184 100644 --- a/plugins/modules/openshift_adm_prune_deployments.py +++ b/plugins/modules/openshift_adm_prune_deployments.py @@ -69,7 +69,6 @@ replication_controllers: import copy -from ansible.module_utils.basic import AnsibleModule try: from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC except ImportError as e: @@ -89,13 +88,12 @@ def argument_spec(): def main(): - module = AnsibleModule(argument_spec=argument_spec(), supports_check_mode=True) from ansible_collections.community.okd.plugins.module_utils.openshift_adm_prune_deployments import ( OpenShiftAdmPruneDeployment) - adm_prune_deployments = OpenShiftAdmPruneDeployment(module) - adm_prune_deployments.execute() + module = OpenShiftAdmPruneDeployment(argument_spec=argument_spec(), supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_adm_prune_images.py b/plugins/modules/openshift_adm_prune_images.py index c8cf1a1..d470fa8 100644 --- a/plugins/modules/openshift_adm_prune_images.py +++ b/plugins/modules/openshift_adm_prune_images.py @@ -280,7 +280,6 @@ deleted_images: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC @@ -303,14 +302,13 @@ def argument_spec(): def main(): - module = AnsibleModule(argument_spec=argument_spec(), supports_check_mode=True) from ansible_collections.community.okd.plugins.module_utils.openshift_adm_prune_images import ( - OpenShiftAdmPruneImages) + OpenShiftAdmPruneImages + ) - adm_prune_images = OpenShiftAdmPruneImages(module) - adm_prune_images.argspec = argument_spec() - adm_prune_images.execute_module() + module = OpenShiftAdmPruneImages(argument_spec=argument_spec(), supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_build.py b/plugins/modules/openshift_build.py index 2e84153..1259a10 100644 --- a/plugins/modules/openshift_build.py +++ b/plugins/modules/openshift_build.py @@ -205,9 +205,7 @@ builds: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC -from ansible.module_utils._text import to_native def argument_spec(): @@ -242,7 +240,10 @@ def main(): mutually_exclusive = [ ('build_name', 'build_config_name'), ] - module = AnsibleModule( + from ansible_collections.community.okd.plugins.module_utils.openshift_builds import ( + OpenShiftBuilds + ) + module = OpenShiftBuilds( argument_spec=argument_spec(), mutually_exclusive=mutually_exclusive, required_one_of=[ @@ -252,20 +253,7 @@ def main(): ] ], ) - - try: - from ansible_collections.community.okd.plugins.module_utils.openshift_builds import ( - OpenShiftBuilds) - - build = OpenShiftBuilds(module) - build.argspec = argument_spec - build.execute_module() - except Exception as e: - module.fail_json( - msg="An error occurred while running openshift_start_build module.", - error=to_native(e), - exception=e, - ) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_import_image.py b/plugins/modules/openshift_import_image.py index 10a6b22..df0588c 100644 --- a/plugins/modules/openshift_import_image.py +++ b/plugins/modules/openshift_import_image.py @@ -158,7 +158,6 @@ result: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC @@ -179,17 +178,16 @@ def argument_spec(): def main(): - module = AnsibleModule( + + from ansible_collections.community.okd.plugins.module_utils.openshift_import_image import ( + OpenShiftImportImage + ) + + module = OpenShiftImportImage( argument_spec=argument_spec(), supports_check_mode=True ) - - from ansible_collections.community.okd.plugins.module_utils.openshift_import_image import ( - OpenShiftImportImage) - - import_image = OpenShiftImportImage(module) - import_image.argspec = argument_spec() - import_image.execute_module() + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_process.py b/plugins/modules/openshift_process.py index 791a3de..fb00ffb 100644 --- a/plugins/modules/openshift_process.py +++ b/plugins/modules/openshift_process.py @@ -203,11 +203,6 @@ resources: ''' # ENDREMOVE (downstream) -try: - from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import AnsibleModule -except ImportError: - from ansible.module_utils.basic import AnsibleModule - from ansible_collections.kubernetes.core.plugins.module_utils.args_common import ( AUTH_ARG_SPEC, RESOURCE_ARG_SPEC, WAIT_ARG_SPEC ) @@ -229,17 +224,12 @@ def argspec(): def main(): - argument_spec = argspec() - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) from ansible_collections.community.okd.plugins.module_utils.openshift_process import ( OpenShiftProcess) - openshift_process = OpenShiftProcess(module) - # remove_aliases from kubernetes.core's common requires the argspec attribute. Ideally, it should - # read that throught the module class, but we cannot change that. - openshift_process.argspec = argument_spec - openshift_process.execute_module() + module = OpenShiftProcess(argument_spec=argspec(), supports_check_mode=True) + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_registry_info.py b/plugins/modules/openshift_registry_info.py index ede0e4a..a455ac5 100644 --- a/plugins/modules/openshift_registry_info.py +++ b/plugins/modules/openshift_registry_info.py @@ -84,7 +84,6 @@ check: import copy -from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.args_common import AUTH_ARG_SPEC @@ -99,17 +98,16 @@ def argument_spec(): def main(): - module = AnsibleModule( + + from ansible_collections.community.okd.plugins.module_utils.openshift_registry import ( + OpenShiftRegistry + ) + + module = OpenShiftRegistry( argument_spec=argument_spec(), supports_check_mode=True ) - - from ansible_collections.community.okd.plugins.module_utils.openshift_registry import ( - OpenShiftRegistry) - - registry = OpenShiftRegistry(module) - registry.argspec = argument_spec() - registry.info() + module.run_module() if __name__ == '__main__': diff --git a/plugins/modules/openshift_route.py b/plugins/modules/openshift_route.py index 6201c73..e452fc5 100644 --- a/plugins/modules/openshift_route.py +++ b/plugins/modules/openshift_route.py @@ -307,27 +307,19 @@ duration: # ENDREMOVE (downstream) import copy -import traceback -try: - from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import AnsibleModule -except ImportError: - from ansible.module_utils.basic import AnsibleModule from ansible.module_utils._text import to_native +from ansible_collections.community.okd.plugins.module_utils.openshift_common import AnsibleOpenshiftModule + try: - from ansible_collections.kubernetes.core.plugins.module_utils.common import K8sAnsibleMixin, get_api_client + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.runner import perform_action + from ansible_collections.kubernetes.core.plugins.module_utils.k8s.waiter import Waiter from ansible_collections.kubernetes.core.plugins.module_utils.args_common import ( AUTH_ARG_SPEC, WAIT_ARG_SPEC, COMMON_ARG_SPEC ) - HAS_KUBERNETES_COLLECTION = True - k8s_collection_import_exception = None - K8S_COLLECTION_ERROR = None except ImportError as e: - HAS_KUBERNETES_COLLECTION = False - k8s_collection_import_exception = e - K8S_COLLECTION_ERROR = traceback.format_exc() - K8sAnsibleMixin = object + pass AUTH_ARG_SPEC = WAIT_ARG_SPEC = COMMON_ARG_SPEC = {} try: @@ -336,33 +328,18 @@ except ImportError: pass -class OpenShiftRoute(K8sAnsibleMixin): +class OpenShiftRoute(AnsibleOpenshiftModule): def __init__(self): - self.module = AnsibleModule( + super(OpenShiftRoute, self).__init__( argument_spec=self.argspec, supports_check_mode=True, ) - self.fail_json = self.module.fail_json - if not HAS_KUBERNETES_COLLECTION: - self.module.fail_json( - msg="The kubernetes.core collection must be installed", - exception=K8S_COLLECTION_ERROR, - error=to_native(k8s_collection_import_exception) - ) - - super(OpenShiftRoute, self).__init__(self.module) - - self.params = self.module.params - # TODO: should probably make it so that at least some of these aren't required for perform_action to work - # Or at least explicitly pass them in self.append_hash = False self.apply = False - self.check_mode = self.module.check_mode self.warnings = [] self.params['merge_type'] = None - self.client = get_api_client(self.module) @property def argspec(self): @@ -391,7 +368,6 @@ class OpenShiftRoute(K8sAnsibleMixin): return spec def execute_module(self): - v1_routes = self.find_resource('Route', 'route.openshift.io/v1', fail=True) service_name = self.params.get('service') namespace = self.params['namespace'] @@ -457,13 +433,15 @@ class OpenShiftRoute(K8sAnsibleMixin): tls_dest_ca_cert=tls_dest_ca_cert, ) - result = self.perform_action(v1_routes, route) + result = perform_action(self.svc, route, self.params) timeout = self.params.get('wait_timeout') sleep = self.params.get('wait_sleep') if custom_wait: - success, result['result'], result['duration'] = self._wait_for(v1_routes, route_name, namespace, wait_predicate, sleep, timeout, state) + v1_routes = self.find_resource('Route', 'route.openshift.io/v1', fail=True) + waiter = Waiter(self.client, v1_routes, wait_predicate) + success, result['result'], result['duration'] = waiter.wait(timeout=timeout, sleep=sleep, name=route_name, namespace=namespace) - self.module.exit_json(**result) + self.exit_json(**result) def build_route_spec(self, service_name, namespace, port=None, wildcard_policy=None, hostname=None, path=None, termination_type=None, tls_insecure_policy=None, tls_ca_cert=None, tls_cert=None, tls_key=None, tls_dest_ca_cert=None): @@ -472,14 +450,14 @@ class OpenShiftRoute(K8sAnsibleMixin): target_service = v1_services.get(name=service_name, namespace=namespace) except NotFoundError: if not port: - self.module.fail_json(msg="You need to provide the 'port' argument when exposing a non-existent service") + self.fail_json(msg="You need to provide the 'port' argument when exposing a non-existent service") target_service = None except DynamicApiError as exc: - self.module.fail_json(msg='Failed to retrieve service to be exposed: {0}'.format(exc.body), - error=exc.status, status=exc.status, reason=exc.reason) + self.fail_json(msg='Failed to retrieve service to be exposed: {0}'.format(exc.body), + error=exc.status, status=exc.status, reason=exc.reason) except Exception as exc: - self.module.fail_json(msg='Failed to retrieve service to be exposed: {0}'.format(to_native(exc)), - error='', status='', reason='') + self.fail_json(msg='Failed to retrieve service to be exposed: {0}'.format(to_native(exc)), + error='', status='', reason='') route_spec = { 'tls': {}, @@ -501,27 +479,27 @@ class OpenShiftRoute(K8sAnsibleMixin): route_spec['tls']['insecureEdgeTerminationPolicy'] = tls_insecure_policy.capitalize() elif termination_type == 'passthrough': if tls_insecure_policy != 'redirect': - self.module.fail_json("'redirect' is the only supported insecureEdgeTerminationPolicy for passthrough routes") + self.fail_json("'redirect' is the only supported insecureEdgeTerminationPolicy for passthrough routes") route_spec['tls']['insecureEdgeTerminationPolicy'] = tls_insecure_policy.capitalize() elif termination_type == 'reencrypt': - self.module.fail_json("'tls.insecure_policy' is not supported with reencrypt routes") + self.fail_json("'tls.insecure_policy' is not supported with reencrypt routes") else: route_spec['tls']['insecureEdgeTerminationPolicy'] = None if tls_ca_cert: if termination_type == 'passthrough': - self.module.fail_json("'tls.ca_certificate' is not supported with passthrough routes") + self.fail_json("'tls.ca_certificate' is not supported with passthrough routes") route_spec['tls']['caCertificate'] = tls_ca_cert if tls_cert: if termination_type == 'passthrough': - self.module.fail_json("'tls.certificate' is not supported with passthrough routes") + self.fail_json("'tls.certificate' is not supported with passthrough routes") route_spec['tls']['certificate'] = tls_cert if tls_key: if termination_type == 'passthrough': - self.module.fail_json("'tls.key' is not supported with passthrough routes") + self.fail_json("'tls.key' is not supported with passthrough routes") route_spec['tls']['key'] = tls_key if tls_dest_ca_cert: if termination_type != 'reencrypt': - self.module.fail_json("'destination_certificate' is only valid for reencrypt routes") + self.fail_json("'destination_certificate' is only valid for reencrypt routes") route_spec['tls']['destinationCACertificate'] = tls_dest_ca_cert else: route_spec['tls'] = None @@ -557,7 +535,7 @@ def wait_predicate(route): def main(): - OpenShiftRoute().execute_module() + OpenShiftRoute().run_module() if __name__ == '__main__': diff --git a/tests/config.yml b/tests/config.yml new file mode 100644 index 0000000..9e402bd --- /dev/null +++ b/tests/config.yml @@ -0,0 +1,2 @@ +modules: + python_requires: ">=3.6" diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index d022fb6..0ade1e2 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -163,4 +163,7 @@ plugins/modules/openshift_adm_prune_builds.py import-2.7!skip plugins/modules/openshift_adm_prune_builds.py import-3.5!skip plugins/modules/openshift_adm_prune_builds.py compile-2.6!skip plugins/modules/openshift_adm_prune_builds.py compile-2.7!skip -plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip \ No newline at end of file +plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip +plugins/module_utils/openshift_common.py import-2.6!skip +plugins/module_utils/openshift_common.py import-2.7!skip +plugins/module_utils/openshift_common.py import-3.5!skip \ No newline at end of file diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index 674e8af..2fd2bdc 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -1,153 +1,3 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s.py validate-modules:return-syntax-error -plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc -plugins/modules/openshift_route.py import-2.6!skip -plugins/modules/openshift_route.py import-2.7!skip -plugins/modules/openshift_route.py import-3.5!skip -plugins/modules/openshift_route.py compile-2.6!skip -plugins/modules/openshift_route.py compile-2.7!skip -plugins/modules/openshift_route.py compile-3.5!skip -plugins/modules/k8s.py import-2.6!skip -plugins/modules/k8s.py import-2.7!skip -plugins/modules/k8s.py import-3.5!skip -plugins/modules/k8s.py compile-2.6!skip -plugins/modules/k8s.py compile-2.7!skip -plugins/modules/k8s.py compile-3.5!skip -plugins/modules/openshift_process.py import-2.6!skip -plugins/modules/openshift_process.py import-2.7!skip -plugins/modules/openshift_process.py import-3.5!skip -plugins/modules/openshift_process.py compile-2.6!skip -plugins/modules/openshift_process.py compile-2.7!skip -plugins/modules/openshift_process.py compile-3.5!skip -plugins/modules/openshift_adm_groups_sync.py import-2.6!skip -plugins/modules/openshift_adm_groups_sync.py import-2.7!skip -plugins/modules/openshift_adm_groups_sync.py import-3.5!skip -plugins/modules/openshift_adm_groups_sync.py compile-2.6!skip -plugins/modules/openshift_adm_groups_sync.py compile-2.7!skip -plugins/modules/openshift_adm_groups_sync.py compile-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-2.6!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-2.6!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-3.5!skip -plugins/modules/openshift_adm_prune_auth.py import-2.6!skip -plugins/modules/openshift_adm_prune_auth.py import-2.7!skip -plugins/modules/openshift_adm_prune_auth.py import-3.5!skip -plugins/modules/openshift_adm_prune_auth.py compile-2.6!skip -plugins/modules/openshift_adm_prune_auth.py compile-2.7!skip -plugins/modules/openshift_adm_prune_auth.py compile-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py import-2.6!skip -plugins/modules/openshift_adm_prune_deployments.py import-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py import-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py compile-2.6!skip -plugins/modules/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/modules/openshift_adm_prune_images.py import-2.6!skip -plugins/modules/openshift_adm_prune_images.py import-2.7!skip -plugins/modules/openshift_adm_prune_images.py import-3.5!skip -plugins/modules/openshift_adm_prune_images.py compile-2.6!skip -plugins/modules/openshift_adm_prune_images.py compile-2.7!skip -plugins/modules/openshift_adm_prune_images.py compile-3.5!skip -plugins/modules/openshift_auth.py import-2.6!skip -plugins/modules/openshift_auth.py import-2.7!skip -plugins/modules/openshift_auth.py import-3.5!skip -plugins/modules/openshift_auth.py compile-2.6!skip -plugins/modules/openshift_auth.py compile-2.7!skip -plugins/modules/openshift_auth.py compile-3.5!skip -plugins/modules/openshift_import_image.py import-2.6!skip -plugins/modules/openshift_import_image.py import-2.7!skip -plugins/modules/openshift_import_image.py import-3.5!skip -plugins/modules/openshift_import_image.py compile-2.6!skip -plugins/modules/openshift_import_image.py compile-2.7!skip -plugins/modules/openshift_import_image.py compile-3.5!skip -plugins/modules/openshift_registry_info.py import-2.6!skip -plugins/modules/openshift_registry_info.py import-2.7!skip -plugins/modules/openshift_registry_info.py import-3.5!skip -plugins/modules/openshift_registry_info.py compile-2.6!skip -plugins/modules/openshift_registry_info.py compile-2.7!skip -plugins/modules/openshift_registry_info.py compile-3.5!skip -plugins/module_utils/k8s.py import-2.6!skip -plugins/module_utils/k8s.py import-2.7!skip -plugins/module_utils/k8s.py import-3.5!skip -plugins/module_utils/k8s.py compile-2.6!skip -plugins/module_utils/k8s.py compile-2.7!skip -plugins/module_utils/k8s.py compile-3.5!skip -plugins/module_utils/openshift_process.py import-2.6!skip -plugins/module_utils/openshift_process.py import-2.7!skip -plugins/module_utils/openshift_process.py import-3.5!skip -plugins/module_utils/openshift_process.py compile-2.6!skip -plugins/module_utils/openshift_process.py compile-2.7!skip -plugins/module_utils/openshift_process.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py import-2.6!skip -plugins/module_utils/openshift_adm_prune_auth.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-2.6!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-2.6!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-2.6!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/module_utils/openshift_ldap.py import-2.6!skip -plugins/module_utils/openshift_ldap.py import-2.7!skip -plugins/module_utils/openshift_ldap.py import-3.5!skip -plugins/module_utils/openshift_ldap.py compile-2.6!skip -plugins/module_utils/openshift_ldap.py compile-2.7!skip -plugins/module_utils/openshift_ldap.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py import-2.6!skip -plugins/module_utils/openshift_adm_prune_images.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py compile-2.6!skip -plugins/module_utils/openshift_adm_prune_images.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py compile-3.5!skip -plugins/module_utils/openshift_docker_image.py import-2.6!skip -plugins/module_utils/openshift_docker_image.py import-2.7!skip -plugins/module_utils/openshift_docker_image.py import-3.5!skip -plugins/module_utils/openshift_docker_image.py compile-2.6!skip -plugins/module_utils/openshift_docker_image.py compile-2.7!skip -plugins/module_utils/openshift_docker_image.py compile-3.5!skip -plugins/module_utils/openshift_import_image.py import-2.6!skip -plugins/module_utils/openshift_import_image.py import-2.7!skip -plugins/module_utils/openshift_import_image.py import-3.5!skip -plugins/module_utils/openshift_import_image.py compile-2.6!skip -plugins/module_utils/openshift_import_image.py compile-2.7!skip -plugins/module_utils/openshift_import_image.py compile-3.5!skip -plugins/module_utils/openshift_groups.py import-2.6!skip -plugins/module_utils/openshift_groups.py import-2.7!skip -plugins/module_utils/openshift_groups.py import-3.5!skip -plugins/module_utils/openshift_groups.py compile-2.6!skip -plugins/module_utils/openshift_groups.py compile-2.7!skip -plugins/module_utils/openshift_groups.py compile-3.5!skip -plugins/module_utils/openshift_images_common.py import-2.6!skip -plugins/module_utils/openshift_images_common.py import-2.7!skip -plugins/module_utils/openshift_images_common.py import-3.5!skip -plugins/module_utils/openshift_images_common.py compile-2.6!skip -plugins/module_utils/openshift_images_common.py compile-2.7!skip -plugins/module_utils/openshift_images_common.py compile-3.5!skip -plugins/module_utils/openshift_registry.py import-2.6!skip -plugins/module_utils/openshift_registry.py import-2.7!skip -plugins/module_utils/openshift_registry.py import-3.5!skip -plugins/module_utils/openshift_registry.py compile-2.6!skip -plugins/module_utils/openshift_registry.py compile-2.7!skip -plugins/module_utils/openshift_registry.py compile-3.5!skip -plugins/module_utils/openshift_builds.py import-2.6!skip -plugins/module_utils/openshift_builds.py import-2.7!skip -plugins/module_utils/openshift_builds.py import-3.5!skip -plugins/module_utils/openshift_builds.py compile-2.6!skip -plugins/module_utils/openshift_builds.py compile-2.7!skip -plugins/module_utils/openshift_builds.py compile-3.5!skip -plugins/modules/openshift_build.py import-2.6!skip -plugins/modules/openshift_build.py import-2.7!skip -plugins/modules/openshift_build.py import-3.5!skip -plugins/modules/openshift_build.py compile-2.6!skip -plugins/modules/openshift_build.py compile-2.7!skip -plugins/modules/openshift_build.py compile-3.5!skip -plugins/modules/openshift_adm_prune_builds.py import-2.6!skip -plugins/modules/openshift_adm_prune_builds.py import-2.7!skip -plugins/modules/openshift_adm_prune_builds.py import-3.5!skip -plugins/modules/openshift_adm_prune_builds.py compile-2.6!skip -plugins/modules/openshift_adm_prune_builds.py compile-2.7!skip -plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip \ No newline at end of file +plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc \ No newline at end of file diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt index a54a41f..2fd2bdc 100644 --- a/tests/sanity/ignore-2.13.txt +++ b/tests/sanity/ignore-2.13.txt @@ -1,103 +1,3 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s.py validate-modules:return-syntax-error -plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc -plugins/modules/openshift_route.py import-2.7!skip -plugins/modules/openshift_route.py import-3.5!skip -plugins/modules/openshift_route.py compile-2.7!skip -plugins/modules/openshift_route.py compile-3.5!skip -plugins/modules/k8s.py import-2.7!skip -plugins/modules/k8s.py import-3.5!skip -plugins/modules/k8s.py compile-2.7!skip -plugins/modules/k8s.py compile-3.5!skip -plugins/modules/openshift_process.py import-2.7!skip -plugins/modules/openshift_process.py import-3.5!skip -plugins/modules/openshift_process.py compile-2.7!skip -plugins/modules/openshift_process.py compile-3.5!skip -plugins/modules/openshift_adm_groups_sync.py import-2.7!skip -plugins/modules/openshift_adm_groups_sync.py import-3.5!skip -plugins/modules/openshift_adm_groups_sync.py compile-2.7!skip -plugins/modules/openshift_adm_groups_sync.py compile-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-3.5!skip -plugins/modules/openshift_adm_prune_auth.py import-2.7!skip -plugins/modules/openshift_adm_prune_auth.py import-3.5!skip -plugins/modules/openshift_adm_prune_auth.py compile-2.7!skip -plugins/modules/openshift_adm_prune_auth.py compile-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py import-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py import-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/modules/openshift_adm_prune_images.py import-2.7!skip -plugins/modules/openshift_adm_prune_images.py import-3.5!skip -plugins/modules/openshift_adm_prune_images.py compile-2.7!skip -plugins/modules/openshift_adm_prune_images.py compile-3.5!skip -plugins/modules/openshift_auth.py import-2.7!skip -plugins/modules/openshift_auth.py import-3.5!skip -plugins/modules/openshift_auth.py compile-2.7!skip -plugins/modules/openshift_auth.py compile-3.5!skip -plugins/modules/openshift_import_image.py import-2.7!skip -plugins/modules/openshift_import_image.py import-3.5!skip -plugins/modules/openshift_import_image.py compile-2.7!skip -plugins/modules/openshift_import_image.py compile-3.5!skip -plugins/modules/openshift_registry_info.py import-2.7!skip -plugins/modules/openshift_registry_info.py import-3.5!skip -plugins/modules/openshift_registry_info.py compile-2.7!skip -plugins/modules/openshift_registry_info.py compile-3.5!skip -plugins/module_utils/k8s.py import-2.7!skip -plugins/module_utils/k8s.py import-3.5!skip -plugins/module_utils/k8s.py compile-2.7!skip -plugins/module_utils/k8s.py compile-3.5!skip -plugins/module_utils/openshift_process.py import-2.7!skip -plugins/module_utils/openshift_process.py import-3.5!skip -plugins/module_utils/openshift_process.py compile-2.7!skip -plugins/module_utils/openshift_process.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/module_utils/openshift_ldap.py import-2.7!skip -plugins/module_utils/openshift_ldap.py import-3.5!skip -plugins/module_utils/openshift_ldap.py compile-2.7!skip -plugins/module_utils/openshift_ldap.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py compile-3.5!skip -plugins/module_utils/openshift_docker_image.py import-2.7!skip -plugins/module_utils/openshift_docker_image.py import-3.5!skip -plugins/module_utils/openshift_docker_image.py compile-2.7!skip -plugins/module_utils/openshift_docker_image.py compile-3.5!skip -plugins/module_utils/openshift_import_image.py import-2.7!skip -plugins/module_utils/openshift_import_image.py import-3.5!skip -plugins/module_utils/openshift_import_image.py compile-2.7!skip -plugins/module_utils/openshift_import_image.py compile-3.5!skip -plugins/module_utils/openshift_groups.py import-2.7!skip -plugins/module_utils/openshift_groups.py import-3.5!skip -plugins/module_utils/openshift_groups.py compile-2.7!skip -plugins/module_utils/openshift_groups.py compile-3.5!skip -plugins/module_utils/openshift_images_common.py import-2.7!skip -plugins/module_utils/openshift_images_common.py import-3.5!skip -plugins/module_utils/openshift_images_common.py compile-2.7!skip -plugins/module_utils/openshift_images_common.py compile-3.5!skip -plugins/module_utils/openshift_registry.py import-2.7!skip -plugins/module_utils/openshift_registry.py import-3.5!skip -plugins/module_utils/openshift_registry.py compile-2.7!skip -plugins/module_utils/openshift_registry.py compile-3.5!skip -plugins/module_utils/openshift_builds.py import-2.7!skip -plugins/module_utils/openshift_builds.py import-3.5!skip -plugins/module_utils/openshift_builds.py compile-2.7!skip -plugins/module_utils/openshift_builds.py compile-3.5!skip -plugins/modules/openshift_build.py import-2.7!skip -plugins/modules/openshift_build.py import-3.5!skip -plugins/modules/openshift_build.py compile-2.7!skip -plugins/modules/openshift_build.py compile-3.5!skip -plugins/modules/openshift_adm_prune_builds.py import-2.7!skip -plugins/modules/openshift_adm_prune_builds.py import-3.5!skip -plugins/modules/openshift_adm_prune_builds.py compile-2.7!skip -plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip \ No newline at end of file +plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc \ No newline at end of file diff --git a/tests/sanity/ignore-2.14.txt b/tests/sanity/ignore-2.14.txt index a54a41f..2fd2bdc 100644 --- a/tests/sanity/ignore-2.14.txt +++ b/tests/sanity/ignore-2.14.txt @@ -1,103 +1,3 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s.py validate-modules:return-syntax-error -plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc -plugins/modules/openshift_route.py import-2.7!skip -plugins/modules/openshift_route.py import-3.5!skip -plugins/modules/openshift_route.py compile-2.7!skip -plugins/modules/openshift_route.py compile-3.5!skip -plugins/modules/k8s.py import-2.7!skip -plugins/modules/k8s.py import-3.5!skip -plugins/modules/k8s.py compile-2.7!skip -plugins/modules/k8s.py compile-3.5!skip -plugins/modules/openshift_process.py import-2.7!skip -plugins/modules/openshift_process.py import-3.5!skip -plugins/modules/openshift_process.py compile-2.7!skip -plugins/modules/openshift_process.py compile-3.5!skip -plugins/modules/openshift_adm_groups_sync.py import-2.7!skip -plugins/modules/openshift_adm_groups_sync.py import-3.5!skip -plugins/modules/openshift_adm_groups_sync.py compile-2.7!skip -plugins/modules/openshift_adm_groups_sync.py compile-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-3.5!skip -plugins/modules/openshift_adm_prune_auth.py import-2.7!skip -plugins/modules/openshift_adm_prune_auth.py import-3.5!skip -plugins/modules/openshift_adm_prune_auth.py compile-2.7!skip -plugins/modules/openshift_adm_prune_auth.py compile-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py import-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py import-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/modules/openshift_adm_prune_images.py import-2.7!skip -plugins/modules/openshift_adm_prune_images.py import-3.5!skip -plugins/modules/openshift_adm_prune_images.py compile-2.7!skip -plugins/modules/openshift_adm_prune_images.py compile-3.5!skip -plugins/modules/openshift_auth.py import-2.7!skip -plugins/modules/openshift_auth.py import-3.5!skip -plugins/modules/openshift_auth.py compile-2.7!skip -plugins/modules/openshift_auth.py compile-3.5!skip -plugins/modules/openshift_import_image.py import-2.7!skip -plugins/modules/openshift_import_image.py import-3.5!skip -plugins/modules/openshift_import_image.py compile-2.7!skip -plugins/modules/openshift_import_image.py compile-3.5!skip -plugins/modules/openshift_registry_info.py import-2.7!skip -plugins/modules/openshift_registry_info.py import-3.5!skip -plugins/modules/openshift_registry_info.py compile-2.7!skip -plugins/modules/openshift_registry_info.py compile-3.5!skip -plugins/module_utils/k8s.py import-2.7!skip -plugins/module_utils/k8s.py import-3.5!skip -plugins/module_utils/k8s.py compile-2.7!skip -plugins/module_utils/k8s.py compile-3.5!skip -plugins/module_utils/openshift_process.py import-2.7!skip -plugins/module_utils/openshift_process.py import-3.5!skip -plugins/module_utils/openshift_process.py compile-2.7!skip -plugins/module_utils/openshift_process.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/module_utils/openshift_ldap.py import-2.7!skip -plugins/module_utils/openshift_ldap.py import-3.5!skip -plugins/module_utils/openshift_ldap.py compile-2.7!skip -plugins/module_utils/openshift_ldap.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py compile-3.5!skip -plugins/module_utils/openshift_docker_image.py import-2.7!skip -plugins/module_utils/openshift_docker_image.py import-3.5!skip -plugins/module_utils/openshift_docker_image.py compile-2.7!skip -plugins/module_utils/openshift_docker_image.py compile-3.5!skip -plugins/module_utils/openshift_import_image.py import-2.7!skip -plugins/module_utils/openshift_import_image.py import-3.5!skip -plugins/module_utils/openshift_import_image.py compile-2.7!skip -plugins/module_utils/openshift_import_image.py compile-3.5!skip -plugins/module_utils/openshift_groups.py import-2.7!skip -plugins/module_utils/openshift_groups.py import-3.5!skip -plugins/module_utils/openshift_groups.py compile-2.7!skip -plugins/module_utils/openshift_groups.py compile-3.5!skip -plugins/module_utils/openshift_images_common.py import-2.7!skip -plugins/module_utils/openshift_images_common.py import-3.5!skip -plugins/module_utils/openshift_images_common.py compile-2.7!skip -plugins/module_utils/openshift_images_common.py compile-3.5!skip -plugins/module_utils/openshift_registry.py import-2.7!skip -plugins/module_utils/openshift_registry.py import-3.5!skip -plugins/module_utils/openshift_registry.py compile-2.7!skip -plugins/module_utils/openshift_registry.py compile-3.5!skip -plugins/module_utils/openshift_builds.py import-2.7!skip -plugins/module_utils/openshift_builds.py import-3.5!skip -plugins/module_utils/openshift_builds.py compile-2.7!skip -plugins/module_utils/openshift_builds.py compile-3.5!skip -plugins/modules/openshift_build.py import-2.7!skip -plugins/modules/openshift_build.py import-3.5!skip -plugins/modules/openshift_build.py compile-2.7!skip -plugins/modules/openshift_build.py compile-3.5!skip -plugins/modules/openshift_adm_prune_builds.py import-2.7!skip -plugins/modules/openshift_adm_prune_builds.py import-3.5!skip -plugins/modules/openshift_adm_prune_builds.py compile-2.7!skip -plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip \ No newline at end of file +plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc \ No newline at end of file diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index a54a41f..2fd2bdc 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -1,103 +1,3 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s.py validate-modules:return-syntax-error -plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc -plugins/modules/openshift_route.py import-2.7!skip -plugins/modules/openshift_route.py import-3.5!skip -plugins/modules/openshift_route.py compile-2.7!skip -plugins/modules/openshift_route.py compile-3.5!skip -plugins/modules/k8s.py import-2.7!skip -plugins/modules/k8s.py import-3.5!skip -plugins/modules/k8s.py compile-2.7!skip -plugins/modules/k8s.py compile-3.5!skip -plugins/modules/openshift_process.py import-2.7!skip -plugins/modules/openshift_process.py import-3.5!skip -plugins/modules/openshift_process.py compile-2.7!skip -plugins/modules/openshift_process.py compile-3.5!skip -plugins/modules/openshift_adm_groups_sync.py import-2.7!skip -plugins/modules/openshift_adm_groups_sync.py import-3.5!skip -plugins/modules/openshift_adm_groups_sync.py compile-2.7!skip -plugins/modules/openshift_adm_groups_sync.py compile-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py import-3.5!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-2.7!skip -plugins/modules/openshift_adm_migrate_template_instances.py compile-3.5!skip -plugins/modules/openshift_adm_prune_auth.py import-2.7!skip -plugins/modules/openshift_adm_prune_auth.py import-3.5!skip -plugins/modules/openshift_adm_prune_auth.py compile-2.7!skip -plugins/modules/openshift_adm_prune_auth.py compile-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py import-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py import-3.5!skip -plugins/modules/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/modules/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/modules/openshift_adm_prune_images.py import-2.7!skip -plugins/modules/openshift_adm_prune_images.py import-3.5!skip -plugins/modules/openshift_adm_prune_images.py compile-2.7!skip -plugins/modules/openshift_adm_prune_images.py compile-3.5!skip -plugins/modules/openshift_auth.py import-2.7!skip -plugins/modules/openshift_auth.py import-3.5!skip -plugins/modules/openshift_auth.py compile-2.7!skip -plugins/modules/openshift_auth.py compile-3.5!skip -plugins/modules/openshift_import_image.py import-2.7!skip -plugins/modules/openshift_import_image.py import-3.5!skip -plugins/modules/openshift_import_image.py compile-2.7!skip -plugins/modules/openshift_import_image.py compile-3.5!skip -plugins/modules/openshift_registry_info.py import-2.7!skip -plugins/modules/openshift_registry_info.py import-3.5!skip -plugins/modules/openshift_registry_info.py compile-2.7!skip -plugins/modules/openshift_registry_info.py compile-3.5!skip -plugins/module_utils/k8s.py import-2.7!skip -plugins/module_utils/k8s.py import-3.5!skip -plugins/module_utils/k8s.py compile-2.7!skip -plugins/module_utils/k8s.py compile-3.5!skip -plugins/module_utils/openshift_process.py import-2.7!skip -plugins/module_utils/openshift_process.py import-3.5!skip -plugins/module_utils/openshift_process.py compile-2.7!skip -plugins/module_utils/openshift_process.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_auth.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_deployments.py compile-3.5!skip -plugins/module_utils/openshift_ldap.py import-2.7!skip -plugins/module_utils/openshift_ldap.py import-3.5!skip -plugins/module_utils/openshift_ldap.py compile-2.7!skip -plugins/module_utils/openshift_ldap.py compile-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py import-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py import-3.5!skip -plugins/module_utils/openshift_adm_prune_images.py compile-2.7!skip -plugins/module_utils/openshift_adm_prune_images.py compile-3.5!skip -plugins/module_utils/openshift_docker_image.py import-2.7!skip -plugins/module_utils/openshift_docker_image.py import-3.5!skip -plugins/module_utils/openshift_docker_image.py compile-2.7!skip -plugins/module_utils/openshift_docker_image.py compile-3.5!skip -plugins/module_utils/openshift_import_image.py import-2.7!skip -plugins/module_utils/openshift_import_image.py import-3.5!skip -plugins/module_utils/openshift_import_image.py compile-2.7!skip -plugins/module_utils/openshift_import_image.py compile-3.5!skip -plugins/module_utils/openshift_groups.py import-2.7!skip -plugins/module_utils/openshift_groups.py import-3.5!skip -plugins/module_utils/openshift_groups.py compile-2.7!skip -plugins/module_utils/openshift_groups.py compile-3.5!skip -plugins/module_utils/openshift_images_common.py import-2.7!skip -plugins/module_utils/openshift_images_common.py import-3.5!skip -plugins/module_utils/openshift_images_common.py compile-2.7!skip -plugins/module_utils/openshift_images_common.py compile-3.5!skip -plugins/module_utils/openshift_registry.py import-2.7!skip -plugins/module_utils/openshift_registry.py import-3.5!skip -plugins/module_utils/openshift_registry.py compile-2.7!skip -plugins/module_utils/openshift_registry.py compile-3.5!skip -plugins/module_utils/openshift_builds.py import-2.7!skip -plugins/module_utils/openshift_builds.py import-3.5!skip -plugins/module_utils/openshift_builds.py compile-2.7!skip -plugins/module_utils/openshift_builds.py compile-3.5!skip -plugins/modules/openshift_build.py import-2.7!skip -plugins/modules/openshift_build.py import-3.5!skip -plugins/modules/openshift_build.py compile-2.7!skip -plugins/modules/openshift_build.py compile-3.5!skip -plugins/modules/openshift_adm_prune_builds.py import-2.7!skip -plugins/modules/openshift_adm_prune_builds.py import-3.5!skip -plugins/modules/openshift_adm_prune_builds.py compile-2.7!skip -plugins/modules/openshift_adm_prune_builds.py compile-3.5!skip \ No newline at end of file +plugins/modules/openshift_process.py validate-modules:parameter-type-not-in-doc \ No newline at end of file