From 963aa3fbe614327942e37f5792d6e94ffd13ed0e Mon Sep 17 00:00:00 2001 From: abikouo <79859644+abikouo@users.noreply.github.com> Date: Wed, 28 Apr 2021 15:06:43 +0200 Subject: [PATCH 1/8] support merge_type``json`` (#83) Fixes #54 --- .github/workflows/ci.yml | 2 +- .../fragments/83-k8s-fix-merge_type-json.yaml | 3 + molecule/default/converge.yml | 8 + molecule/default/tasks/merge_type.yml | 252 ++++++++++++++++++ plugins/module_utils/common.py | 43 ++- plugins/modules/k8s.py | 1 + requirements.txt | 1 + 7 files changed, 308 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/83-k8s-fix-merge_type-json.yaml create mode 100644 molecule/default/tasks/merge_type.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c05f732..85a8be73 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,7 +87,7 @@ jobs: # The 3.3.0 release of molecule introduced a breaking change. See # https://github.com/ansible-community/molecule/issues/3083 - name: Install molecule and openshift dependencies - run: pip install ansible "molecule<3.3.0" yamllint openshift flake8 + run: pip install ansible "molecule<3.3.0" yamllint openshift flake8 jsonpatch # The latest release doesn't work with Molecule currently. # See: https://github.com/ansible-community/molecule/issues/2757 diff --git a/changelogs/fragments/83-k8s-fix-merge_type-json.yaml b/changelogs/fragments/83-k8s-fix-merge_type-json.yaml new file mode 100644 index 00000000..b7f7cd8a --- /dev/null +++ b/changelogs/fragments/83-k8s-fix-merge_type-json.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - k8s - fix merge_type option when set to json (https://github.com/ansible-collections/kubernetes.core/issues/54). diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml index 6e9387a1..8a2d2f57 100644 --- a/molecule/default/converge.yml +++ b/molecule/default/converge.yml @@ -133,6 +133,14 @@ tags: - always + - name: Include merge_type.yml + include_tasks: + file: tasks/merge_type.yml + apply: + tags: [ merge_type, k8s ] + tags: + - always + roles: - role: helm tags: diff --git a/molecule/default/tasks/merge_type.yml b/molecule/default/tasks/merge_type.yml new file mode 100644 index 00000000..4a8f31e5 --- /dev/null +++ b/molecule/default/tasks/merge_type.yml @@ -0,0 +1,252 @@ +- block: + - name: Define common facts + set_fact: + k8s_patch_namespace: "patch" + k8s_strategic_merge: "strategic-merge" + k8s_merge: "json-merge" + k8s_json: "json-patch" + + - name: Ensure the namespace exist + kubernetes.core.k8s: + kind: namespace + name: "{{ k8s_patch_namespace }}" + + + # Strategic merge + - name: create a simple nginx deployment + kubernetes.core.k8s: + namespace: "{{ k8s_patch_namespace }}" + definition: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: "{{ k8s_strategic_merge }}" + spec: + replicas: 2 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: "{{ k8s_strategic_merge }}-ctr" + image: nginx + tolerations: + - effect: NoSchedule + key: dedicated + value: "test-strategic-merge" + + + - name: patch service using strategic merge + kubernetes.core.k8s: + kind: Deployment + namespace: "{{ k8s_patch_namespace }}" + name: "{{ k8s_strategic_merge }}" + definition: + spec: + template: + spec: + containers: + - name: "{{ k8s_strategic_merge }}-ctr-2" + image: redis + register: depl_patch + + - name: validate that resource was patched + assert: + that: + - depl_patch.changed + + - name: describe "{{ k8s_strategic_merge }}" deployment + kubernetes.core.k8s_info: + kind: Deployment + name: "{{ k8s_strategic_merge }}" + namespace: "{{ k8s_patch_namespace }}" + register: deployment_out + + - name: assert that deployment contains expected images + assert: + that: + - deployment_out.resources[0].spec.template.spec.containers | selectattr('image','equalto','nginx') | list | length == 1 + - deployment_out.resources[0].spec.template.spec.containers | selectattr('image','equalto','redis') | list | length == 1 + + # Json merge + - name: create a simple nginx deployment (testing merge patch) + kubernetes.core.k8s: + namespace: "{{ k8s_patch_namespace }}" + definition: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: "{{ k8s_merge }}" + spec: + replicas: 2 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: "{{ k8s_merge }}-ctr" + image: nginx + tolerations: + - effect: NoSchedule + key: dedicated + value: "test-strategic-merge" + + + - name: patch service using json merge patch + kubernetes.core.k8s: + kind: Deployment + namespace: "{{ k8s_patch_namespace }}" + name: "{{ k8s_merge }}" + merge_type: + - merge + definition: + spec: + template: + spec: + containers: + - name: "{{ k8s_merge }}-ctr-2" + image: python + register: merge_patch + + - name: validate that resource was patched + assert: + that: + - merge_patch.changed + + - name: describe "{{ k8s_merge }}" deployment + kubernetes.core.k8s_info: + kind: Deployment + name: "{{ k8s_merge }}" + namespace: "{{ k8s_patch_namespace }}" + register: merge_out + + - name: assert that deployment contains expected images + assert: + that: + - merge_out.resources[0].spec.template.spec.containers | list | length == 1 + - merge_out.resources[0].spec.template.spec.containers[0].image == 'python' + + # Json + - name: create simple pod + kubernetes.core.k8s: + namespace: "{{ k8s_patch_namespace }}" + definition: + apiVersion: v1 + kind: Pod + metadata: + name: "{{ k8s_json }}-pod" + labels: + name: "{{ k8s_json }}-pod" + spec: + containers: + - args: + - /bin/sh + - -c + - while true; do echo $(date); sleep 10; done + image: python:3.7-alpine + imagePullPolicy: Always + name: alpine + + - name: Patch pod - update container image + kubernetes.core.k8s: + kind: Pod + namespace: "{{ k8s_patch_namespace }}" + name: "{{ k8s_json }}-pod" + merge_type: + - json + definition: + - op: replace + path: /spec/containers/0/image + value: python:3.8-alpine + register: pod_patch + + - name: assert that patch was performed + assert: + that: + - pod_patch.changed + + - name: describe Pod after patching + kubernetes.core.k8s_info: + kind: Pod + name: "{{ k8s_json }}-pod" + namespace: "{{ k8s_patch_namespace }}" + register: describe_pod + + - name: assert that image name has changed + assert: + that: + - describe_pod.resources[0].spec.containers[0].image == 'python:3.8-alpine' + + - name: create a simple nginx deployment + kubernetes.core.k8s: + namespace: "{{ k8s_patch_namespace }}" + definition: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: "{{ k8s_json }}-depl" + labels: + name: "{{ k8s_json }}-depl" + spec: + replicas: 2 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx-container + image: nginx + args: + - /bin/sh + - -c + - while true; do echo $(date); sleep 10; done + + - name: Patch Nginx deployment command + kubernetes.core.k8s: + kind: Deployment + namespace: "{{ k8s_patch_namespace }}" + name: "{{ k8s_json }}-depl" + merge_type: + - json + definition: + - op: add + path: '/spec/template/spec/containers/0/args/-' + value: 'touch /var/log' + register: patch_out + + - name: assert that patch succeed + assert: + that: + - patch_out.changed + + - name: describe deployment after patching + kubernetes.core.k8s_info: + kind: Deployment + name: "{{ k8s_json }}-depl" + namespace: "{{ k8s_patch_namespace }}" + register: describe_depl + + - name: assert that args changed on deployment + assert: + that: + - describe_depl.resources[0].spec.template.spec.containers[0].args | length == 4 + + always: + - name: Ensure namespace has been deleted + kubernetes.core.k8s: + kind: namespace + name: "{{ k8s_patch_namespace }}" + state: absent + ignore_errors: yes diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index 14d13e5c..203fa4a9 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -106,6 +106,17 @@ except ImportError as e: K8S_IMP_ERR = traceback.format_exc() +JSON_PATCH_IMP_ERR = None +try: + import jsonpatch + HAS_JSON_PATCH = True + jsonpatch_import_exception = None +except ImportError as e: + HAS_JSON_PATCH = False + jsonpatch_import_exception = e + JSON_PATCH_IMP_ERR = traceback.format_exc() + + def configuration_digest(configuration): m = hashlib.sha256() for k in AUTH_ARG_MAP: @@ -851,12 +862,42 @@ class K8sAnsibleMixin(object): self.fail_json(msg=msg, **result) return result + def json_patch(self, existing, definition, merge_type): + if merge_type == "json": + if not HAS_JSON_PATCH: + error = { + "msg": missing_required_lib('jsonpatch'), + "exception": JSON_PATCH_IMP_ERR, + "error": to_native(jsonpatch_import_exception) + } + return None, error + try: + patch = jsonpatch.JsonPatch([definition]) + result_patch = patch.apply(existing.to_dict()) + return result_patch, None + except jsonpatch.InvalidJsonPatch as e: + error = { + "msg": "invalid json patch", + "error": to_native(e) + } + return None, error + except jsonpatch.JsonPatchConflict as e: + error = { + "msg": "patch could not be applied due to conflict situation", + "error": to_native(e) + } + return None, error + return definition, None + def patch_resource(self, resource, definition, existing, name, namespace, merge_type=None): try: params = dict(name=name, namespace=namespace) if merge_type: params['content_type'] = 'application/{0}-patch+json'.format(merge_type) - k8s_obj = resource.patch(definition, **params).to_dict() + patch_data, error = self.json_patch(existing, definition, merge_type) + if error is not None: + return None, error + k8s_obj = resource.patch(patch_data, **params).to_dict() match, diffs = self.diff_objects(existing.to_dict(), k8s_obj) error = {} return k8s_obj, {} diff --git a/plugins/modules/k8s.py b/plugins/modules/k8s.py index 0672aa93..65152040 100644 --- a/plugins/modules/k8s.py +++ b/plugins/modules/k8s.py @@ -136,6 +136,7 @@ requirements: - "python >= 2.7" - "openshift >= 0.6" - "PyYAML >= 3.11" + - "jsonpatch" ''' EXAMPLES = r''' diff --git a/requirements.txt b/requirements.txt index 6ed70a79..9b495b2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ openshift>=0.6.2 requests-oauthlib +jsonpatch From e754a6cd3126d2ae3ba8cdb34bb0466a54df5c37 Mon Sep 17 00:00:00 2001 From: abikouo <79859644+abikouo@users.noreply.github.com> Date: Tue, 4 May 2021 15:05:18 +0200 Subject: [PATCH 2/8] ``helm_plugin`` and ``helm_plugin_info`` remove unused parameter ``release_namespace`` (#85) * remove unused parameter release_namespace from documentation * Update changelogs/fragments/85_helm_plugin.yaml Co-authored-by: Mike Graves --- changelogs/fragments/85_helm_plugin.yaml | 3 +++ molecule/default/roles/helm/tasks/tests_helm_diff.yml | 2 -- plugins/modules/helm_plugin.py | 8 -------- plugins/modules/helm_plugin_info.py | 8 -------- 4 files changed, 3 insertions(+), 18 deletions(-) create mode 100644 changelogs/fragments/85_helm_plugin.yaml diff --git a/changelogs/fragments/85_helm_plugin.yaml b/changelogs/fragments/85_helm_plugin.yaml new file mode 100644 index 00000000..bfe54558 --- /dev/null +++ b/changelogs/fragments/85_helm_plugin.yaml @@ -0,0 +1,3 @@ +breaking_changes: +- helm_plugin - remove unused ``release_namespace`` parameter. +- helm_plugin_info - remove unused ``release_namespace`` parameter. diff --git a/molecule/default/roles/helm/tasks/tests_helm_diff.yml b/molecule/default/roles/helm/tasks/tests_helm_diff.yml index 511c7bf6..c461be6d 100644 --- a/molecule/default/roles/helm/tasks/tests_helm_diff.yml +++ b/molecule/default/roles/helm/tasks/tests_helm_diff.yml @@ -6,7 +6,6 @@ block: - name: Install helm diff helm_plugin: - namespace: "{{ helm_namespace }}" state: present plugin_path: https://github.com/databus23/helm-diff @@ -137,7 +136,6 @@ - name: Uninstall helm diff helm_plugin: - namespace: "{{ helm_namespace }}" state: absent plugin_name: diff ignore_errors: yes diff --git a/plugins/modules/helm_plugin.py b/plugins/modules/helm_plugin.py index 357ee817..222ab8f8 100644 --- a/plugins/modules/helm_plugin.py +++ b/plugins/modules/helm_plugin.py @@ -20,13 +20,6 @@ requirements: description: - Manages Helm plugins. options: - # TODO: (akasurde) Remove this in version 2.0 - release_namespace: - description: - - Kubernetes namespace where the helm plugin should be installed. - type: str - aliases: [ namespace ] - #Helm options state: description: @@ -108,7 +101,6 @@ def main(): module = AnsibleModule( argument_spec=dict( binary_path=dict(type='path'), - release_namespace=dict(type='str', aliases=['namespace']), state=dict(type='str', default='present', choices=['present', 'absent']), plugin_path=dict(type='str',), plugin_name=dict(type='str',), diff --git a/plugins/modules/helm_plugin_info.py b/plugins/modules/helm_plugin_info.py index b1b86b17..9d43c594 100644 --- a/plugins/modules/helm_plugin_info.py +++ b/plugins/modules/helm_plugin_info.py @@ -20,13 +20,6 @@ requirements: description: - Gather information about Helm plugins installed in namespace. options: - # TODO: (akasurde) Remove this in version 2.0 - release_namespace: - description: - - Kubernetes namespace where the helm plugins are installed. - type: str - aliases: [ namespace ] - #Helm options plugin_name: description: @@ -88,7 +81,6 @@ def main(): module = AnsibleModule( argument_spec=dict( binary_path=dict(type='path'), - release_namespace=dict(type='str', aliases=['namespace']), plugin_name=dict(type='str',), # Helm options context=dict(type='str', aliases=['kube_context'], fallback=(env_fallback, ['K8S_AUTH_CONTEXT'])), From fc80540db5d74ce192a0714469653eb0f7f319e4 Mon Sep 17 00:00:00 2001 From: abikouo <79859644+abikouo@users.noreply.github.com> Date: Tue, 4 May 2021 18:07:22 +0200 Subject: [PATCH 3/8] drop python 2 support (breaking changes) (#86) * drop python 2 support * change log * Update changelogs/fragments/86_drop_python2_support.yaml Co-authored-by: Mike Graves * Update k8s.py Co-authored-by: Mike Graves --- .github/workflows/ci.yml | 4 ++-- changelogs/fragments/86_drop_python2_support.yaml | 3 +++ plugins/inventory/k8s.py | 2 +- plugins/lookup/k8s.py | 2 +- plugins/modules/k8s.py | 2 +- plugins/modules/k8s_cluster_info.py | 2 +- plugins/modules/k8s_exec.py | 2 +- plugins/modules/k8s_info.py | 2 +- plugins/modules/k8s_log.py | 2 +- plugins/modules/k8s_rollback.py | 2 +- plugins/modules/k8s_scale.py | 2 +- plugins/modules/k8s_service.py | 2 +- 12 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 changelogs/fragments/86_drop_python2_support.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85a8be73..01532f28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python_version: ['2.7', '3.7'] + python_version: ['3.7'] steps: - name: Check out code uses: actions/checkout@v2 @@ -116,7 +116,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python_version: ['2.7', '3.7'] + python_version: ['3.7'] steps: - name: Check out code uses: actions/checkout@v2 diff --git a/changelogs/fragments/86_drop_python2_support.yaml b/changelogs/fragments/86_drop_python2_support.yaml new file mode 100644 index 00000000..b381c2d4 --- /dev/null +++ b/changelogs/fragments/86_drop_python2_support.yaml @@ -0,0 +1,3 @@ +--- +breaking_changes: + - Drop python 2 support. diff --git a/plugins/inventory/k8s.py b/plugins/inventory/k8s.py index 6ec33ef0..df348dc2 100644 --- a/plugins/inventory/k8s.py +++ b/plugins/inventory/k8s.py @@ -86,7 +86,7 @@ DOCUMENTATION = ''' to access. requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/lookup/k8s.py b/plugins/lookup/k8s.py index 9520a1f6..b3728be5 100644 --- a/plugins/lookup/k8s.py +++ b/plugins/lookup/k8s.py @@ -124,7 +124,7 @@ DOCUMENTATION = ''' aliases: [ verify_ssl ] requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" diff --git a/plugins/modules/k8s.py b/plugins/modules/k8s.py index 65152040..ea21c8ac 100644 --- a/plugins/modules/k8s.py +++ b/plugins/modules/k8s.py @@ -133,7 +133,7 @@ options: version_added: 2.0.0 requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" - "jsonpatch" diff --git a/plugins/modules/k8s_cluster_info.py b/plugins/modules/k8s_cluster_info.py index 17ec750f..3742777c 100644 --- a/plugins/modules/k8s_cluster_info.py +++ b/plugins/modules/k8s_cluster_info.py @@ -33,7 +33,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_auth_options requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_exec.py b/plugins/modules/k8s_exec.py index c7f574fe..b1ab1103 100644 --- a/plugins/modules/k8s_exec.py +++ b/plugins/modules/k8s_exec.py @@ -26,7 +26,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_auth_options requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift == 0.4.3" - "PyYAML >= 3.11" diff --git a/plugins/modules/k8s_info.py b/plugins/modules/k8s_info.py index 28c639a6..f2ab9eb1 100644 --- a/plugins/modules/k8s_info.py +++ b/plugins/modules/k8s_info.py @@ -49,7 +49,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_wait_options requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_log.py b/plugins/modules/k8s_log.py index 071d64db..281cb192 100644 --- a/plugins/modules/k8s_log.py +++ b/plugins/modules/k8s_log.py @@ -56,7 +56,7 @@ options: type: str requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_rollback.py b/plugins/modules/k8s_rollback.py index e41da810..06d82904 100644 --- a/plugins/modules/k8s_rollback.py +++ b/plugins/modules/k8s_rollback.py @@ -31,7 +31,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_auth_options - kubernetes.core.k8s_name_options requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_scale.py b/plugins/modules/k8s_scale.py index 149df21f..e4f80b97 100644 --- a/plugins/modules/k8s_scale.py +++ b/plugins/modules/k8s_scale.py @@ -31,7 +31,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_scale_options requirements: - - "python >= 2.7" + - "python >= 3.6" - "openshift >= 0.6" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_service.py b/plugins/modules/k8s_service.py index 95a60ae2..aeee768d 100644 --- a/plugins/modules/k8s_service.py +++ b/plugins/modules/k8s_service.py @@ -85,7 +85,7 @@ options: type: bool requirements: - - python >= 2.7 + - python >= 3.6 - openshift >= 0.6.2 ''' From 87827d79a4c929fdc7f3f11c82e444b39f26dc48 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Wed, 5 May 2021 13:10:39 +0530 Subject: [PATCH 4/8] Update README for the Python3 (#93) --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 14e6e70b..fd256fdf 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ 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+ + +Note: Python2 is deprecated from [1st January 2020](https://www.python.org/doc/sunset-python-2/). Please switch to Python3. + ## Included content Click on the name of a plugin or module to view that content's documentation: @@ -185,7 +191,7 @@ Releases are automatically built and pushed to Ansible Galaxy for any new tag. B 3. Commit the changes and create a PR with the changes. Wait for tests to pass, then merge it once they have. 4. Tag the version in Git and push to GitHub. -After the version is published, verify it exists on the [Kubernetes Collection Galaxy page](https://galaxy.ansible.com/community/kubernetes). +After the version is published, verify it exists on the [Kubernetes Collection Galaxy page](https://galaxy.ansible.com/kubernetes/core). The process for uploading a supported release to Automation Hub is documented separately. From 2b6a989cf95848fc69c073f9a13f87279c889732 Mon Sep 17 00:00:00 2001 From: Mike Graves Date: Wed, 5 May 2021 10:09:22 -0400 Subject: [PATCH 5/8] Replicate base resource for lists functionality (#89) * Replicate base resource for lists functionality This replicates specific functionality from the openshift client to more reliably retrieve the base resource from a resource list. * Add changelog fragment --- .../fragments/89-replicate-base-resource.yaml | 3 + plugins/module_utils/cache.py | 55 ------- plugins/module_utils/client/discovery.py | 154 ++++++++++++++++++ plugins/module_utils/client/resource.py | 49 ++++++ plugins/module_utils/common.py | 12 +- plugins/modules/k8s_cluster_info.py | 23 ++- tests/sanity/ignore-2.10.txt | 10 +- tests/sanity/ignore-2.11.txt | 10 +- tests/sanity/ignore-2.12.txt | 6 + tests/sanity/ignore-2.9.txt | 6 +- tests/unit/module_utils/test_discoverer.py | 143 ++++++++++++++++ 11 files changed, 398 insertions(+), 73 deletions(-) create mode 100644 changelogs/fragments/89-replicate-base-resource.yaml delete mode 100644 plugins/module_utils/cache.py create mode 100644 plugins/module_utils/client/discovery.py create mode 100644 plugins/module_utils/client/resource.py create mode 100644 tests/unit/module_utils/test_discoverer.py diff --git a/changelogs/fragments/89-replicate-base-resource.yaml b/changelogs/fragments/89-replicate-base-resource.yaml new file mode 100644 index 00000000..cf81e081 --- /dev/null +++ b/changelogs/fragments/89-replicate-base-resource.yaml @@ -0,0 +1,3 @@ +--- +minor_changes: + - replicate base resource for lists functionality (https://github.com/ansible-collections/kubernetes.core/pull/89). diff --git a/plugins/module_utils/cache.py b/plugins/module_utils/cache.py deleted file mode 100644 index 963c3d60..00000000 --- a/plugins/module_utils/cache.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright [2017] [Red Hat, Inc.] -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -import os - -from ansible.module_utils.six import PY3 - - -def get_user(): - if hasattr(os, 'getlogin'): - try: - user = os.getlogin() - if user: - return str(user) - except OSError: - pass - if hasattr(os, 'getuid'): - try: - user = os.getuid() - if user: - return str(user) - except OSError: - pass - user = os.environ.get("USERNAME") - if user: - return str(user) - return None - - -def get_default_cache_id(client): - user = get_user() - if user: - cache_id = "{0}-{1}".format(client.configuration.host, user) - else: - cache_id = client.configuration.host - - if PY3: - return cache_id.encode('utf-8') - - return cache_id diff --git a/plugins/module_utils/client/discovery.py b/plugins/module_utils/client/discovery.py new file mode 100644 index 00000000..ec01f195 --- /dev/null +++ b/plugins/module_utils/client/discovery.py @@ -0,0 +1,154 @@ +# Copyright [2017] [Red Hat, Inc.] +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import json +import os +from collections import defaultdict +import hashlib +import tempfile + +import kubernetes.dynamic +import kubernetes.dynamic.discovery +from kubernetes import __version__ +from kubernetes.dynamic.exceptions import ServiceUnavailableError + +from ansible_collections.kubernetes.core.plugins.module_utils.client.resource import ResourceList + + +class Discoverer(kubernetes.dynamic.discovery.Discoverer): + def __init__(self, client, cache_file): + self.client = client + default_cache_file_name = 'k8srcp-{0}.json'.format(hashlib.sha256(self.__get_default_cache_id()).hexdigest()) + self.__cache_file = cache_file or os.path.join(tempfile.gettempdir(), default_cache_file_name) + self.__init_cache() + + def __get_default_cache_id(self): + user = self.__get_user() + if user: + cache_id = "{0}-{1}".format(self.client.configuration.host, user) + else: + cache_id = self.client.configuration.host + return cache_id.encode('utf-8') + + def __get_user(self): + # This is intended to provide a portable method for getting a username. + # It could, and maybe should, be replaced by getpass.getuser() but, due + # to a lack of portability testing the original code is being left in + # place. + if hasattr(os, 'getlogin'): + try: + user = os.getlogin() + if user: + return str(user) + except OSError: + pass + if hasattr(os, 'getuid'): + try: + user = os.getuid() + if user: + return str(user) + except OSError: + pass + user = os.environ.get("USERNAME") + if user: + return str(user) + return None + + def __init_cache(self, refresh=False): + if refresh or not os.path.exists(self.__cache_file): + self._cache = {'library_version': __version__} + refresh = True + else: + try: + with open(self.__cache_file, 'r') as f: + self._cache = json.load(f, cls=CacheDecoder(self.client)) + if self._cache.get('library_version') != __version__: + # Version mismatch, need to refresh cache + self.invalidate_cache() + except Exception: + self.invalidate_cache() + self._load_server_info() + self.discover() + if refresh: + self._write_cache() + + def get_resources_for_api_version(self, prefix, group, version, preferred): + """ returns a dictionary of resources associated with provided (prefix, group, version)""" + + resources = defaultdict(list) + subresources = defaultdict(dict) + + path = '/'.join(filter(None, [prefix, group, version])) + try: + resources_response = self.client.request('GET', path).resources or [] + except ServiceUnavailableError: + resources_response = [] + + resources_raw = list(filter(lambda resource: '/' not in resource['name'], resources_response)) + subresources_raw = list(filter(lambda resource: '/' in resource['name'], resources_response)) + for subresource in subresources_raw: + resource, name = subresource['name'].split('/') + subresources[resource][name] = subresource + + for resource in resources_raw: + # Prevent duplicate keys + for key in ('prefix', 'group', 'api_version', 'client', 'preferred'): + resource.pop(key, None) + + resourceobj = kubernetes.dynamic.Resource( + prefix=prefix, + group=group, + api_version=version, + client=self.client, + preferred=preferred, + subresources=subresources.get(resource['name']), + **resource + ) + resources[resource['kind']].append(resourceobj) + + resource_lookup = { + 'prefix': prefix, + 'group': group, + 'api_version': version, + 'kind': resourceobj.kind, + 'name': resourceobj.name + } + resource_list = ResourceList(self.client, group=group, api_version=version, base_kind=resource['kind'], base_resource_lookup=resource_lookup) + resources[resource_list.kind].append(resource_list) + return resources + + +class LazyDiscoverer(Discoverer, kubernetes.dynamic.LazyDiscoverer): + def __init__(self, client, cache_file): + Discoverer.__init__(self, client, cache_file) + self.__update_cache = False + + +class CacheDecoder(json.JSONDecoder): + def __init__(self, client, *args, **kwargs): + self.client = client + json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs) + + def object_hook(self, obj): + if '_type' not in obj: + return obj + _type = obj.pop('_type') + if _type == 'Resource': + return kubernetes.dynamic.Resource(client=self.client, **obj) + elif _type == 'ResourceList': + return ResourceList(self.client, **obj) + elif _type == 'ResourceGroup': + return kubernetes.dynamic.discovery.ResourceGroup(obj['preferred'], resources=self.object_hook(obj['resources'])) + return obj diff --git a/plugins/module_utils/client/resource.py b/plugins/module_utils/client/resource.py new file mode 100644 index 00000000..39d8a1cf --- /dev/null +++ b/plugins/module_utils/client/resource.py @@ -0,0 +1,49 @@ +# Copyright [2017] [Red Hat, Inc.] +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +import kubernetes.dynamic + + +class ResourceList(kubernetes.dynamic.resource.ResourceList): + def __init__(self, client, group='', api_version='v1', base_kind='', kind=None, base_resource_lookup=None): + self.client = client + self.group = group + self.api_version = api_version + self.kind = kind or '{0}List'.format(base_kind) + self.base_kind = base_kind + self.base_resource_lookup = base_resource_lookup + self.__base_resource = None + + def base_resource(self): + if self.__base_resource: + return self.__base_resource + elif self.base_resource_lookup: + self.__base_resource = self.client.resources.get(**self.base_resource_lookup) + return self.__base_resource + return None + + def to_dict(self): + return { + '_type': 'ResourceList', + 'group': self.group, + 'api_version': self.api_version, + 'kind': self.kind, + 'base_kind': self.base_kind, + 'base_resource_lookup': self.base_resource_lookup + } diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index 203fa4a9..9a7cb269 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -23,14 +23,12 @@ import time import os import traceback import sys -import tempfile import hashlib from datetime import datetime from distutils.version import LooseVersion from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (AUTH_ARG_MAP, AUTH_ARG_SPEC, AUTH_PROXY_HEADERS_SPEC) from ansible_collections.kubernetes.core.plugins.module_utils.hashes import generate_hash -from ansible_collections.kubernetes.core.plugins.module_utils.cache import get_default_cache_id from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.six import iteritems, string_types @@ -56,6 +54,7 @@ except ImportError as e: IMP_K8S_CLIENT = None try: from ansible_collections.kubernetes.core.plugins.module_utils.k8sdynamicclient import K8SDynamicClient + from ansible_collections.kubernetes.core.plugins.module_utils.client.discovery import LazyDiscoverer IMP_K8S_CLIENT = True except ImportError as e: IMP_K8S_CLIENT = False @@ -214,15 +213,8 @@ def get_api_client(module=None, **kwargs): client = get_api_client._pool[digest] return client - def generate_cache_file(kubeclient): - cache_file_name = 'k8srcp-{0}.json'.format(hashlib.sha256(get_default_cache_id(kubeclient)).hexdigest()) - return os.path.join(tempfile.gettempdir(), cache_file_name) - - kubeclient = kubernetes.client.ApiClient(configuration) - cache_file = generate_cache_file(kubeclient) - try: - client = K8SDynamicClient(kubeclient, cache_file) + client = K8SDynamicClient(kubernetes.client.ApiClient(configuration), discoverer=LazyDiscoverer) except Exception as err: _raise_or_fail(err, 'Failed to get client due to %s') diff --git a/plugins/modules/k8s_cluster_info.py b/plugins/modules/k8s_cluster_info.py index 3742777c..04cc09d8 100644 --- a/plugins/modules/k8s_cluster_info.py +++ b/plugins/modules/k8s_cluster_info.py @@ -140,19 +140,29 @@ apis: import copy - -from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import AnsibleModule -from ansible.module_utils.parsing.convert_bool import boolean -from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (AUTH_ARG_SPEC) +import traceback from collections import defaultdict +HAS_K8S = False +try: + from ansible_collections.kubernetes.core.plugins.module_utils.client.resource import ResourceList + HAS_K8S = True +except ImportError as e: + K8S_IMP_ERR = e + K8S_IMP_EXC = traceback.format_exc() + +from ansible.module_utils._text import to_native +from ansible.module_utils.basic import missing_required_lib +from ansible.module_utils.parsing.convert_bool import boolean +from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import AnsibleModule +from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (AUTH_ARG_SPEC) + def execute_module(module, client): invalidate_cache = boolean(module.params.get('invalidate_cache', True), strict=False) if invalidate_cache: client.resources.invalidate_cache() results = defaultdict(dict) - from openshift.dynamic.resource import ResourceList for resource in list(client.resources): resource = resource[0] if isinstance(resource, ResourceList): @@ -192,6 +202,9 @@ def argspec(): def main(): module = AnsibleModule(argument_spec=argspec(), supports_check_mode=True) + if not HAS_K8S: + module.fail_json(msg=missing_required_lib('kubernetes'), exception=K8S_IMP_EXC, + error=to_native(K8S_IMP_ERR)) from ansible_collections.kubernetes.core.plugins.module_utils.common import get_api_client execute_module(module, client=get_api_client(module=module)) diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt index c1468787..728285d1 100644 --- a/tests/sanity/ignore-2.10.txt +++ b/tests/sanity/ignore-2.10.txt @@ -9,4 +9,12 @@ molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/k8sdynamicclient.py import-2.7!skip -plugins/module_utils/k8sdynamicclient.py import-3.7!skip \ No newline at end of file +plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.7!skip +plugins/module_utils/client/resource.py import-2.7!skip +plugins/module_utils/client/resource.py import-3.7!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py metaclass-boilerplate!skip +tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index c1468787..728285d1 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -9,4 +9,12 @@ molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/k8sdynamicclient.py import-2.7!skip -plugins/module_utils/k8sdynamicclient.py import-3.7!skip \ No newline at end of file +plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.7!skip +plugins/module_utils/client/resource.py import-2.7!skip +plugins/module_utils/client/resource.py import-3.7!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py metaclass-boilerplate!skip +tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index dd0b476b..8b748a40 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -10,3 +10,9 @@ molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllin molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/k8sdynamicclient.py import-2.7!skip plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.7!skip +plugins/module_utils/client/resource.py import-2.7!skip +plugins/module_utils/client/resource.py import-3.7!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index b2db7a19..83482030 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -6,4 +6,8 @@ molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/k8sdynamicclient.py import-2.7!skip -plugins/module_utils/k8sdynamicclient.py import-3.7!skip \ No newline at end of file +plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py metaclass-boilerplate!skip +tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip diff --git a/tests/unit/module_utils/test_discoverer.py b/tests/unit/module_utils/test_discoverer.py new file mode 100644 index 00000000..63a8a9f4 --- /dev/null +++ b/tests/unit/module_utils/test_discoverer.py @@ -0,0 +1,143 @@ +# Copyright [2017] [Red Hat, Inc.] +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import pytest + +from kubernetes.client import ApiClient +from kubernetes.dynamic import Resource + +from ansible_collections.kubernetes.core.plugins.module_utils.k8sdynamicclient import K8SDynamicClient +from ansible_collections.kubernetes.core.plugins.module_utils.client.discovery import LazyDiscoverer +from ansible_collections.kubernetes.core.plugins.module_utils.client.resource import ResourceList + + +@pytest.fixture(scope='module') +def mock_namespace(): + return Resource( + api_version='v1', + kind='Namespace', + name='namespaces', + namespaced=False, + preferred=True, + prefix='api', + shorter_names=['ns'], + shortNames=['ns'], + singularName='namespace', + verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] + ) + + +@pytest.fixture(scope='module') +def mock_templates(): + return Resource( + api_version='v1', + kind='Template', + name='templates', + namespaced=True, + preferred=True, + prefix='api', + shorter_names=[], + shortNames=[], + verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] + ) + + +@pytest.fixture(scope='module') +def mock_processedtemplates(): + return Resource( + api_version='v1', + kind='Template', + name='processedtemplates', + namespaced=True, + preferred=True, + prefix='api', + shorter_names=[], + shortNames=[], + verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] + ) + + +@pytest.fixture(scope='module') +def mock_namespace_list(mock_namespace): + ret = ResourceList(mock_namespace.client, mock_namespace.group, mock_namespace.api_version, mock_namespace.kind) + ret._ResourceList__base_resource = mock_namespace + return ret + + +@pytest.fixture(scope='function', autouse=True) +def setup_client_monkeypatch(monkeypatch, mock_namespace, mock_namespace_list, mock_templates, mock_processedtemplates): + + def mock_load_server_info(self): + self.__version = {'kubernetes': 'mock-k8s-version'} + + def mock_parse_api_groups(self, request_resources=False): + return { + 'api': { + '': { + 'v1': { + 'Namespace': [mock_namespace], + 'NamespaceList': [mock_namespace_list], + 'Template': [mock_templates, mock_processedtemplates], + } + } + } + } + + monkeypatch.setattr(LazyDiscoverer, '_load_server_info', mock_load_server_info) + monkeypatch.setattr(LazyDiscoverer, 'parse_api_groups', mock_parse_api_groups) + + +@pytest.fixture +def client(request): + return K8SDynamicClient(ApiClient(), discoverer=LazyDiscoverer) + + +@pytest.mark.parametrize(("attribute", "value"), [ + ('name', 'namespaces'), + ('singular_name', 'namespace'), + ('short_names', ['ns']) +]) +def test_search_returns_single_and_list(client, mock_namespace, mock_namespace_list, attribute, value): + resources = client.resources.search(**{'api_version': 'v1', attribute: value}) + + assert len(resources) == 2 + assert mock_namespace in resources + assert mock_namespace_list in resources + + +@pytest.mark.parametrize(("attribute", "value"), [ + ('kind', 'Namespace'), + ('name', 'namespaces'), + ('singular_name', 'namespace'), + ('short_names', ['ns']) +]) +def test_get_returns_only_single(client, mock_namespace, attribute, value): + resource = client.resources.get(**{'api_version': 'v1', attribute: value}) + + assert resource == mock_namespace + + +def test_get_namespace_list_kind(client, mock_namespace_list): + resource = client.resources.get(api_version='v1', kind='NamespaceList') + + assert resource == mock_namespace_list + + +def test_search_multiple_resources_for_template(client, mock_templates, mock_processedtemplates): + resources = client.resources.search(api_version='v1', kind='Template') + + assert len(resources) == 2 + assert mock_templates in resources + assert mock_processedtemplates in resources From 01a0815e560530fb0da543d7519b9612cad6ab37 Mon Sep 17 00:00:00 2001 From: Mike Graves Date: Thu, 6 May 2021 14:44:17 -0400 Subject: [PATCH 6/8] Replace openshift client with kubernetes client (#96) * Replace openshift client with kubernetes client This commit primarily just removes mentions of openshift from the docs and updates the requirements. Most of the work to replace the client has been done through the following commits: edc48ee5770293af78ac19ac752e7d422b402dae c214376cac0a54d2be859e37ff7cefa2e4196e7a 48c5170018b7e1869a53588e3b8efee3d93c95aa 2b6a989cf95848fc69c073f9a13f87279c889732 * Add changelog fragment * Update changelogs/fragments/96-replace-openshift-client.yaml Co-authored-by: Abhijeet Kasurde * Update plugins/modules/k8s.py Co-authored-by: Abhijeet Kasurde * Update plugins/modules/k8s_info.py Co-authored-by: Abhijeet Kasurde * Update plugins/modules/k8s_service.py Co-authored-by: Abhijeet Kasurde * Bump minimum kubernetes version to 12.0.0 Co-authored-by: Abhijeet Kasurde --- README.md | 6 +-- .../96-replace-openshift-client.yaml | 3 ++ plugins/doc_fragments/k8s_auth_options.py | 5 +- plugins/filter/k8s.py | 9 +--- plugins/inventory/k8s.py | 8 +-- plugins/lookup/k8s.py | 15 ++---- plugins/module_utils/common.py | 53 ++++++------------- plugins/modules/k8s.py | 23 +++----- plugins/modules/k8s_cluster_info.py | 6 +-- plugins/modules/k8s_exec.py | 2 +- plugins/modules/k8s_info.py | 4 +- plugins/modules/k8s_log.py | 4 +- plugins/modules/k8s_rollback.py | 4 +- plugins/modules/k8s_scale.py | 2 +- plugins/modules/k8s_service.py | 12 ++--- requirements.txt | 2 +- .../targets/kubernetes/tasks/main.yml | 6 +-- 17 files changed, 58 insertions(+), 106 deletions(-) create mode 100644 changelogs/fragments/96-replace-openshift-client.yaml diff --git a/README.md b/README.md index fd256fdf..bc6a1104 100644 --- a/README.md +++ b/README.md @@ -79,11 +79,11 @@ collections: version: 1.2.0 ``` -### Installing the OpenShift Python Library +### Installing the Kubernetes Python Library -Content in this collection requires the [OpenShift Python client](https://pypi.org/project/openshift/) to interact with Kubernetes' APIs. You can install it with: +Content in this collection requires the [Kubernetes Python client](https://pypi.org/project/kubernetes/) to interact with Kubernetes' APIs. You can install it with: - pip3 install openshift + pip3 install kubernetes ### Using modules from the Kubernetes Collection in your playbooks diff --git a/changelogs/fragments/96-replace-openshift-client.yaml b/changelogs/fragments/96-replace-openshift-client.yaml new file mode 100644 index 00000000..136adace --- /dev/null +++ b/changelogs/fragments/96-replace-openshift-client.yaml @@ -0,0 +1,3 @@ +--- +major_changes: + - replaces the openshift client with the official kubernetes client (https://github.com/ansible-collections/kubernetes.core/issues/34). diff --git a/plugins/doc_fragments/k8s_auth_options.py b/plugins/doc_fragments/k8s_auth_options.py index d63fbbc2..0012a40d 100644 --- a/plugins/doc_fragments/k8s_auth_options.py +++ b/plugins/doc_fragments/k8s_auth_options.py @@ -24,7 +24,7 @@ options: kubeconfig: description: - Path to an existing Kubernetes config file. If not provided, and no other connection - options are provided, the openshift client will attempt to load the default + options are provided, the Kubernetes client will attempt to load the default configuration file from I(~/.kube/config). Can also be specified via K8S_AUTH_KUBECONFIG environment variable. type: path @@ -110,9 +110,6 @@ options: - "The fix for this k8s python library is here: https://github.com/kubernetes-client/python-base/pull/169" type: bool notes: - - "The OpenShift Python client wraps the K8s Python client, providing full access to - all of the APIS and models available on both platforms. For API version details and - additional information visit https://github.com/openshift/openshift-restclient-python" - "To avoid SSL certificate validation errors when C(validate_certs) is I(True), the full certificate chain for the API server must be provided via C(ca_cert) or in the kubeconfig file." diff --git a/plugins/filter/k8s.py b/plugins/filter/k8s.py index 3597b852..7b8591ef 100644 --- a/plugins/filter/k8s.py +++ b/plugins/filter/k8s.py @@ -6,18 +6,11 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -try: - from openshift.helper.hashes import generate_hash - HAS_GENERATE_HASH = True -except ImportError: - HAS_GENERATE_HASH = False - from ansible.errors import AnsibleFilterError +from ansible_collections.kubernetes.core.plugins.module_utils.hashes import generate_hash def k8s_config_resource_name(resource): - if not HAS_GENERATE_HASH: - raise AnsibleFilterError("k8s_config_resource_name requires openshift>=0.7.2") try: return resource['metadata']['name'] + '-' + generate_hash(resource) except KeyError: diff --git a/plugins/inventory/k8s.py b/plugins/inventory/k8s.py index df348dc2..01c2ebc3 100644 --- a/plugins/inventory/k8s.py +++ b/plugins/inventory/k8s.py @@ -37,7 +37,7 @@ DOCUMENTATION = ''' kubeconfig: description: - Path to an existing Kubernetes config file. If not provided, and no other connection - options are provided, the OpenShift client will attempt to load the default + options are provided, the Kubernetes client will attempt to load the default configuration file from I(~/.kube/config). Can also be specified via K8S_AUTH_KUBECONFIG environment variable. context: @@ -87,7 +87,7 @@ DOCUMENTATION = ''' requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' @@ -121,7 +121,7 @@ from ansible_collections.kubernetes.core.plugins.module_utils.common import K8sA from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable try: - from openshift.dynamic.exceptions import DynamicApiError + from kubernetes.dynamic.exceptions import DynamicApiError except ImportError: pass @@ -158,7 +158,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable, K8sAnsibleM if not HAS_K8S_MODULE_HELPER: raise K8sInventoryException( - "This module requires the OpenShift Python client. Try `pip install openshift`. Detail: {0}".format(k8s_import_exception) + "This module requires the Kubernetes Python client. Try `pip install kubernetes`. Detail: {0}".format(k8s_import_exception) ) source_data = None diff --git a/plugins/lookup/k8s.py b/plugins/lookup/k8s.py index b3728be5..e363d1e3 100644 --- a/plugins/lookup/k8s.py +++ b/plugins/lookup/k8s.py @@ -30,7 +30,7 @@ DOCUMENTATION = ''' - Fabian von Feilitzsch <@fabianvf> description: - - Uses the OpenShift Python client to fetch a specific object by name, all matching objects within a + - Uses the Kubernetes Python client to fetch a specific object by name, all matching objects within a namespace, or all matching objects for all namespaces, as well as information about the cluster. - Provides access the full range of K8s APIs. - Enables authentication via config file, certificates, password or token. @@ -85,7 +85,7 @@ DOCUMENTATION = ''' kubeconfig: description: - Path to an existing Kubernetes config file. If not provided, and no other connection - options are provided, the openshift client will attempt to load the default + options are provided, the Kubernetes client will attempt to load the default configuration file from I(~/.kube/config). Can also be specified via K8S_AUTH_KUBECONFIG environment variable. context: @@ -125,13 +125,8 @@ DOCUMENTATION = ''' requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" - - notes: - - "The OpenShift Python client wraps the K8s Python client, providing full access to - all of the APIS and models available on both platforms. For API version details and - additional information visit https://github.com/openshift/openshift-restclient-python" ''' EXAMPLES = """ @@ -206,7 +201,7 @@ from ansible_collections.kubernetes.core.plugins.module_utils.common import K8sA try: - from openshift.dynamic.exceptions import NotFoundError + from kubernetes.dynamic.exceptions import NotFoundError HAS_K8S_MODULE_HELPER = True k8s_import_exception = None except ImportError as e: @@ -220,7 +215,7 @@ class KubernetesLookup(K8sAnsibleMixin): if not HAS_K8S_MODULE_HELPER: raise Exception( - "Requires the OpenShift Python client. Try `pip install openshift`. Detail: {0}".format(k8s_import_exception) + "Requires the Kubernetes Python client. Try `pip install kubernetes`. Detail: {0}".format(k8s_import_exception) ) self.kind = None diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index 9a7cb269..86b7ae9a 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -39,10 +39,10 @@ from ansible.module_utils.parsing.convert_bool import boolean K8S_IMP_ERR = None try: import kubernetes - import openshift from kubernetes.dynamic.exceptions import ( NotFoundError, ResourceNotFoundError, ResourceNotUniqueError, DynamicApiError, - ConflictError, ForbiddenError, MethodNotAllowedError, BadRequestError + ConflictError, ForbiddenError, MethodNotAllowedError, BadRequestError, + KubernetesValidateMissing ) HAS_K8S_MODULE_HELPER = True k8s_import_exception = None @@ -69,14 +69,6 @@ except ImportError: YAML_IMP_ERR = traceback.format_exc() HAS_YAML = False -K8S_CONFIG_HASH_IMP_ERR = None -try: - from kubernetes.dynamic.exceptions import KubernetesValidateMissing - HAS_K8S_CONFIG_HASH = True -except ImportError: - K8S_CONFIG_HASH_IMP_ERR = traceback.format_exc() - HAS_K8S_CONFIG_HASH = False - HAS_K8S_APPLY = None try: from ansible_collections.kubernetes.core.plugins.module_utils.apply import apply_object @@ -229,9 +221,9 @@ class K8sAnsibleMixin(object): def __init__(self, module, *args, **kwargs): if not HAS_K8S_MODULE_HELPER: - module.fail_json(msg=missing_required_lib('openshift'), exception=K8S_IMP_ERR, + module.fail_json(msg=missing_required_lib('kubernetes'), exception=K8S_IMP_ERR, error=to_native(k8s_import_exception)) - self.openshift_version = openshift.__version__ + self.kubernetes_version = kubernetes.__version__ if not HAS_YAML: module.fail_json(msg=missing_required_lib("PyYAML"), exception=YAML_IMP_ERR) @@ -495,21 +487,8 @@ class K8sAnsibleMixin(object): self.resource_definitions = [implicit_definition] def check_library_version(self): - validate = self.params.get('validate') - if validate and LooseVersion(self.openshift_version) < LooseVersion("0.8.0"): - self.fail_json(msg="openshift >= 0.8.0 is required for validate") - self.append_hash = self.params.get('append_hash') - if self.append_hash and not HAS_K8S_CONFIG_HASH: - self.fail_json(msg=missing_required_lib("openshift >= 0.7.2", reason="for append_hash"), - exception=K8S_CONFIG_HASH_IMP_ERR) - if self.params['merge_type'] and LooseVersion(self.openshift_version) < LooseVersion("0.6.2"): - self.fail_json(msg=missing_required_lib("openshift >= 0.6.2", reason="for merge_type")) - self.apply = self.params.get('apply', False) - if self.apply and not HAS_K8S_APPLY: - self.fail_json(msg=missing_required_lib("openshift >= 0.9.2", reason="for apply")) - wait = self.params.get('wait', False) - if wait and not HAS_K8S_INSTANCE_HELPER: - self.fail_json(msg=missing_required_lib("openshift >= 0.4.0", reason="for wait")) + if LooseVersion(self.kubernetes_version) < LooseVersion("12.0.0"): + self.fail_json(msg="kubernetes >= 12.0.0 is required") def flatten_list_kind(self, list_resource, definitions): flattened = [] @@ -590,6 +569,8 @@ class K8sAnsibleMixin(object): return definition def perform_action(self, resource, definition): + append_hash = self.params.get('append_hash', False) + apply = self.params.get('apply', False) delete_options = self.params.get('delete_options') result = {'changed': False, 'result': {}} state = self.params.get('state', None) @@ -613,7 +594,7 @@ class K8sAnsibleMixin(object): try: # ignore append_hash for resources other than ConfigMap and Secret - if self.append_hash and definition['kind'] in ['ConfigMap', 'Secret']: + if append_hash and definition['kind'] in ['ConfigMap', 'Secret']: name = '%s-%s' % (name, generate_hash(definition)) definition['metadata']['name'] = name params = dict(name=name) @@ -690,7 +671,7 @@ class K8sAnsibleMixin(object): self.fail_json(msg=build_error_msg(definition['kind'], origin_name, msg), **result) return result else: - if self.apply: + if apply: if self.check_mode: ignored, patch = apply_object(resource, _encode_stringdata(definition)) if existing: @@ -786,7 +767,7 @@ class K8sAnsibleMixin(object): k8s_obj = _encode_stringdata(definition) else: try: - k8s_obj = resource.replace(definition, name=name, namespace=namespace, append_hash=self.append_hash).to_dict() + k8s_obj = resource.replace(definition, name=name, namespace=namespace, append_hash=append_hash).to_dict() except DynamicApiError as exc: msg = "Failed to replace object: {0}".format(exc.body) if self.warnings: @@ -819,15 +800,11 @@ class K8sAnsibleMixin(object): if self.check_mode: k8s_obj = dict_merge(existing.to_dict(), _encode_stringdata(definition)) else: - if LooseVersion(self.openshift_version) < LooseVersion("0.6.2"): + for merge_type in self.params['merge_type'] or ['strategic-merge', 'merge']: k8s_obj, error = self.patch_resource(resource, definition, existing, name, - namespace) - else: - for merge_type in self.params['merge_type'] or ['strategic-merge', 'merge']: - k8s_obj, error = self.patch_resource(resource, definition, existing, name, - namespace, merge_type=merge_type) - if not error: - break + namespace, merge_type=merge_type) + if not error: + break if error: if continue_on_error: result['error'] = error diff --git a/plugins/modules/k8s.py b/plugins/modules/k8s.py index ea21c8ac..f70923ff 100644 --- a/plugins/modules/k8s.py +++ b/plugins/modules/k8s.py @@ -21,7 +21,7 @@ author: - "Fabian von Feilitzsch (@fabianvf)" description: - - Use the OpenShift Python client to perform CRUD operations on K8s objects. + - Use the Kubernetes Python client to perform CRUD operations on K8s objects. - Pass the object definition from a source file or inline. See examples for reading files and using Jinja templates or vault-encrypted files. - Access to the full range of K8s APIs. @@ -37,13 +37,6 @@ extends_documentation_fragment: - kubernetes.core.k8s_wait_options - kubernetes.core.k8s_delete_options -notes: - - If your OpenShift Python library is not 0.9.0 or newer and you are trying to - remove an item from an associative array/dictionary, for example a label or - an annotation, you will need to explicitly set the value of the item to be - removed to `null`. Simply deleting the entry in the dictionary will not - remove it from openshift or kubernetes. - options: merge_type: description: @@ -52,11 +45,9 @@ options: - For example, Custom Resource Definitions typically aren't updatable by the usual strategic merge. You may want to use C(merge) if you see "strategic merge patch format is not supported" - See U(https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/#use-a-json-merge-patch-to-update-a-deployment) - - Requires openshift >= 0.6.2 - - If more than one merge_type is given, the merge_types will be tried in order - - If openshift >= 0.6.2, this defaults to C(['strategic-merge', 'merge']), which is ideal for using the same parameters - on resource kinds that combine Custom Resources and built-in resources. For openshift < 0.6.2, the default - is simply C(strategic-merge). + - If more than one C(merge_type) is given, the merge_types will be tried in order. This defaults to + C(['strategic-merge', 'merge']), which is ideal for using the same parameters on resource kinds that + combine Custom Resources and built-in resources. - mutually exclusive with C(apply) choices: - json @@ -67,7 +58,7 @@ options: validate: description: - how (if at all) to validate the resource definition against the kubernetes schema. - Requires the kubernetes-validate python module and openshift >= 0.8.0 + Requires the kubernetes-validate python module. suboptions: fail_on_error: description: whether to fail on validation errors. @@ -88,7 +79,6 @@ options: - The full definition of an object is needed to generate the hash - this means that deleting an object created with append_hash will only work if the same object is passed with state=absent (alternatively, just use state=absent with the name including the generated hash and append_hash=no) - - Requires openshift >= 0.7.2 default: False type: bool apply: @@ -96,7 +86,6 @@ options: - C(apply) compares the desired resource definition with the previously supplied resource definition, ignoring properties that are automatically generated - C(apply) works better with Services than 'force=yes' - - Requires openshift >= 0.9.2 - mutually exclusive with C(merge_type) default: False type: bool @@ -134,7 +123,7 @@ options: requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" - "jsonpatch" ''' diff --git a/plugins/modules/k8s_cluster_info.py b/plugins/modules/k8s_cluster_info.py index 04cc09d8..b17f07be 100644 --- a/plugins/modules/k8s_cluster_info.py +++ b/plugins/modules/k8s_cluster_info.py @@ -18,7 +18,7 @@ author: - Abhijeet Kasurde (@Akasurde) description: - - Use the OpenShift Python client to perform read operations on K8s objects. + - Use the Kubernetes Python client to perform read operations on K8s objects. - Authenticate using either a config file, certificates, password or token. - Supports check mode. @@ -34,7 +34,7 @@ extends_documentation_fragment: requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' @@ -186,7 +186,7 @@ def execute_module(module, client): 'username': configuration.username, 'verify_ssl': configuration.verify_ssl, } - from openshift import __version__ as version + from kubernetes import __version__ as version version_info = { 'client': version, 'server': client.version, diff --git a/plugins/modules/k8s_exec.py b/plugins/modules/k8s_exec.py index b1ab1103..b72df56e 100644 --- a/plugins/modules/k8s_exec.py +++ b/plugins/modules/k8s_exec.py @@ -27,7 +27,7 @@ extends_documentation_fragment: requirements: - "python >= 3.6" - - "openshift == 0.4.3" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" notes: diff --git a/plugins/modules/k8s_info.py b/plugins/modules/k8s_info.py index f2ab9eb1..50059e41 100644 --- a/plugins/modules/k8s_info.py +++ b/plugins/modules/k8s_info.py @@ -18,7 +18,7 @@ author: - "Will Thames (@willthames)" description: - - Use the OpenShift Python client to perform read operations on K8s objects. + - Use the Kubernetes Python client to perform read operations on K8s objects. - Access to the full range of K8s APIs. - Authenticate using either a config file, certificates, password or token. - Supports check mode. @@ -50,7 +50,7 @@ extends_documentation_fragment: requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_log.py b/plugins/modules/k8s_log.py index 281cb192..e3be18bf 100644 --- a/plugins/modules/k8s_log.py +++ b/plugins/modules/k8s_log.py @@ -20,7 +20,7 @@ author: - "Fabian von Feilitzsch (@fabianvf)" description: - - Use the OpenShift Python client to perform read operations on K8s log endpoints. + - Use the Kubernetes Python client to perform read operations on K8s log endpoints. - Authenticate using either a config file, certificates, password or token. - Supports check mode. - Analogous to `kubectl logs` or `oc logs` @@ -57,7 +57,7 @@ options: requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_rollback.py b/plugins/modules/k8s_rollback.py index 06d82904..f12d3da4 100644 --- a/plugins/modules/k8s_rollback.py +++ b/plugins/modules/k8s_rollback.py @@ -15,7 +15,7 @@ version_added: "1.0.0" author: - "Julien Huon (@julienhuon)" description: - - Use the OpenShift Python client to perform the Rollback. + - Use the Kubernetes Python client to perform the Rollback. - Authenticate using either a config file, certificates, password or token. - Similar to the C(kubectl rollout undo) command. options: @@ -32,7 +32,7 @@ extends_documentation_fragment: - kubernetes.core.k8s_name_options requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_scale.py b/plugins/modules/k8s_scale.py index e4f80b97..e4643aad 100644 --- a/plugins/modules/k8s_scale.py +++ b/plugins/modules/k8s_scale.py @@ -32,7 +32,7 @@ extends_documentation_fragment: requirements: - "python >= 3.6" - - "openshift >= 0.6" + - "kubernetes >= 12.0.0" - "PyYAML >= 3.11" ''' diff --git a/plugins/modules/k8s_service.py b/plugins/modules/k8s_service.py index aeee768d..d94ba5c0 100644 --- a/plugins/modules/k8s_service.py +++ b/plugins/modules/k8s_service.py @@ -18,7 +18,7 @@ short_description: Manage Services on Kubernetes author: KubeVirt Team (@kubevirt) description: - - Use Openshift Python SDK to manage Services on Kubernetes + - Use Kubernetes Python SDK to manage Services on Kubernetes extends_documentation_fragment: - kubernetes.core.k8s_auth_options @@ -33,11 +33,9 @@ options: - For example, Custom Resource Definitions typically aren't updatable by the usual strategic merge. You may want to use C(merge) if you see "strategic merge patch format is not supported" - See U(https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/#use-a-json-merge-patch-to-update-a-deployment) - - Requires openshift >= 0.6.2 - - If more than one merge_type is given, the merge_types will be tried in order - - If openshift >= 0.6.2, this defaults to C(['strategic-merge', 'merge']), which is ideal for using the same parameters - on resource kinds that combine Custom Resources and built-in resources. For openshift < 0.6.2, the default - is simply C(strategic-merge). + - If more than one C(merge_type) is given, the merge_types will be tried in order + - This defaults to C(['strategic-merge', 'merge']), which is ideal for using the same parameters + on resource kinds that combine Custom Resources and built-in resources. choices: - json - merge @@ -86,7 +84,7 @@ options: requirements: - python >= 3.6 - - openshift >= 0.6.2 + - kubernetes >= 12.0.0 ''' EXAMPLES = r''' diff --git a/requirements.txt b/requirements.txt index 9b495b2b..cea80595 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -openshift>=0.6.2 +kubernetes>=12.0.0 requests-oauthlib jsonpatch diff --git a/tests/integration/targets/kubernetes/tasks/main.yml b/tests/integration/targets/kubernetes/tasks/main.yml index abeb2a23..52fae25f 100644 --- a/tests/integration/targets/kubernetes/tasks/main.yml +++ b/tests/integration/targets/kubernetes/tasks/main.yml @@ -12,7 +12,7 @@ - pip: name: - - openshift>=0.9.2 + - kubernetes>=12.0.0 - coverage>=5.3 virtualenv: "{{ virtualenv }}" virtualenv_command: "{{ virtualenv_command }}" @@ -32,7 +32,7 @@ - pip: name: - kubernetes-validate==1.12.0 - - openshift>=0.9.2 + - kubernetes>=12.0.0 - coverage>=5.3 virtualenv: "{{ virtualenv }}" virtualenv_command: "{{ virtualenv_command }}" @@ -60,7 +60,7 @@ - pip: name: - - openshift>=0.9.2 + - kubernetes>=12.0.0 virtualenv: "{{ virtualenv }}" virtualenv_command: "{{ virtualenv_command }}" virtualenv_site_packages: no From 0eb1559cc7347398a66bcb6586e37d594d094106 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Mon, 17 May 2021 13:54:51 +0530 Subject: [PATCH 7/8] Update docs (#101) --- README.md | 5 + ...ubernetes.core.helm_plugin_info_module.rst | 16 -- docs/kubernetes.core.helm_plugin_module.rst | 16 -- ...ubernetes.core.k8s_cluster_info_module.rst | 187 +++++++++--------- docs/kubernetes.core.k8s_exec_module.rst | 108 ++++++++-- docs/kubernetes.core.k8s_info_module.rst | 78 +++++++- docs/kubernetes.core.k8s_inventory.rst | 6 +- docs/kubernetes.core.k8s_log_module.rst | 114 ++++++++--- docs/kubernetes.core.k8s_lookup.rst | 14 +- docs/kubernetes.core.k8s_module.rst | 125 ++++++++++-- docs/kubernetes.core.k8s_rollback_module.rst | 114 ++++++++--- docs/kubernetes.core.k8s_scale_module.rst | 122 +++++++++--- docs/kubernetes.core.k8s_service_module.rst | 129 +++++++++--- plugins/filter/k8s.py | 6 + 14 files changed, 755 insertions(+), 285 deletions(-) diff --git a/README.md b/README.md index bc6a1104..4635368f 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,11 @@ Name | Description --- | --- [kubernetes.core.kubectl](https://github.com/ansible-collections/kubernetes.core/blob/main/docs/kubernetes.core.kubectl_connection.rst)|Execute tasks in pods running on Kubernetes. +### K8s filter plugins +Name | Description +--- | --- +kubernetes.core.k8s_config_resource_name|Generate resource name for the given resource of type ConfigMap, Secret + ### Inventory plugins Name | Description --- | --- diff --git a/docs/kubernetes.core.helm_plugin_info_module.rst b/docs/kubernetes.core.helm_plugin_info_module.rst index 931c6418..86c563f9 100644 --- a/docs/kubernetes.core.helm_plugin_info_module.rst +++ b/docs/kubernetes.core.helm_plugin_info_module.rst @@ -152,22 +152,6 @@ Parameters
Name of Helm plugin, to gather particular plugin info.
- - -
- release_namespace - -
- string -
- - - - -
Kubernetes namespace where the helm plugins are installed.
-

aliases: namespace
- -
diff --git a/docs/kubernetes.core.helm_plugin_module.rst b/docs/kubernetes.core.helm_plugin_module.rst index 515b6f12..ca1f1d03 100644 --- a/docs/kubernetes.core.helm_plugin_module.rst +++ b/docs/kubernetes.core.helm_plugin_module.rst @@ -170,22 +170,6 @@ Parameters
Required only if state=present.
- - -
- release_namespace - -
- string -
- - - - -
Kubernetes namespace where the helm plugin should be installed.
-

aliases: namespace
- -
diff --git a/docs/kubernetes.core.k8s_cluster_info_module.rst b/docs/kubernetes.core.k8s_cluster_info_module.rst index ef64ec40..e1b6c4de 100644 --- a/docs/kubernetes.core.k8s_cluster_info_module.rst +++ b/docs/kubernetes.core.k8s_cluster_info_module.rst @@ -17,7 +17,7 @@ Version added: 0.11.1 Synopsis -------- -- Use the OpenShift Python client to perform read operations on K8s objects. +- Use the Kubernetes Python client to perform read operations on K8s objects. - Authenticate using either a config file, certificates, password or token. - Supports check mode. @@ -27,8 +27,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -39,12 +39,12 @@ Parameters - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterParameter Choices/Defaults Comments
+
api_key @@ -59,7 +59,7 @@ Parameters
+
ca_cert @@ -75,7 +75,7 @@ Parameters
+
client_cert @@ -91,7 +91,7 @@ Parameters
+
client_key @@ -107,7 +107,7 @@ Parameters
+
context @@ -122,7 +122,7 @@ Parameters
+
host @@ -137,7 +137,7 @@ Parameters
+
invalidate_cache @@ -156,7 +156,7 @@ Parameters
+
kubeconfig @@ -167,11 +167,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
password @@ -187,7 +187,7 @@ Parameters
+
persist_config @@ -210,7 +210,7 @@ Parameters
+
proxy @@ -226,7 +226,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
username @@ -242,7 +311,7 @@ Parameters
+
validate_certs @@ -269,7 +338,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. @@ -309,48 +377,17 @@ Common return values are documented `here
dictionary + / elements=dictionary
success -
The APs that exists in dictionary
+
dictionary of group + version of resource found from cluster

  -
- api_version - -
- string -
-
success -
API version
-
-
  -
- available_api_version - -
- list -
-
success -
All available versions of the given API
-
-
 
categories @@ -365,38 +402,6 @@ Common return values are documented `here
  -
- group_version - -
- string -
-
success -
Resource Group version
-
-
  -
- kind - -
- string -
-
success -
Resource kind
-
-
  @@ -445,22 +450,6 @@ Common return values are documented `here
  -
- preferred_api_version - -
- string -
-
success -
Preferred version of the given API
-
-
  diff --git a/docs/kubernetes.core.k8s_exec_module.rst b/docs/kubernetes.core.k8s_exec_module.rst index 2599f40e..72b980b2 100644 --- a/docs/kubernetes.core.k8s_exec_module.rst +++ b/docs/kubernetes.core.k8s_exec_module.rst @@ -25,8 +25,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift == 0.4.3 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -37,12 +37,12 @@ Parameters - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - @@ -314,6 +314,75 @@ Parameters
Please note that this module does not pick up typical proxy settings from the environment (e.g. HTTP_PROXY).
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/kubernetes.core.k8s_log_module.rst b/docs/kubernetes.core.k8s_log_module.rst index 324f2e88..edea0a8c 100644 --- a/docs/kubernetes.core.k8s_log_module.rst +++ b/docs/kubernetes.core.k8s_log_module.rst @@ -17,7 +17,7 @@ Version added: 0.10.0 Synopsis -------- -- Use the OpenShift Python client to perform read operations on K8s log endpoints. +- Use the Kubernetes Python client to perform read operations on K8s log endpoints. - Authenticate using either a config file, certificates, password or token. - Supports check mode. - Analogous to `kubectl logs` or `oc logs` @@ -28,8 +28,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -40,12 +40,12 @@ Parameters
ParameterParameter Choices/Defaults Comments
+
api_key @@ -57,7 +57,7 @@ Parameters
+
ca_cert @@ -73,7 +73,7 @@ Parameters
+
client_cert @@ -89,7 +89,7 @@ Parameters
+
client_key @@ -105,7 +105,7 @@ Parameters
+
command @@ -121,7 +121,7 @@ Parameters
+
container @@ -137,7 +137,7 @@ Parameters
+
context @@ -152,7 +152,7 @@ Parameters
+
host @@ -167,7 +167,7 @@ Parameters
+
kubeconfig @@ -178,11 +178,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
namespace @@ -198,7 +198,7 @@ Parameters
+
password @@ -214,7 +214,7 @@ Parameters
+
persist_config @@ -237,7 +237,7 @@ Parameters
+
pod @@ -253,7 +253,7 @@ Parameters
+
proxy @@ -270,7 +270,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
username @@ -286,7 +355,7 @@ Parameters
+
validate_certs @@ -315,7 +384,6 @@ Notes .. note:: - Return code ``return_code`` for the command executed is added in output in version 1.0.0. - The authenticated user must have at least read access to the pods resource and write access to the pods/exec resource. - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/docs/kubernetes.core.k8s_info_module.rst b/docs/kubernetes.core.k8s_info_module.rst index 3c9f3f39..be82dce5 100644 --- a/docs/kubernetes.core.k8s_info_module.rst +++ b/docs/kubernetes.core.k8s_info_module.rst @@ -16,7 +16,7 @@ kubernetes.core.k8s_info Synopsis -------- -- Use the OpenShift Python client to perform read operations on K8s objects. +- Use the Kubernetes Python client to perform read operations on K8s objects. - Access to the full range of K8s APIs. - Authenticate using either a config file, certificates, password or token. - Supports check mode. @@ -28,8 +28,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -204,7 +204,7 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
@@ -492,7 +561,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/docs/kubernetes.core.k8s_inventory.rst b/docs/kubernetes.core.k8s_inventory.rst index 7569c258..e1fc270b 100644 --- a/docs/kubernetes.core.k8s_inventory.rst +++ b/docs/kubernetes.core.k8s_inventory.rst @@ -27,8 +27,8 @@ Requirements ------------ The below requirements are needed on the local Ansible controller node that executes this inventory. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -187,7 +187,7 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the OpenShift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
- + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - @@ -381,12 +381,6 @@ Parameters
-Notes ------ - -.. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - Examples diff --git a/docs/kubernetes.core.k8s_module.rst b/docs/kubernetes.core.k8s_module.rst index 9437db14..92af21a9 100644 --- a/docs/kubernetes.core.k8s_module.rst +++ b/docs/kubernetes.core.k8s_module.rst @@ -16,7 +16,7 @@ kubernetes.core.k8s Synopsis -------- -- Use the OpenShift Python client to perform CRUD operations on K8s objects. +- Use the Kubernetes Python client to perform CRUD operations on K8s objects. - Pass the object definition from a source file or inline. See examples for reading files and using Jinja templates or vault-encrypted files. - Access to the full range of K8s APIs. - Use the :ref:`kubernetes.core.k8s_info ` module to obtain a list of items about an object of type ``kind`` @@ -29,9 +29,10 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 +- jsonpatch Parameters @@ -100,7 +101,6 @@ Parameters
Applies only to ConfigMap and Secret resources
The parameter will be silently ignored for other resource kinds
The full definition of an object is needed to generate the hash - this means that deleting an object created with append_hash will only work if the same object is passed with state=absent (alternatively, just use state=absent with the name including the generated hash and append_hash=no)
-
Requires openshift >= 0.7.2
@@ -121,7 +121,6 @@ Parameters @@ -188,6 +187,27 @@ Parameters
The name of a context found in the config file. Can also be specified via K8S_AUTH_CONTEXT environment variable.
+ + + + + @@ -385,9 +405,7 @@ Parameters
Whether to override the default patch merge approach with a specific type. By default, the strategic merge will typically be used.
For example, Custom Resource Definitions typically aren't updatable by the usual strategic merge. You may want to use merge if you see "strategic merge patch format is not supported"
-
Requires openshift >= 0.6.2
-
If more than one merge_type is given, the merge_types will be tried in order
-
If openshift >= 0.6.2, this defaults to ['strategic-merge', 'merge'], which is ideal for using the same parameters on resource kinds that combine Custom Resources and built-in resources. For openshift < 0.6.2, the default is simply strategic-merge.
+
If more than one merge_type is given, the merge_types will be tried in order. This defaults to ['strategic-merge', 'merge'], which is ideal for using the same parameters on resource kinds that combine Custom Resources and built-in resources.
mutually exclusive with apply
@@ -482,6 +500,75 @@ Parameters
Please note that this module does not pick up typical proxy settings from the environment (e.g. HTTP_PROXY).
+ + + + + + + + + + + + + + + + + + + + + + + + @@ -812,8 +899,6 @@ Notes ----- .. note:: - - If your OpenShift Python library is not 0.9.0 or newer and you are trying to remove an item from an associative array/dictionary, for example a label or an annotation, you will need to explicitly set the value of the item to be removed to `null`. Simply deleting the entry in the dictionary will not remove it from openshift or kubernetes. - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. @@ -994,6 +1079,22 @@ Common return values are documented `here 48 + + + + + +
ParameterParameter Choices/Defaults Comments
+
api_key @@ -60,7 +60,7 @@ Parameters
+
api_version @@ -80,7 +80,7 @@ Parameters
+
ca_cert @@ -96,7 +96,7 @@ Parameters
+
client_cert @@ -112,7 +112,7 @@ Parameters
+
client_key @@ -128,7 +128,7 @@ Parameters
+
container @@ -145,7 +145,7 @@ Parameters
+
context @@ -160,7 +160,7 @@ Parameters
+
host @@ -175,7 +175,7 @@ Parameters
+
kind @@ -193,7 +193,7 @@ Parameters
+
kubeconfig @@ -204,11 +204,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
label_selectors @@ -225,7 +225,7 @@ Parameters
+
name @@ -242,7 +242,7 @@ Parameters
+
namespace @@ -260,7 +260,7 @@ Parameters
+
password @@ -276,7 +276,7 @@ Parameters
+
persist_config @@ -299,7 +299,7 @@ Parameters
+
proxy @@ -315,7 +315,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
username @@ -331,7 +400,7 @@ Parameters
+
validate_certs @@ -358,7 +427,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/docs/kubernetes.core.k8s_lookup.rst b/docs/kubernetes.core.k8s_lookup.rst index 1d7f760f..9337796a 100644 --- a/docs/kubernetes.core.k8s_lookup.rst +++ b/docs/kubernetes.core.k8s_lookup.rst @@ -16,7 +16,7 @@ kubernetes.core.k8s Synopsis -------- -- Uses the OpenShift Python client to fetch a specific object by name, all matching objects within a namespace, or all matching objects for all namespaces, as well as information about the cluster. +- Uses the Kubernetes Python client to fetch a specific object by name, all matching objects within a namespace, or all matching objects for all namespaces, as well as information about the cluster. - Provides access the full range of K8s APIs. - Enables authentication via config file, certificates, password or token. @@ -26,8 +26,8 @@ Requirements ------------ The below requirements are needed on the local Ansible controller node that executes this lookup. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -232,7 +232,7 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
apply compares the desired resource definition with the previously supplied resource definition, ignoring properties that are automatically generated
apply works better with Services than 'force=yes'
-
Requires openshift >= 0.9.2
mutually exclusive with merge_type
+
+ continue_on_error + +
+ boolean +
+
added in 2.0.0
+
+
    Choices: +
  • no ←
  • +
  • yes
  • +
+
+
Whether to continue on creation/deletion errors when multiple resources are defined.
+
This has no effect on the validation step which is controlled by the validate.fail_on_error parameter.
+
@@ -361,7 +381,7 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
@@ -590,7 +677,7 @@ Parameters
-
how (if at all) to validate the resource definition against the kubernetes schema. Requires the kubernetes-validate python module and openshift >= 0.8.0
+
how (if at all) to validate the resource definition against the kubernetes schema. Requires the kubernetes-validate python module.
  +
+ error + +
+ complex +
+
error +
error while trying to create/delete the object.
+
+
  diff --git a/docs/kubernetes.core.k8s_rollback_module.rst b/docs/kubernetes.core.k8s_rollback_module.rst index ceaa24f9..48e2d35c 100644 --- a/docs/kubernetes.core.k8s_rollback_module.rst +++ b/docs/kubernetes.core.k8s_rollback_module.rst @@ -17,7 +17,7 @@ Version added: 1.0.0 Synopsis -------- -- Use the OpenShift Python client to perform the Rollback. +- Use the Kubernetes Python client to perform the Rollback. - Authenticate using either a config file, certificates, password or token. - Similar to the ``kubectl rollout undo`` command. @@ -27,8 +27,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -39,12 +39,12 @@ Parameters - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + -
ParameterParameter Choices/Defaults Comments
+
api_key @@ -59,7 +59,7 @@ Parameters
+
api_version @@ -79,7 +79,7 @@ Parameters
+
ca_cert @@ -95,7 +95,7 @@ Parameters
+
client_cert @@ -111,7 +111,7 @@ Parameters
+
client_key @@ -127,7 +127,7 @@ Parameters
+
context @@ -142,7 +142,7 @@ Parameters
+
field_selectors @@ -158,7 +158,7 @@ Parameters
+
host @@ -173,7 +173,7 @@ Parameters
+
kind @@ -191,7 +191,7 @@ Parameters
+
kubeconfig @@ -202,11 +202,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
label_selectors @@ -222,7 +222,7 @@ Parameters
+
name @@ -240,7 +240,7 @@ Parameters
+
namespace @@ -258,7 +258,7 @@ Parameters
+
password @@ -274,7 +274,7 @@ Parameters
+
persist_config @@ -297,7 +297,7 @@ Parameters
+
proxy @@ -313,7 +313,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
username @@ -329,7 +398,7 @@ Parameters
+
validate_certs @@ -356,7 +425,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/docs/kubernetes.core.k8s_scale_module.rst b/docs/kubernetes.core.k8s_scale_module.rst index 0cb88c8d..29aadd5b 100644 --- a/docs/kubernetes.core.k8s_scale_module.rst +++ b/docs/kubernetes.core.k8s_scale_module.rst @@ -24,8 +24,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6 +- python >= 3.6 +- kubernetes >= 12.0.0 - PyYAML >= 3.11 @@ -36,12 +36,12 @@ Parameters - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - -
ParameterParameter Choices/Defaults Comments
+
api_key @@ -56,7 +56,7 @@ Parameters
+
api_version @@ -76,7 +76,7 @@ Parameters
+
ca_cert @@ -92,7 +92,7 @@ Parameters
+
client_cert @@ -108,7 +108,7 @@ Parameters
+
client_key @@ -124,7 +124,7 @@ Parameters
+
context @@ -139,7 +139,7 @@ Parameters
+
current_replicas @@ -154,7 +154,7 @@ Parameters
+
host @@ -169,7 +169,7 @@ Parameters
+
kind @@ -187,7 +187,7 @@ Parameters
+
kubeconfig @@ -198,11 +198,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
name @@ -220,7 +220,7 @@ Parameters
+
namespace @@ -238,7 +238,7 @@ Parameters
+
password @@ -254,7 +254,7 @@ Parameters
+
persist_config @@ -277,7 +277,7 @@ Parameters
+
proxy @@ -293,7 +293,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
replicas @@ -309,7 +378,7 @@ Parameters
+
resource_definition @@ -326,7 +395,7 @@ Parameters
+
resource_version @@ -341,7 +410,7 @@ Parameters
+
src @@ -358,7 +427,7 @@ Parameters
+
username @@ -374,7 +443,7 @@ Parameters
+
validate_certs @@ -394,7 +463,7 @@ Parameters
+
wait @@ -413,7 +482,7 @@ Parameters
+
wait_timeout @@ -436,7 +505,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/docs/kubernetes.core.k8s_service_module.rst b/docs/kubernetes.core.k8s_service_module.rst index 465f2057..3ac7e918 100644 --- a/docs/kubernetes.core.k8s_service_module.rst +++ b/docs/kubernetes.core.k8s_service_module.rst @@ -16,7 +16,7 @@ kubernetes.core.k8s_service Synopsis -------- -- Use Openshift Python SDK to manage Services on Kubernetes +- Use Kubernetes Python SDK to manage Services on Kubernetes @@ -24,8 +24,8 @@ Requirements ------------ The below requirements are needed on the host that executes this module. -- python >= 2.7 -- openshift >= 0.6.2 +- python >= 3.6 +- kubernetes >= 12.0.0 Parameters @@ -35,12 +35,12 @@ Parameters - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - -
ParameterParameter Choices/Defaults Comments
+
api_key @@ -55,7 +55,7 @@ Parameters
+
apply @@ -76,7 +76,7 @@ Parameters
+
ca_cert @@ -92,7 +92,7 @@ Parameters
+
client_cert @@ -108,7 +108,7 @@ Parameters
+
client_key @@ -124,7 +124,7 @@ Parameters
+
context @@ -139,7 +139,7 @@ Parameters
+
force @@ -158,7 +158,7 @@ Parameters
+
host @@ -173,7 +173,7 @@ Parameters
+
kubeconfig @@ -184,11 +184,11 @@ Parameters
-
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the openshift client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
Path to an existing Kubernetes config file. If not provided, and no other connection options are provided, the Kubernetes client will attempt to load the default configuration file from ~/.kube/config. Can also be specified via K8S_AUTH_KUBECONFIG environment variable.
+
merge_type @@ -208,13 +208,12 @@ Parameters
Whether to override the default patch merge approach with a specific type. By default, the strategic merge will typically be used.
For example, Custom Resource Definitions typically aren't updatable by the usual strategic merge. You may want to use merge if you see "strategic merge patch format is not supported"
-
Requires openshift >= 0.6.2
-
If more than one merge_type is given, the merge_types will be tried in order
-
If openshift >= 0.6.2, this defaults to ['strategic-merge', 'merge'], which is ideal for using the same parameters on resource kinds that combine Custom Resources and built-in resources. For openshift < 0.6.2, the default is simply strategic-merge.
+
If more than one merge_type is given, the merge_types will be tried in order
+
This defaults to ['strategic-merge', 'merge'], which is ideal for using the same parameters on resource kinds that combine Custom Resources and built-in resources.
+
name @@ -230,7 +229,7 @@ Parameters
+
namespace @@ -246,7 +245,7 @@ Parameters
+
password @@ -262,7 +261,7 @@ Parameters
+
persist_config @@ -285,7 +284,7 @@ Parameters
+
ports @@ -302,7 +301,7 @@ Parameters
+
proxy @@ -318,7 +317,76 @@ Parameters
+
+ proxy_headers + +
+ dictionary +
+
added in 2.0.0
+
+ +
The Header used for the HTTP proxy.
+ +
+
+ basic_auth + +
+ string +
+
+ +
Colon-separated username:password for basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_BASIC_AUTH environment.
+
+
+ proxy_basic_auth + +
+ string +
+
+ +
Colon-separated username:password for proxy basic authentication header.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_PROXY_BASIC_AUTH environment.
+
+
+ user_agent + +
+ string +
+
+ +
String representing the user-agent you want, such as foo/1.0.
+
Can also be specified via K8S_AUTH_PROXY_HEADERS_USER_AGENT environment.
+
resource_definition @@ -335,7 +403,7 @@ Parameters
+
selector @@ -351,7 +419,7 @@ Parameters
+
src @@ -368,7 +436,7 @@ Parameters
+
state @@ -387,7 +455,7 @@ Parameters
+
type @@ -409,7 +477,7 @@ Parameters
+
username @@ -425,7 +493,7 @@ Parameters
+
validate_certs @@ -452,7 +520,6 @@ Notes ----- .. note:: - - The OpenShift Python client wraps the K8s Python client, providing full access to all of the APIS and models available on both platforms. For API version details and additional information visit https://github.com/openshift/openshift-restclient-python - To avoid SSL certificate validation errors when ``validate_certs`` is *True*, the full certificate chain for the API server must be provided via ``ca_cert`` or in the kubeconfig file. diff --git a/plugins/filter/k8s.py b/plugins/filter/k8s.py index 7b8591ef..bf19ba3b 100644 --- a/plugins/filter/k8s.py +++ b/plugins/filter/k8s.py @@ -11,6 +11,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.hashes import gene def k8s_config_resource_name(resource): + """ + Generate resource name for the given resource of type ConfigMap, Secret + """ try: return resource['metadata']['name'] + '-' + generate_hash(resource) except KeyError: @@ -19,6 +22,9 @@ def k8s_config_resource_name(resource): # ---- Ansible filters ---- class FilterModule(object): + """ + + """ def filters(self): return { From 5bb827f0f4964167d7d48eef1888c4f1e7efc9e4 Mon Sep 17 00:00:00 2001 From: abikouo <79859644+abikouo@users.noreply.github.com> Date: Mon, 17 May 2021 15:17:45 +0200 Subject: [PATCH 8/8] 2.11 sanity on collection (#103) * sanity 2.11 * add repo name * repo name syntax * install requirements * update ignore * molecule tests on multiple versions * Update ci.yml --- .github/workflows/ci.yml | 12 ++++++++---- tests/sanity/ignore-2.10.txt | 3 --- tests/sanity/ignore-2.11.txt | 3 --- tests/sanity/ignore-2.12.txt | 3 --- tests/sanity/ignore-2.9.txt | 3 ++- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 01532f28..e98f925c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,6 +15,7 @@ jobs: strategy: matrix: python_version: ['3.7'] + ansible_version: ['stable-2.11', 'stable-2.10', 'stable-2.9', 'devel'] steps: - name: Check out code uses: actions/checkout@v2 @@ -26,11 +27,15 @@ jobs: with: python-version: ${{ matrix.python_version }} - - name: Install ansible base (devel branch) - run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check + - name: Check ansible version + uses: actions/checkout@v2 + with: + repository: ansible/ansible + ref: ${{ matrix.ansible_version }} + path: ansible_collections/kubernetes/core/ansible - name: Run sanity tests on Python ${{ matrix.python_version }} - run: make test-sanity PYTHON_VERSION=${{ matrix.python_version }} + run: source ./ansible/hacking/env-setup && make test-sanity PYTHON_VERSION=${{ matrix.python_version }} working-directory: ./ansible_collections/kubernetes/core integration: @@ -102,7 +107,6 @@ jobs: # run: | # pip uninstall -y ansible # pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - name: Create default collection path symlink run: | mkdir -p /home/runner/.ansible diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt index 728285d1..986bb10a 100644 --- a/tests/sanity/ignore-2.10.txt +++ b/tests/sanity/ignore-2.10.txt @@ -8,11 +8,8 @@ molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.ya molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip -plugins/module_utils/k8sdynamicclient.py import-2.7!skip plugins/module_utils/k8sdynamicclient.py import-3.7!skip -plugins/module_utils/client/discovery.py import-2.7!skip plugins/module_utils/client/discovery.py import-3.7!skip -plugins/module_utils/client/resource.py import-2.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index 728285d1..986bb10a 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -8,11 +8,8 @@ molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.ya molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip -plugins/module_utils/k8sdynamicclient.py import-2.7!skip plugins/module_utils/k8sdynamicclient.py import-3.7!skip -plugins/module_utils/client/discovery.py import-2.7!skip plugins/module_utils/client/discovery.py import-3.7!skip -plugins/module_utils/client/resource.py import-2.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index 8b748a40..2be297c2 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -8,11 +8,8 @@ molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.ya molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip -plugins/module_utils/k8sdynamicclient.py import-2.7!skip plugins/module_utils/k8sdynamicclient.py import-3.7!skip -plugins/module_utils/client/discovery.py import-2.7!skip plugins/module_utils/client/discovery.py import-3.7!skip -plugins/module_utils/client/resource.py import-2.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index 83482030..3a99de7b 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -5,8 +5,9 @@ molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.ya molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip molecule/default/roles/helm/files/test-chart/templates/configmap.yaml yamllint!skip -plugins/module_utils/k8sdynamicclient.py import-2.7!skip plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py import-3.7!skip +plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip