diff --git a/.gitignore b/.gitignore index 079e974252..43300e50c3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,8 @@ tests/integration/cloud-config-* .cache # Helm charts -molecule/default/*-chart-*.tgz +tests/integration/*-chart-*.tgz + +# ansible-test generated file +tests/integration/inventory +tests/integration/*-*.yml diff --git a/Makefile b/Makefile index 72d9fb2949..dd71f9b3e6 100644 --- a/Makefile +++ b/Makefile @@ -22,10 +22,7 @@ test-sanity: ansible-test sanity --docker -v --color --python $(PYTHON_VERSION) $(?TEST_ARGS) test-integration: - ansible-test integration --docker -v --color --retry-on-error --python $(PYTHON_VERSION) --continue-on-error --diff --coverage $(?TEST_ARGS) - -test-molecule: - molecule test + ansible-test integration --diff --no-temp-workdir --color --skip-tags False --retry-on-error --continue-on-error --python $(PYTHON_VERSION) -v --coverage $(?TEST_ARGS) test-unit: ansible-test units --docker -v --color --python $(PYTHON_VERSION) $(?TEST_ARGS) diff --git a/changelogs/fragments/exception.yml b/changelogs/fragments/exception.yml new file mode 100644 index 0000000000..1f6f16459f --- /dev/null +++ b/changelogs/fragments/exception.yml @@ -0,0 +1,3 @@ +--- +bugfixes: +- import exception from ``kubernetes.client.rest``. diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml deleted file mode 100644 index 694357c99b..0000000000 --- a/molecule/default/converge.yml +++ /dev/null @@ -1,292 +0,0 @@ ---- -- name: Converge - hosts: localhost - connection: local - - collections: - - kubernetes.core - - vars_files: - - vars/main.yml - - tasks: - - name: Verify cluster is working. - k8s_info: - namespace: kube-system - kind: Pod - register: pod_list - - - name: Verify cluster has more than 5 pods running. - assert: - that: (pod_list.resources | count) > 5 - - - name: Include access_review.yml - include_tasks: - file: tasks/access_review.yml - apply: - tags: [ access_review, k8s ] - tags: - - always - - name: Include append_hash.yml - include_tasks: - file: tasks/append_hash.yml - apply: - tags: [ append_hash, k8s ] - tags: - - always - - name: Include apply.yml - include_tasks: - file: tasks/apply.yml - apply: - tags: [ apply, k8s ] - tags: - - always - - name: Include cluster_info.yml - include_tasks: - file: tasks/cluster_info.yml - apply: - tags: [ cluster_info, k8s ] - tags: - - always - - name: Include crd.yml - include_tasks: - file: tasks/crd.yml - apply: - tags: [ crd, k8s ] - tags: - - always - - name: Include delete.yml - include_tasks: - file: tasks/delete.yml - apply: - tags: [ delete, k8s ] - tags: - - always - - name: Include exec.yml - include_tasks: - file: tasks/exec.yml - apply: - tags: [ exec, k8s ] - tags: - - always - - name: Include full.yml - include_tasks: - file: tasks/full.yml - apply: - tags: [ full, k8s ] - tags: - - always - - name: Include gc.yml - include_tasks: - file: tasks/gc.yml - apply: - tags: [ gc, k8s ] - tags: - - always - - name: Include info.yml - include_tasks: - file: tasks/info.yml - apply: - tags: [ info, k8s ] - tags: - - always - - name: Include json_patch.yml - include_tasks: - file: tasks/json_patch.yml - apply: - tags: [ json_patch, k8s ] - tags: - - always - - name: Include lists.yml - include_tasks: - file: tasks/lists.yml - apply: - tags: [ lists, k8s ] - tags: - - always - - name: Include log.yml - include_tasks: - file: tasks/log.yml - apply: - tags: [ log, k8s ] - tags: - - always - - name: Include rollback.yml - include_tasks: - file: tasks/rollback.yml - apply: - tags: [ rollback, k8s ] - tags: - - always - - name: Include scale.yml - include_tasks: - file: tasks/scale.yml - apply: - tags: [ scale, k8s ] - tags: - - always - - name: Include template.yml - include_tasks: - file: tasks/template.yml - apply: - tags: [ template, k8s ] - tags: - - always - - - name: Include validate.yml - include_tasks: - file: tasks/validate.yml - apply: - tags: [ validate, k8s ] - tags: - - always - - - name: Include waiter.yml - include_tasks: - file: tasks/waiter.yml - apply: - tags: [ waiter, k8s ] - tags: - - always - - - name: Include merge_type.yml - include_tasks: - file: tasks/merge_type.yml - apply: - tags: [ merge_type, k8s ] - tags: - - always - - - name: Include patched.yml - include_tasks: - file: tasks/patched.yml - apply: - tags: [ patched, k8s ] - tags: - - always - - - name: Include lookup_k8s.yml - include_tasks: - file: tasks/lookup_k8s.yml - apply: - tags: [ lookup_k8s, k8s ] - tags: - - always - - - name: Include label_selectors.yml - include_tasks: - file: tasks/label_selectors.yml - apply: - tags: [ label_selectors, k8s ] - tags: - - always - - - name: Include diff.yml - include_tasks: - file: tasks/diff.yml - apply: - tags: [ diff, k8s ] - tags: - - always - - - name: Include lookup_kustomize.yml - include_tasks: - file: tasks/lookup_kustomize.yml - apply: - tags: [ lookup_kustomize, k8s ] - tags: - - always - - roles: - - role: helm - tags: - - helm - - - role: k8scopy - tags: - - copy - - k8s - - post_tasks: - - name: Ensure namespace exists - k8s: - api_version: v1 - kind: Namespace - name: inventory - - - name: Add a deployment - k8s: - definition: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: inventory - namespace: inventory - spec: - replicas: 1 - selector: - matchLabels: - app: "{{ k8s_pod_name }}" - template: "{{ k8s_pod_template }}" - wait: yes - wait_timeout: 120 - vars: - k8s_pod_name: inventory - k8s_pod_image: python - k8s_pod_command: - - python - - '-m' - - http.server - k8s_pod_env: - - name: TEST - value: test - - - meta: refresh_inventory - -- name: Verify inventory and connection plugins - hosts: namespace_inventory_pods - gather_facts: no - - vars: - file_content: | - Hello world - - tasks: - - name: End play if host not running (TODO should we not add these to the inventory?) - meta: end_host - when: pod_phase != "Running" - - - debug: var=hostvars - - setup: - - - debug: var=ansible_facts - - - name: Assert the TEST environment variable was retrieved - assert: - that: ansible_facts.env.TEST == 'test' - - - name: Copy a file into the host - copy: - content: '{{ file_content }}' - dest: /tmp/test_file - - - name: Retrieve the file from the host - slurp: - src: /tmp/test_file - register: slurped_file - - - name: Assert the file content matches expectations - assert: - that: (slurped_file.content|b64decode) == file_content - -- name: Delete inventory namespace - hosts: localhost - connection: local - gather_facts: no - tasks: - - name: Remove inventory namespace - k8s: - api_version: v1 - kind: Namespace - name: inventory - state: absent diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml deleted file mode 100644 index c037ff9cda..0000000000 --- a/molecule/default/molecule.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- -driver: - name: delegated - options: - managed: false - login_cmd_template: 'docker exec -ti {instance} bash' - ansible_connection_options: - ansible_connection: docker -platforms: - - name: instance-kind -provisioner: - name: ansible - log: true - config_options: - inventory: - enable_plugins: kubernetes.core.k8s,yaml - lint: {} - inventory: - hosts: - plugin: kubernetes.core.k8s - host_vars: - localhost: - ansible_python_interpreter: '{{ ansible_playbook_python }}' - env: - ANSIBLE_FORCE_COLOR: 'true' - options: - vvv: True -scenario: - name: default - test_sequence: - - dependency - - syntax - - prepare - - converge - - verify diff --git a/molecule/default/prepare.yml b/molecule/default/prepare.yml deleted file mode 100644 index 5853460e9a..0000000000 --- a/molecule/default/prepare.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: Prepare - hosts: localhost - connection: local - - collections: - - kubernetes.core - - tasks: - - name: Include drain.yml - include_tasks: - file: tasks/drain.yml diff --git a/molecule/default/roles/k8scopy/library/kubectl_file_compare.py b/molecule/default/roles/k8scopy/library/kubectl_file_compare.py deleted file mode 100644 index 2487febd8c..0000000000 --- a/molecule/default/roles/k8scopy/library/kubectl_file_compare.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2021, Aubin Bikouo <@abikouo> -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - - -DOCUMENTATION = r''' - -module: kubectl_file_compare - -short_description: Compare file and directory using kubectl - -author: - - Aubin Bikouo (@abikouo) - -description: - - This module is used to validate k8s_cp module. - - Compare the local file/directory with the remote pod version - -notes: - - This module authenticates on kubernetes cluster using default kubeconfig only. - -options: - namespace: - description: - - The pod namespace name - type: str - required: yes - pod: - description: - - The pod name - type: str - required: yes - container: - description: - - The container to retrieve files from. - type: str - remote_path: - description: - - Path of the file or directory on Pod. - type: path - required: yes - local_path: - description: - - Path of the local file or directory. - type: path - content: - description: - - local content to compare with remote file from pod. - - mutually exclusive with option I(local_path). - type: path - required: yes - args: - description: - - The file is considered to be an executable. - - The tool will be run locally and on pod and compare result from output and stderr. - type: list - kubectl_path: - description: - - Path to the kubectl executable, if not specified it will be download. - type: path -''' - -EXAMPLES = r''' -- name: compare local /tmp/foo with /tmp/bar in a remote pod - kubectl_file_compare: - namespace: some-namespace - pod: some-pod - remote_path: /tmp/bar - local_path: /tmp/foo - kubectl_path: /tmp/test/kubectl - -- name: Compare executable running help command - kubectl_file_compare: - namespace: some-namespace - pod: some-pod - remote_path: /tmp/test/kubectl - local_path: kubectl - kubectl_path: /tmp/test/kubectl - args: - - "--help" -''' - - -RETURN = r''' -''' - -import os -import filecmp - -from tempfile import NamedTemporaryFile, TemporaryDirectory -from ansible.module_utils.basic import AnsibleModule - - -def kubectl_get_content(module, dest_dir): - kubectl_path = module.params.get('kubectl_path') - if kubectl_path is None: - kubectl_path = module.get_bin_path('kubectl', required=True) - - namespace = module.params.get('namespace') - pod = module.params.get('pod') - file = module.params.get('remote_path') - - cmd = [ - kubectl_path, - 'cp', - "{0}/{1}:{2}".format(namespace, pod, file) - ] - container = module.params.get('container') - if container: - cmd += ['-c', container] - local_file = os.path.join(dest_dir, os.path.basename(module.params.get('remote_path'))) - cmd.append(local_file) - rc, out, err = module.run_command(cmd) - return local_file, err, rc, out - - -def kubectl_run_from_pod(module): - kubectl_path = module.params.get('kubectl_path') - if kubectl_path is None: - kubectl_path = module.get_bin_path('kubectl', required=True) - - cmd = [ - kubectl_path, - 'exec', - module.params.get('pod'), - '-n', - module.params.get('namespace') - ] - container = module.params.get('container') - if container: - cmd += ['-c', container] - cmd += ['--', module.params.get('remote_path')] - cmd += module.params.get('args') - return module.run_command(cmd) - - -def compare_directories(dir1, dir2): - test = filecmp.dircmp(dir1, dir2) - if any([len(test.left_only) > 0, len(test.right_only) > 0, len(test.funny_files) > 0]): - return False - (t, mismatch, errors) = filecmp.cmpfiles(dir1, dir2, test.common_files, shallow=False) - if len(mismatch) > 0 or len(errors) > 0: - return False - for common_dir in test.common_dirs: - new_dir1 = os.path.join(dir1, common_dir) - new_dir2 = os.path.join(dir2, common_dir) - if not compare_directories(new_dir1, new_dir2): - return False - return True - - -def execute_module(module): - - args = module.params.get('args') - local_path = module.params.get('local_path') - namespace = module.params.get('namespace') - pod = module.params.get('pod') - file = module.params.get('remote_path') - content = module.params.get('content') - if args: - pod_rc, pod_out, pod_err = kubectl_run_from_pod(module) - rc, out, err = module.run_command([module.params.get('local_path')] + args) - if rc == pod_rc and out == pod_out: - module.exit_json(msg="{0} and {1}/{2}:{3} are same.".format( - local_path, namespace, pod, file - ), rc=rc, stderr=err, stdout=out) - result = dict(local=dict(rc=rc, out=out, err=err), remote=dict(rc=pod_rc, out=pod_out, err=pod_err)) - module.fail_json(msg=f"{local_path} and {namespace}/{pod}:{file} are same.", **result) - else: - with TemporaryDirectory() as tmpdirname: - file_from_pod, err, rc, out = kubectl_get_content(module=module, dest_dir=tmpdirname) - if not os.path.exists(file_from_pod): - module.fail_json(msg="failed to copy content from pod", error=err, output=out) - - if content is not None: - with NamedTemporaryFile(mode="w") as tmp_file: - tmp_file.write(content) - tmp_file.flush() - if filecmp.cmp(file_from_pod, tmp_file.name): - module.exit_json(msg=f"defined content and {namespace}/{pod}:{file} are same.") - module.fail_json(msg=f"defined content and {namespace}/{pod}:{file} are same.") - - if os.path.isfile(local_path): - if filecmp.cmp(file_from_pod, local_path): - module.exit_json(msg=f"{local_path} and {namespace}/{pod}:{file} are same.") - module.fail_json(msg=f"{local_path} and {namespace}/{pod}:{file} are same.") - - if os.path.isdir(local_path): - if compare_directories(file_from_pod, local_path): - module.exit_json(msg=f"{local_path} and {namespace}/{pod}:{file} are same.") - module.fail_json(msg=f"{local_path} and {namespace}/{pod}:{file} are same.") - - -def main(): - argument_spec = {} - argument_spec['namespace'] = {'type': 'str', 'required': True} - argument_spec['pod'] = {'type': 'str', 'required': True} - argument_spec['container'] = {} - argument_spec['remote_path'] = {'type': 'path', 'required': True} - argument_spec['local_path'] = {'type': 'path'} - argument_spec['content'] = {'type': 'str'} - argument_spec['kubectl_path'] = {'type': 'path'} - argument_spec['args'] = {'type': 'list'} - module = AnsibleModule(argument_spec=argument_spec, - mutually_exclusive=[('local_path', 'content')], - required_one_of=[['local_path', 'content']]) - - execute_module(module) - - -if __name__ == '__main__': - main() diff --git a/plugins/modules/k8s_drain.py b/plugins/modules/k8s_drain.py index abde846969..f24754fbf0 100644 --- a/plugins/modules/k8s_drain.py +++ b/plugins/modules/k8s_drain.py @@ -119,20 +119,40 @@ type: str ''' import copy -from datetime import datetime import time -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 +import traceback + +from datetime import datetime +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, +) from ansible.module_utils._text import to_native try: from kubernetes.client.api import core_v1_api - from kubernetes.client.models import V1beta1Eviction, V1DeleteOptions + from kubernetes.client.models import V1DeleteOptions from kubernetes.client.exceptions import ApiException except ImportError: # ImportError are managed by the common module already. pass +HAS_EVICTION_API = True +k8s_import_exception = None +K8S_IMP_ERR = None + +try: + from kubernetes.client.models import V1beta1Eviction as v1_eviction +except ImportError: + try: + from kubernetes.client.models import V1Eviction as v1_eviction + except ImportError as e: + k8s_import_exception = e + K8S_IMP_ERR = traceback.format_exc() + HAS_EVICTION_API = False + def filter_pods(pods, force, ignore_daemonset): k8s_kind_mirror = "kubernetes.io/config.mirror" @@ -271,8 +291,10 @@ def evict_pods(self, pods): body = V1DeleteOptions(**definition) self._api_instance.delete_namespaced_pod(name=name, namespace=namespace, body=body) else: - body = V1beta1Eviction(**definition) - self._api_instance.create_namespaced_pod_eviction(name=name, namespace=namespace, body=body) + body = v1_eviction(**definition) + self._api_instance.create_namespaced_pod_eviction( + name=name, namespace=namespace, body=body + ) self._changed = True except ApiException as exc: if exc.reason != "Not Found": @@ -404,6 +426,13 @@ def argspec(): def main(): module = AnsibleModule(argument_spec=argspec()) + if not HAS_EVICTION_API: + module.fail_json( + msg="The kubernetes Python library missing with V1Eviction API", + exception=K8S_IMP_ERR, + error=to_native(k8s_import_exception), + ) + k8s_drain = K8sDrainAnsible(module) k8s_drain.execute_module() diff --git a/tests/integration/targets/helm/aliases b/tests/integration/targets/helm/aliases new file mode 100644 index 0000000000..7bc4476eac --- /dev/null +++ b/tests/integration/targets/helm/aliases @@ -0,0 +1,8 @@ +# slow - 11min +slow +time=313 +helm_info +helm_plugin +helm_plugin_info +helm_repository +helm_template diff --git a/molecule/default/roles/helm/defaults/main.yml b/tests/integration/targets/helm/defaults/main.yml similarity index 70% rename from molecule/default/roles/helm/defaults/main.yml rename to tests/integration/targets/helm/defaults/main.yml index 26c0a1e957..d96176de00 100644 --- a/molecule/default/roles/helm/defaults/main.yml +++ b/tests/integration/targets/helm/defaults/main.yml @@ -1,10 +1,6 @@ --- helm_archive_name: "helm-{{ helm_version }}-{{ ansible_system | lower }}-amd64.tar.gz" helm_binary: "/tmp/helm/{{ ansible_system | lower }}-amd64/helm" -helm_namespace: helm - -tiller_namespace: tiller -tiller_cluster_role: cluster-admin chart_test: "ingress-nginx" chart_test_local_path: "nginx-ingress" @@ -17,3 +13,15 @@ chart_test_git_repo: "http://github.com/helm/charts.git" chart_test_values: revisionHistoryLimit: 0 myValue: "changed" + +test_namespace: + - "helm-diff" + - "helm-envvars" + - "helm-uninstall" + - "helm-not-installed" + - "helm-crd" + - "helm-url" + - "helm-repository" + - "helm-local-path-001" + - "helm-local-path-002" + - "helm-local-path-003" diff --git a/molecule/default/roles/helm/files/appversionless-chart-v2/Chart.yaml b/tests/integration/targets/helm/files/appversionless-chart-v2/Chart.yaml similarity index 100% rename from molecule/default/roles/helm/files/appversionless-chart-v2/Chart.yaml rename to tests/integration/targets/helm/files/appversionless-chart-v2/Chart.yaml diff --git a/molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml b/tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml similarity index 100% rename from molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml rename to tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml diff --git a/molecule/default/roles/helm/files/appversionless-chart/Chart.yaml b/tests/integration/targets/helm/files/appversionless-chart/Chart.yaml similarity index 100% rename from molecule/default/roles/helm/files/appversionless-chart/Chart.yaml rename to tests/integration/targets/helm/files/appversionless-chart/Chart.yaml diff --git a/molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml b/tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml similarity index 100% rename from molecule/default/roles/helm/files/appversionless-chart/templates/configmap.yaml rename to tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml diff --git a/molecule/default/roles/helm/files/sample_plugin/plugin.yaml b/tests/integration/targets/helm/files/sample_plugin/plugin.yaml similarity index 100% rename from molecule/default/roles/helm/files/sample_plugin/plugin.yaml rename to tests/integration/targets/helm/files/sample_plugin/plugin.yaml diff --git a/molecule/default/roles/helm/files/test-chart-v2/Chart.yaml b/tests/integration/targets/helm/files/test-chart-v2/Chart.yaml similarity index 100% rename from molecule/default/roles/helm/files/test-chart-v2/Chart.yaml rename to tests/integration/targets/helm/files/test-chart-v2/Chart.yaml diff --git a/molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml b/tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml similarity index 100% rename from molecule/default/roles/helm/files/test-chart-v2/templates/configmap.yaml rename to tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml diff --git a/molecule/default/roles/helm/files/test-chart/Chart.yaml b/tests/integration/targets/helm/files/test-chart/Chart.yaml similarity index 100% rename from molecule/default/roles/helm/files/test-chart/Chart.yaml rename to tests/integration/targets/helm/files/test-chart/Chart.yaml diff --git a/molecule/default/roles/helm/files/test-chart/templates/configmap.yaml b/tests/integration/targets/helm/files/test-chart/templates/configmap.yaml similarity index 100% rename from molecule/default/roles/helm/files/test-chart/templates/configmap.yaml rename to tests/integration/targets/helm/files/test-chart/templates/configmap.yaml diff --git a/molecule/default/roles/helm/files/test-crds/Chart.yaml b/tests/integration/targets/helm/files/test-crds/Chart.yaml similarity index 100% rename from molecule/default/roles/helm/files/test-crds/Chart.yaml rename to tests/integration/targets/helm/files/test-crds/Chart.yaml diff --git a/molecule/default/roles/helm/files/test-crds/crds/crd.yaml b/tests/integration/targets/helm/files/test-crds/crds/crd.yaml similarity index 88% rename from molecule/default/roles/helm/files/test-crds/crds/crd.yaml rename to tests/integration/targets/helm/files/test-crds/crds/crd.yaml index b63ddc9dbf..ac2853137c 100644 --- a/molecule/default/roles/helm/files/test-crds/crds/crd.yaml +++ b/tests/integration/targets/helm/files/test-crds/crds/crd.yaml @@ -1,9 +1,9 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: foos.example.com + name: foos.ansible.com spec: - group: example.com + group: ansible.com versions: - name: v1 served: true diff --git a/molecule/default/roles/helm/files/values.yaml b/tests/integration/targets/helm/files/values.yaml similarity index 100% rename from molecule/default/roles/helm/files/values.yaml rename to tests/integration/targets/helm/files/values.yaml diff --git a/tests/integration/targets/helm/library/helm_test_version.py b/tests/integration/targets/helm/library/helm_test_version.py new file mode 100644 index 0000000000..6b76577866 --- /dev/null +++ b/tests/integration/targets/helm/library/helm_test_version.py @@ -0,0 +1,95 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2021, Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = r""" +--- +module: helm_test_version +short_description: check helm executable version +author: + - Aubin Bikouo (@abikouo) +requirements: + - "helm (https://github.com/helm/helm/releases)" +description: + - validate version of helm binary is lower than the specified version. +options: + binary_path: + description: + - The path of a helm binary to use. + required: false + type: path + version: + description: + - version to test against helm binary. + type: str + default: 3.7.0 +""" + +EXAMPLES = r""" +- name: validate helm binary version is lower than 3.5.0 + helm_test_version: + binary_path: path/to/helm + version: "3.5.0" +""" + +RETURN = r""" +message: + type: str + description: Text message describing the test result. + returned: always + sample: 'version installed: 3.4.5 is lower than version 3.5.0' +result: + type: bool + description: Test result. + returned: always + sample: 1 +""" + +import re +from ansible_collections.kubernetes.core.plugins.module_utils.version import ( + LooseVersion, +) + +from ansible.module_utils.basic import AnsibleModule + + +def main(): + module = AnsibleModule( + argument_spec=dict( + binary_path=dict(type="path"), version=dict(type="str", default="3.7.0"), + ), + ) + + bin_path = module.params.get("binary_path") + version = module.params.get("version") + + if bin_path is not None: + helm_cmd_common = bin_path + else: + helm_cmd_common = "helm" + + helm_cmd_common = module.get_bin_path(helm_cmd_common, required=True) + rc, out, err = module.run_command([helm_cmd_common, "version"]) + if rc != 0: + module.fail_json(msg="helm version failed.", err=err, out=out, rc=rc) + + m = re.match(r'version.BuildInfo{Version:"v([0-9\.]*)",', out) + installed_version = m.group(1) + + message = "version installed: %s" % installed_version + if LooseVersion(installed_version) < LooseVersion(version): + message += " is lower than version %s" % version + module.exit_json(changed=False, result=True, message=message) + else: + message += " is greater than version %s" % version + module.exit_json(changed=False, result=False, message=message) + + +if __name__ == "__main__": + main() diff --git a/molecule/default/roles/k8scopy/meta/main.yml b/tests/integration/targets/helm/meta/main.yml similarity index 51% rename from molecule/default/roles/k8scopy/meta/main.yml rename to tests/integration/targets/helm/meta/main.yml index d05af689a7..79869fd3d3 100644 --- a/molecule/default/roles/k8scopy/meta/main.yml +++ b/tests/integration/targets/helm/meta/main.yml @@ -1,3 +1,5 @@ --- collections: - kubernetes.core +dependencies: + - remove_namespace diff --git a/molecule/default/roles/helm/tasks/install.yml b/tests/integration/targets/helm/tasks/install.yml similarity index 100% rename from molecule/default/roles/helm/tasks/install.yml rename to tests/integration/targets/helm/tasks/install.yml diff --git a/molecule/default/roles/helm/tasks/main.yml b/tests/integration/targets/helm/tasks/main.yml similarity index 100% rename from molecule/default/roles/helm/tasks/main.yml rename to tests/integration/targets/helm/tasks/main.yml diff --git a/molecule/default/roles/helm/tasks/run_test.yml b/tests/integration/targets/helm/tasks/run_test.yml similarity index 100% rename from molecule/default/roles/helm/tasks/run_test.yml rename to tests/integration/targets/helm/tasks/run_test.yml diff --git a/molecule/default/roles/helm/tasks/test_crds.yml b/tests/integration/targets/helm/tasks/test_crds.yml similarity index 81% rename from molecule/default/roles/helm/tasks/test_crds.yml rename to tests/integration/targets/helm/tasks/test_crds.yml index f8370f4a3c..45637ce7a9 100644 --- a/molecule/default/roles/helm/tasks/test_crds.yml +++ b/tests/integration/targets/helm/tasks/test_crds.yml @@ -6,7 +6,7 @@ - name: Create namespace k8s: kind: Namespace - name: "{{ helm_namespace }}" + name: "{{ test_namespace[4] }}" - name: Copy test chart copy: @@ -17,7 +17,7 @@ helm: binary_path: "{{ helm_binary }}" chart_ref: "/tmp/helm_test_crds/{{ test_chart }}" - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[4] }}" name: test-crds skip_crds: true register: install @@ -30,10 +30,10 @@ - name: Fail to create custom resource k8s: definition: - apiVersion: example.com/v1 + apiVersion: ansible.com/v1 kind: Foo metadata: - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[4] }}" name: test-foo foobar: footest ignore_errors: true @@ -42,13 +42,13 @@ - assert: that: - result is failed - - "result.msg.startswith('Failed to find exact match for example.com/v1.Foo')" + - "result.msg.startswith('Failed to find exact match for ansible.com/v1.Foo')" # Helm won't install CRDs into an existing release, so we need to delete this, first - name: Uninstall chart helm: binary_path: "{{ helm_binary }}" - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[4] }}" name: test-crds state: absent @@ -56,16 +56,16 @@ helm: binary_path: "{{ helm_binary }}" chart_ref: "/tmp/helm_test_crds/{{ test_chart }}" - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[4] }}" name: test-crds - name: Create custom resource k8s: definition: - apiVersion: example.com/v1 + apiVersion: ansible.com/v1 kind: Foo metadata: - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[4] }}" name: test-foo foobar: footest register: result @@ -85,16 +85,14 @@ - name: Remove namespace k8s: kind: Namespace - name: "{{ helm_namespace }}" + name: "{{ test_namespace[4] }}" state: absent - wait: true - wait_timeout: 180 ignore_errors: true # CRDs aren't deleted with a namespace, so we need to manually delete it - name: Remove CRD k8s: kind: CustomResourceDefinition - name: foos.example.com + name: foos.ansible.com state: absent ignore_errors: true diff --git a/molecule/default/roles/helm/tasks/test_helm_not_installed.yml b/tests/integration/targets/helm/tasks/test_helm_not_installed.yml similarity index 89% rename from molecule/default/roles/helm/tasks/test_helm_not_installed.yml rename to tests/integration/targets/helm/tasks/test_helm_not_installed.yml index 0832dcb028..e683fc09de 100644 --- a/molecule/default/roles/helm/tasks/test_helm_not_installed.yml +++ b/tests/integration/targets/helm/tasks/test_helm_not_installed.yml @@ -4,7 +4,7 @@ binary_path: "{{ helm_binary}}_fake" name: test chart_ref: "{{ chart_test }}" - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[3] }}" ignore_errors: yes register: helm_missing_binary diff --git a/molecule/default/roles/helm/tasks/test_read_envvars.yml b/tests/integration/targets/helm/tasks/test_read_envvars.yml similarity index 89% rename from molecule/default/roles/helm/tasks/test_read_envvars.yml rename to tests/integration/targets/helm/tasks/test_read_envvars.yml index b167d59e13..379b28ed96 100644 --- a/molecule/default/roles/helm/tasks/test_read_envvars.yml +++ b/tests/integration/targets/helm/tasks/test_read_envvars.yml @@ -3,7 +3,7 @@ binary_path: "{{ helm_binary }}" state: absent name: does-not-exist - namespace: "{{ helm_namespace }}" + namespace: "{{ test_namespace[1] }}" environment: K8S_AUTH_HOST: somewhere register: _helm_result diff --git a/molecule/default/roles/helm/tasks/tests_chart.yml b/tests/integration/targets/helm/tasks/tests_chart.yml similarity index 90% rename from molecule/default/roles/helm/tasks/tests_chart.yml rename to tests/integration/targets/helm/tasks/tests_chart.yml index 2199991cf7..ad0b9791e0 100644 --- a/molecule/default/roles/helm/tasks/tests_chart.yml +++ b/tests/integration/targets/helm/tasks/tests_chart.yml @@ -1,5 +1,8 @@ --- - name: Chart tests + vars: + chart_release_name: "test-{{ chart_name | default(source) }}" + chart_release_replaced_name: "test-{{ chart_name | default(source) }}-001" block: - name: Create temp directory tempfile: @@ -13,7 +16,7 @@ - name: Check helm_info empty helm_info: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" namespace: "{{ helm_namespace }}" register: empty_info @@ -25,7 +28,7 @@ - name: "Install fail {{ chart_test }} from {{ source }}" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -41,7 +44,7 @@ - name: "Install {{ chart_test }} from {{ source }} in check mode" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -59,7 +62,7 @@ - name: "Install {{ chart_test }} from {{ source }}" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -76,7 +79,7 @@ - name: Check helm_info content helm_info: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" namespace: "{{ helm_namespace }}" register: content_info @@ -89,7 +92,7 @@ - name: Check idempotency helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -105,7 +108,7 @@ - name: "Add vars to {{ chart_test }} from {{ source }}" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -123,7 +126,7 @@ - name: Check idempotency after adding vars helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -141,7 +144,7 @@ - name: "Remove Vars to {{ chart_test }} from {{ source }}" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -158,7 +161,7 @@ - name: Check idempotency after removing vars helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -175,7 +178,7 @@ - name: "Upgrade {{ chart_test }} from {{ source }}" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source_upgrade | default(chart_source) }}" chart_version: "{{ chart_source_version_upgrade | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -191,7 +194,7 @@ - name: Check idempotency after upgrade helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source_upgrade | default(chart_source) }}" chart_version: "{{ chart_source_version_upgrade | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -208,7 +211,7 @@ helm: binary_path: "{{ helm_binary }}" state: absent - name: test + name: "{{ chart_release_name }}" namespace: "{{ helm_namespace }}" register: install @@ -221,7 +224,7 @@ helm: binary_path: "{{ helm_binary }}" state: absent - name: test + name: "{{ chart_release_name }}" namespace: "{{ helm_namespace }}" register: install @@ -234,7 +237,7 @@ - name: Install chart for replace option helm: binary_path: "{{ helm_binary }}" - name: test-0001 + name: "{{ chart_release_replaced_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -245,11 +248,11 @@ that: - install is changed - - name: Remove {{ chart_test }} with --purge + - name: "Remove {{ chart_release_replaced_name }} with --purge" helm: binary_path: "{{ helm_binary }}" state: absent - name: test-0001 + name: "{{ chart_release_replaced_name }}" purge: False namespace: "{{ helm_namespace }}" register: install @@ -259,10 +262,10 @@ that: - install is changed - - name: Install chart again with same name test-0001 + - name: "Install chart again with same name {{ chart_release_replaced_name }}" helm: binary_path: "{{ helm_binary }}" - name: test-0001 + name: "{{ chart_release_replaced_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -278,7 +281,7 @@ helm: binary_path: "{{ helm_binary }}" state: absent - name: test-0001 + name: "{{ chart_release_replaced_name }}" namespace: "{{ helm_namespace }}" register: install @@ -290,7 +293,7 @@ - name: "Install {{ chart_test }} from {{ source }} with values_files" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -309,7 +312,7 @@ - name: "Install {{ chart_test }} from {{ source }} with values_files (again)" helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -351,7 +354,7 @@ - name: Release using non-existent context helm: binary_path: "{{ helm_binary }}" - name: test + name: "{{ chart_release_name }}" chart_ref: "{{ chart_source }}" chart_version: "{{ chart_source_version | default(omit) }}" namespace: "{{ helm_namespace }}" @@ -379,5 +382,3 @@ kind: Namespace name: "{{ helm_namespace }}" state: absent - wait: true - wait_timeout: 180 diff --git a/molecule/default/roles/helm/tasks/tests_chart/from_local_path.yml b/tests/integration/targets/helm/tasks/tests_chart/from_local_path.yml similarity index 94% rename from molecule/default/roles/helm/tasks/tests_chart/from_local_path.yml rename to tests/integration/targets/helm/tasks/tests_chart/from_local_path.yml index 5f5216e786..f29b3e2c30 100644 --- a/molecule/default/roles/helm/tasks/tests_chart/from_local_path.yml +++ b/tests/integration/targets/helm/tasks/tests_chart/from_local_path.yml @@ -22,6 +22,8 @@ chart_source_upgrade: "/tmp/helm_test_repo_upgrade/stable/{{ chart_test_local_path }}/" chart_test_version: "{{ chart_test_version_local_path }}" chart_test_version_upgrade: "{{ chart_test_version_upgrade_local_path }}" + chart_name: "local-path-001" + helm_namespace: "{{ test_namespace[7] }}" - name: Test appVersion idempotence vars: @@ -66,6 +68,8 @@ source: local_path chart_source: "/tmp/helm_test_appversion/test-chart/{{ chart_test }}-{{ chart_test_app_version }}-{{ chart_test_version }}.tgz" chart_source_upgrade: "/tmp/helm_test_appversion/test-chart/{{ chart_test }}-{{ chart_test_upgrade_app_version }}-{{ chart_test_version_upgrade }}.tgz" + chart_name: "local-path-002" + helm_namespace: "{{ test_namespace[8] }}" - name: Test appVersion handling when null vars: @@ -94,6 +98,8 @@ source: local_path chart_source: "/tmp/helm_test_appversion/test-null/{{ chart_test }}/" chart_source_upgrade: "{{ chart_test }}-{{ chart_test_version_upgrade }}.tgz" + chart_name: "local-path-003" + helm_namespace: "{{ test_namespace[9] }}" - name: Remove clone repos file: diff --git a/molecule/default/roles/helm/tasks/tests_chart/from_repository.yml b/tests/integration/targets/helm/tasks/tests_chart/from_repository.yml similarity index 92% rename from molecule/default/roles/helm/tasks/tests_chart/from_repository.yml rename to tests/integration/targets/helm/tasks/tests_chart/from_repository.yml index 566bfff981..7187bf2872 100644 --- a/molecule/default/roles/helm/tasks/tests_chart/from_repository.yml +++ b/tests/integration/targets/helm/tasks/tests_chart/from_repository.yml @@ -12,6 +12,7 @@ chart_source: "test_helm/{{ chart_test }}" chart_source_version: "{{ chart_test_version }}" chart_source_version_upgrade: "{{ chart_test_version_upgrade }}" + helm_namespace: "{{ test_namespace[6] }}" - name: Add chart repo helm_repository: diff --git a/molecule/default/roles/helm/tasks/tests_chart/from_url.yml b/tests/integration/targets/helm/tasks/tests_chart/from_url.yml similarity index 90% rename from molecule/default/roles/helm/tasks/tests_chart/from_url.yml rename to tests/integration/targets/helm/tasks/tests_chart/from_url.yml index fe1ef4b6b3..1286b401df 100644 --- a/molecule/default/roles/helm/tasks/tests_chart/from_url.yml +++ b/tests/integration/targets/helm/tasks/tests_chart/from_url.yml @@ -5,3 +5,4 @@ source: url chart_source: "https://github.com/kubernetes/ingress-nginx/releases/download/{{ chart_test }}-{{ chart_test_version }}/{{ chart_test }}-{{ chart_test_version }}.tgz" chart_source_upgrade: "https://github.com/kubernetes/ingress-nginx/releases/download/{{ chart_test }}-{{ chart_test_version_upgrade }}/{{ chart_test }}-{{ chart_test_version_upgrade }}.tgz" + helm_namespace: "{{ test_namespace[5] }}" diff --git a/molecule/default/roles/helm/tasks/tests_helm_diff.yml b/tests/integration/targets/helm/tasks/tests_helm_diff.yml similarity index 98% rename from molecule/default/roles/helm/tasks/tests_helm_diff.yml rename to tests/integration/targets/helm/tasks/tests_helm_diff.yml index 5b4ec5794b..d87006f604 100644 --- a/molecule/default/roles/helm/tasks/tests_helm_diff.yml +++ b/tests/integration/targets/helm/tasks/tests_helm_diff.yml @@ -4,6 +4,9 @@ test_chart_ref: "/tmp/test-chart" block: + - set_fact: + helm_namespace: "{{ test_namespace[0] }}" + - name: Install helm diff helm_plugin: binary_path: "{{ helm_binary }}" @@ -148,6 +151,4 @@ kind: Namespace name: "{{ helm_namespace }}" state: absent - wait: yes - wait_timeout: 180 ignore_errors: yes diff --git a/molecule/default/roles/helm/tasks/tests_helm_plugin.yml b/tests/integration/targets/helm/tasks/tests_helm_plugin.yml similarity index 100% rename from molecule/default/roles/helm/tasks/tests_helm_plugin.yml rename to tests/integration/targets/helm/tasks/tests_helm_plugin.yml diff --git a/molecule/default/roles/helm/tasks/tests_repository.yml b/tests/integration/targets/helm/tasks/tests_repository.yml similarity index 100% rename from molecule/default/roles/helm/tasks/tests_repository.yml rename to tests/integration/targets/helm/tasks/tests_repository.yml diff --git a/tests/integration/targets/inventory_k8s/aliases b/tests/integration/targets/inventory_k8s/aliases new file mode 100644 index 0000000000..c023328eb5 --- /dev/null +++ b/tests/integration/targets/inventory_k8s/aliases @@ -0,0 +1,3 @@ +context/target +time=42 +k8s diff --git a/tests/integration/targets/inventory_k8s/playbooks/play.yml b/tests/integration/targets/inventory_k8s/playbooks/play.yml new file mode 100644 index 0000000000..c62ffaebeb --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/play.yml @@ -0,0 +1,102 @@ +--- +- name: Converge + hosts: localhost + connection: local + + collections: + - kubernetes.core + + vars_files: + - vars/main.yml + + tasks: + - name: Delete existing namespace + k8s: + api_version: v1 + kind: Namespace + name: inventory + wait: yes + state: absent + + - name: Ensure namespace exists + k8s: + api_version: v1 + kind: Namespace + name: inventory + + - name: Add a deployment + k8s: + definition: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: inventory + namespace: inventory + spec: + replicas: 1 + selector: + matchLabels: + app: "{{ k8s_pod_name }}" + template: "{{ k8s_pod_template }}" + wait: yes + wait_timeout: 400 + vars: + k8s_pod_name: inventory + k8s_pod_image: python + k8s_pod_command: + - python + - '-m' + - http.server + k8s_pod_env: + - name: TEST + value: test + + - meta: refresh_inventory + +- name: Verify inventory and connection plugins + hosts: namespace_inventory_pods + gather_facts: no + + vars: + file_content: | + Hello world + + tasks: + - name: End play if host not running (TODO should we not add these to the inventory?) + meta: end_host + when: pod_phase != "Running" + + - debug: var=hostvars + - setup: + + - debug: var=ansible_facts + + - name: Assert the TEST environment variable was retrieved + assert: + that: ansible_facts.env.TEST == 'test' + + - name: Copy a file into the host + copy: + content: '{{ file_content }}' + dest: /tmp/test_file + + - name: Retrieve the file from the host + slurp: + src: /tmp/test_file + register: slurped_file + + - name: Assert the file content matches expectations + assert: + that: (slurped_file.content|b64decode) == file_content + +- name: Delete inventory namespace + hosts: localhost + connection: local + gather_facts: no + tasks: + - name: Remove inventory namespace + k8s: + api_version: v1 + kind: Namespace + name: inventory + state: absent diff --git a/tests/integration/targets/inventory_k8s/playbooks/test.inventory_k8s.yml b/tests/integration/targets/inventory_k8s/playbooks/test.inventory_k8s.yml new file mode 100644 index 0000000000..cdbb9316e6 --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/test.inventory_k8s.yml @@ -0,0 +1,2 @@ +--- +plugin: kubernetes.core.k8s diff --git a/tests/integration/targets/inventory_k8s/playbooks/vars/main.yml b/tests/integration/targets/inventory_k8s/playbooks/vars/main.yml new file mode 100644 index 0000000000..5656784f4c --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/vars/main.yml @@ -0,0 +1,38 @@ +--- +k8s_pod_metadata: + labels: + app: "{{ k8s_pod_name }}" + +k8s_pod_spec: + serviceAccount: "{{ k8s_pod_service_account }}" + containers: + - image: "{{ k8s_pod_image }}" + imagePullPolicy: Always + name: "{{ k8s_pod_name }}" + command: "{{ k8s_pod_command }}" + readinessProbe: + initialDelaySeconds: 15 + exec: + command: + - /bin/true + resources: "{{ k8s_pod_resources }}" + ports: "{{ k8s_pod_ports }}" + env: "{{ k8s_pod_env }}" + + +k8s_pod_service_account: default + +k8s_pod_resources: + limits: + cpu: "100m" + memory: "100Mi" + +k8s_pod_command: [] + +k8s_pod_ports: [] + +k8s_pod_env: [] + +k8s_pod_template: + metadata: "{{ k8s_pod_metadata }}" + spec: "{{ k8s_pod_spec }}" diff --git a/tests/integration/targets/inventory_k8s/runme.sh b/tests/integration/targets/inventory_k8s/runme.sh new file mode 100755 index 0000000000..1ec40e26de --- /dev/null +++ b/tests/integration/targets/inventory_k8s/runme.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -eux + +export ANSIBLE_INVENTORY_ENABLED=kubernetes.core.k8s,yaml +export ANSIBLE_PYTHON_INTERPRETER=auto_silent + +ansible-playbook playbooks/play.yml -i playbooks/test.inventory_k8s.yml "$@" diff --git a/tests/integration/targets/k8s_access_review/aliases b/tests/integration/targets/k8s_access_review/aliases new file mode 100644 index 0000000000..6193ad8385 --- /dev/null +++ b/tests/integration/targets/k8s_access_review/aliases @@ -0,0 +1,2 @@ +time=7 +k8s diff --git a/molecule/default/tasks/access_review.yml b/tests/integration/targets/k8s_access_review/tasks/main.yml similarity index 100% rename from molecule/default/tasks/access_review.yml rename to tests/integration/targets/k8s_access_review/tasks/main.yml diff --git a/tests/integration/targets/k8s_append_hash/aliases b/tests/integration/targets/k8s_append_hash/aliases new file mode 100644 index 0000000000..f78aec2202 --- /dev/null +++ b/tests/integration/targets/k8s_append_hash/aliases @@ -0,0 +1,2 @@ +time=14 +k8s \ No newline at end of file diff --git a/tests/integration/targets/k8s_append_hash/defaults/main.yml b/tests/integration/targets/k8s_append_hash/defaults/main.yml new file mode 100644 index 0000000000..9fc0c0b5d7 --- /dev/null +++ b/tests/integration/targets/k8s_append_hash/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "append-hash" diff --git a/tests/integration/targets/k8s_append_hash/meta/main.yml b/tests/integration/targets/k8s_append_hash/meta/main.yml new file mode 100644 index 0000000000..0cb0a524bf --- /dev/null +++ b/tests/integration/targets/k8s_append_hash/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/append_hash.yml b/tests/integration/targets/k8s_append_hash/tasks/main.yml similarity index 91% rename from molecule/default/tasks/append_hash.yml rename to tests/integration/targets/k8s_append_hash/tasks/main.yml index 9c726a3d62..3a6411e8ac 100644 --- a/molecule/default/tasks/append_hash.yml +++ b/tests/integration/targets/k8s_append_hash/tasks/main.yml @@ -3,14 +3,14 @@ - name: Ensure that append_hash namespace exists k8s: kind: Namespace - name: append-hash + name: "{{ test_namespace }}" - name: Create k8s_resource variable set_fact: k8s_resource: metadata: name: config-map-test - namespace: append-hash + namespace: "{{ test_namespace }}" apiVersion: v1 kind: ConfigMap data: @@ -46,7 +46,7 @@ definition: metadata: name: config-map-test - namespace: append-hash + namespace: "{{ test_namespace }}" apiVersion: v1 kind: ConfigMap data: @@ -65,5 +65,5 @@ - name: Ensure that namespace is removed k8s: kind: Namespace - name: append-hash + name: "{{ test_namespace }}" state: absent diff --git a/tests/integration/targets/k8s_apply/aliases b/tests/integration/targets/k8s_apply/aliases new file mode 100644 index 0000000000..5406897bbf --- /dev/null +++ b/tests/integration/targets/k8s_apply/aliases @@ -0,0 +1,5 @@ +# duration 9min +slow +k8s_service +k8s +time=192 diff --git a/molecule/default/vars/main.yml b/tests/integration/targets/k8s_apply/defaults/main.yml similarity index 92% rename from molecule/default/vars/main.yml rename to tests/integration/targets/k8s_apply/defaults/main.yml index a478de9788..c45a18d857 100644 --- a/molecule/default/vars/main.yml +++ b/tests/integration/targets/k8s_apply/defaults/main.yml @@ -37,4 +37,6 @@ k8s_pod_template: metadata: "{{ k8s_pod_metadata }}" spec: "{{ k8s_pod_spec }}" -kubernetes_role_path: ../../tests/integration/targets/kubernetes +test_namespace: "apply" + +k8s_wait_timeout: 240 diff --git a/tests/integration/targets/k8s_apply/meta/main.yml b/tests/integration/targets/k8s_apply/meta/main.yml new file mode 100644 index 0000000000..0cb0a524bf --- /dev/null +++ b/tests/integration/targets/k8s_apply/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/apply.yml b/tests/integration/targets/k8s_apply/tasks/main.yml similarity index 58% rename from molecule/default/tasks/apply.yml rename to tests/integration/targets/k8s_apply/tasks/main.yml index 18c60d832f..b613b186b1 100644 --- a/molecule/default/tasks/apply.yml +++ b/tests/integration/targets/k8s_apply/tasks/main.yml @@ -1,20 +1,17 @@ --- - block: - - set_fact: - apply_namespace: apply - - name: Ensure namespace exists k8s: definition: apiVersion: v1 kind: Namespace metadata: - name: "{{ apply_namespace }}" + name: "{{ test_namespace }}" - name: Add a configmap k8s: name: "apply-configmap" - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" definition: kind: ConfigMap apiVersion: v1 @@ -38,7 +35,7 @@ apiVersion: v1 metadata: name: "apply-configmap" - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" data: one: "1" two: "2" @@ -58,7 +55,7 @@ apiVersion: v1 metadata: name: "apply-configmap" - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" data: one: "1" two: "2" @@ -75,7 +72,7 @@ - name: Add same configmap again but using name and namespace args k8s: name: "apply-configmap" - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" definition: kind: ConfigMap apiVersion: v1 @@ -98,7 +95,7 @@ apiVersion: v1 metadata: name: "apply-configmap" - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" data: one: "1" three: "3" @@ -120,7 +117,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -138,7 +135,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -161,7 +158,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -185,7 +182,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -210,7 +207,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -239,7 +236,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -265,7 +262,7 @@ kind: Service metadata: name: apply-svc - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: app: whatever @@ -290,7 +287,7 @@ kind: ServiceAccount metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" - name: Add a deployment k8s: @@ -299,7 +296,7 @@ kind: Deployment metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: replicas: 1 selector: @@ -307,6 +304,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes vars: k8s_pod_name: apply-deploy @@ -331,7 +329,7 @@ kind: Deployment metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: replicas: 1 selector: @@ -339,6 +337,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes check_mode: yes vars: @@ -370,7 +369,7 @@ kind: Deployment metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: replicas: 1 selector: @@ -378,6 +377,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes vars: k8s_pod_name: apply-deploy @@ -409,7 +409,7 @@ kind: ServiceAccount metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" - name: Apply deployment after service account removed k8s: @@ -418,7 +418,7 @@ kind: Deployment metadata: name: apply-deploy - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" spec: replicas: 1 selector: @@ -426,6 +426,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes vars: k8s_pod_name: apply-deploy @@ -449,318 +450,6 @@ that: - deploy_after_serviceaccount_removal is failed - - name: Insert new service port - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: mesh - port: 8080 - targetPort: 8080 - - name: http - port: 8081 - targetPort: 8081 - apply: yes - register: k8s_service_4 - - - name: Check ports are correct - assert: - that: - - k8s_service_4 is changed - - k8s_service_4.result.spec.ports | length == 2 - - k8s_service_4.result.spec.ports[0].port == 8080 - - k8s_service_4.result.spec.ports[1].port == 8081 - - - name: Remove new service port (check mode) - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: http - port: 8081 - targetPort: 8081 - apply: yes - check_mode: yes - register: k8s_service_check - - - name: Check ports are correct - assert: - that: - - k8s_service_check is changed - - k8s_service_check.result.spec.ports | length == 1 - - k8s_service_check.result.spec.ports[0].port == 8081 - - - name: Remove new service port - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: http - port: 8081 - targetPort: 8081 - apply: yes - register: k8s_service_5 - - - name: Check ports are correct - assert: - that: - - k8s_service_5 is changed - - k8s_service_5.result.spec.ports | length == 1 - - k8s_service_5.result.spec.ports[0].port == 8081 - - - name: Add a serviceaccount - k8s: - definition: - apiVersion: v1 - kind: ServiceAccount - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - - - name: Add a deployment - k8s: - definition: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - spec: - replicas: 1 - selector: - matchLabels: - app: "{{ k8s_pod_name }}" - template: "{{ k8s_pod_template }}" - wait: yes - apply: yes - vars: - k8s_pod_name: apply-deploy - k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-green - k8s_pod_service_account: apply-deploy - k8s_pod_ports: - - containerPort: 8080 - name: http - protocol: TCP - - - name: Remove the serviceaccount - k8s: - state: absent - definition: - apiVersion: v1 - kind: ServiceAccount - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - - - name: Update the earlier deployment - k8s: - definition: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - spec: - replicas: 2 - selector: - matchLabels: - app: "{{ k8s_pod_name }}" - template: "{{ k8s_pod_template }}" - wait: yes - apply: yes - vars: - k8s_pod_name: apply-deploy - k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-purple - k8s_pod_service_account: apply-deploy - k8s_pod_ports: - - containerPort: 8080 - name: http - protocol: TCP - register: deploy_after_serviceaccount_removal - ignore_errors: yes - - - name: Ensure that updating deployment after service account removal failed - assert: - that: - - deploy_after_serviceaccount_removal is failed - - - name: Insert new service port - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: mesh - port: 8080 - targetPort: 8080 - - name: http - port: 8081 - targetPort: 8081 - apply: yes - register: k8s_service_4 - - - name: Check ports are correct - assert: - that: - - k8s_service_4 is changed - - k8s_service_4.result.spec.ports | length == 2 - - k8s_service_4.result.spec.ports[0].port == 8080 - - k8s_service_4.result.spec.ports[1].port == 8081 - - - name: Remove new service port (check mode) - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: http - port: 8081 - targetPort: 8081 - apply: yes - check_mode: yes - register: k8s_service_check - - - name: Check ports are correct - assert: - that: - - k8s_service_check is changed - - k8s_service_check.result.spec.ports | length == 1 - - k8s_service_check.result.spec.ports[0].port == 8081 - - - name: Remove new service port - k8s: - definition: - apiVersion: v1 - kind: Service - metadata: - name: apply-svc - namespace: "{{ apply_namespace }}" - spec: - selector: - app: whatever - ports: - - name: http - port: 8081 - targetPort: 8081 - apply: yes - register: k8s_service_5 - - - name: Check ports are correct - assert: - that: - - k8s_service_5 is changed - - k8s_service_5.result.spec.ports | length == 1 - - k8s_service_5.result.spec.ports[0].port == 8081 - - - name: Add a serviceaccount - k8s: - definition: - apiVersion: v1 - kind: ServiceAccount - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - - - name: Add a deployment - k8s: - definition: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - spec: - replicas: 1 - selector: - matchLabels: - app: "{{ k8s_pod_name }}" - template: "{{ k8s_pod_template }}" - wait: yes - apply: yes - vars: - k8s_pod_name: apply-deploy - k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-green - k8s_pod_service_account: apply-deploy - k8s_pod_ports: - - containerPort: 8080 - name: http - protocol: TCP - - - name: Remove the serviceaccount - k8s: - state: absent - definition: - apiVersion: v1 - kind: ServiceAccount - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - - - name: Update the earlier deployment - k8s: - definition: - apiVersion: apps/v1 - kind: Deployment - metadata: - name: apply-deploy - namespace: "{{ apply_namespace }}" - spec: - replicas: 2 - selector: - matchLabels: - app: "{{ k8s_pod_name }}" - template: "{{ k8s_pod_template }}" - wait: yes - apply: yes - vars: - k8s_pod_name: apply-deploy - k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:v0.10.0-purple - k8s_pod_service_account: apply-deploy - k8s_pod_ports: - - containerPort: 8080 - name: http - protocol: TCP - register: deploy_after_serviceaccount_removal - ignore_errors: yes - - - name: Ensure that updating deployment after service account removal failed - assert: - that: - - deploy_after_serviceaccount_removal is failed - - name: Add a secret k8s: definition: @@ -768,7 +457,7 @@ kind: Secret metadata: name: apply-secret - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" type: Opaque stringData: foo: bar @@ -787,7 +476,7 @@ kind: Secret metadata: name: apply-secret - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" type: Opaque stringData: foo: bar @@ -805,7 +494,7 @@ kind: Secret metadata: name: apply-secret - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" type: Opaque stringData: foo: bar @@ -824,7 +513,7 @@ kind: Secret metadata: name: apply-secret - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" type: Opaque data: foo: YmFy @@ -838,7 +527,7 @@ - name: Create network policy (egress array with empty dict) k8s: - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" apply: true definition: kind: NetworkPolicy @@ -865,7 +554,7 @@ - name: Apply network policy k8s: - namespace: "{{ apply_namespace }}" + namespace: "{{ test_namespace }}" definition: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 @@ -900,5 +589,5 @@ - name: Remove namespace k8s: kind: Namespace - name: "{{ apply_namespace }}" + name: "{{ test_namespace }}" state: absent diff --git a/tests/integration/targets/k8s_cluster_info/aliases b/tests/integration/targets/k8s_cluster_info/aliases new file mode 100644 index 0000000000..00696503c9 --- /dev/null +++ b/tests/integration/targets/k8s_cluster_info/aliases @@ -0,0 +1,2 @@ +k8s_cluster_info +time=9 diff --git a/molecule/default/tasks/cluster_info.yml b/tests/integration/targets/k8s_cluster_info/tasks/main.yml similarity index 100% rename from molecule/default/tasks/cluster_info.yml rename to tests/integration/targets/k8s_cluster_info/tasks/main.yml diff --git a/tests/integration/targets/k8s_copy/aliases b/tests/integration/targets/k8s_copy/aliases new file mode 100644 index 0000000000..1e43036077 --- /dev/null +++ b/tests/integration/targets/k8s_copy/aliases @@ -0,0 +1,4 @@ +k8s_exec +k8s_cp +k8s +time=101 diff --git a/molecule/default/roles/k8scopy/defaults/main.yml b/tests/integration/targets/k8s_copy/defaults/main.yml similarity index 91% rename from molecule/default/roles/k8scopy/defaults/main.yml rename to tests/integration/targets/k8s_copy/defaults/main.yml index 06080b065b..34fc2a265c 100644 --- a/molecule/default/roles/k8scopy/defaults/main.yml +++ b/tests/integration/targets/k8s_copy/defaults/main.yml @@ -1,6 +1,6 @@ --- # defaults file for k8copy -copy_namespace: copy +test_namespace: copy pod_with_one_container: name: pod-copy-0 diff --git a/molecule/default/roles/k8scopy/files/archive.tar b/tests/integration/targets/k8s_copy/files/archive.tar similarity index 100% rename from molecule/default/roles/k8scopy/files/archive.tar rename to tests/integration/targets/k8s_copy/files/archive.tar diff --git a/molecule/default/roles/k8scopy/files/data/ansible/collection.txt b/tests/integration/targets/k8s_copy/files/data/ansible/collection.txt similarity index 100% rename from molecule/default/roles/k8scopy/files/data/ansible/collection.txt rename to tests/integration/targets/k8s_copy/files/data/ansible/collection.txt diff --git a/molecule/default/roles/k8scopy/files/data/ansible/module.txt b/tests/integration/targets/k8s_copy/files/data/ansible/module.txt similarity index 100% rename from molecule/default/roles/k8scopy/files/data/ansible/module.txt rename to tests/integration/targets/k8s_copy/files/data/ansible/module.txt diff --git a/molecule/default/roles/k8scopy/files/data/file.txt b/tests/integration/targets/k8s_copy/files/data/file.txt similarity index 100% rename from molecule/default/roles/k8scopy/files/data/file.txt rename to tests/integration/targets/k8s_copy/files/data/file.txt diff --git a/molecule/default/roles/k8scopy/files/data/teams/ansible.txt b/tests/integration/targets/k8s_copy/files/data/teams/ansible.txt similarity index 100% rename from molecule/default/roles/k8scopy/files/data/teams/ansible.txt rename to tests/integration/targets/k8s_copy/files/data/teams/ansible.txt diff --git a/molecule/default/roles/k8scopy/files/simple_file.txt b/tests/integration/targets/k8s_copy/files/simple_file.txt similarity index 100% rename from molecule/default/roles/k8scopy/files/simple_file.txt rename to tests/integration/targets/k8s_copy/files/simple_file.txt diff --git a/molecule/default/roles/k8scopy/files/simple_zip_file.txt.gz b/tests/integration/targets/k8s_copy/files/simple_zip_file.txt.gz similarity index 100% rename from molecule/default/roles/k8scopy/files/simple_zip_file.txt.gz rename to tests/integration/targets/k8s_copy/files/simple_zip_file.txt.gz diff --git a/molecule/default/roles/k8scopy/library/k8s_create_file.py b/tests/integration/targets/k8s_copy/library/k8s_create_file.py similarity index 76% rename from molecule/default/roles/k8scopy/library/k8s_create_file.py rename to tests/integration/targets/k8s_copy/library/k8s_create_file.py index 7160e20546..6898c36a56 100644 --- a/molecule/default/roles/k8scopy/library/k8s_create_file.py +++ b/tests/integration/targets/k8s_copy/library/k8s_create_file.py @@ -8,9 +8,9 @@ __metaclass__ = type -DOCUMENTATION = r''' +DOCUMENTATION = r""" -module: k8s_diff +module: k8s_create_file short_description: Create large file with a defined size. @@ -36,18 +36,18 @@ - If this flag is set to yes, the generated file content binary data. type: bool default: False -''' +""" -EXAMPLES = r''' +EXAMPLES = r""" - name: create 150MB file k8s_diff: path: large_file.txt size: 150 -''' +""" -RETURN = r''' -''' +RETURN = r""" +""" import os @@ -57,17 +57,19 @@ def execute_module(module): try: - size = module.params.get('size') * 1024 * 1024 - path = module.params.get('path') + size = module.params.get("size") * 1024 * 1024 + path = module.params.get("path") write_mode = "w" - if module.params.get('binary'): + if module.params.get("binary"): content = os.urandom(size) write_mode = "wb" else: content = "" count = 0 while len(content) < size: - content += "This file has been generated using ansible: {0}\n".format(count) + content += "This file has been generated using ansible: {0}\n".format( + count + ) count += 1 with open(path, write_mode) as f: @@ -79,13 +81,13 @@ def execute_module(module): def main(): argument_spec = {} - argument_spec['size'] = {'type': 'int', 'default': 400} - argument_spec['path'] = {'type': 'path', 'required': True} - argument_spec['binary'] = {'type': 'bool', 'default': False} + argument_spec["size"] = {"type": "int", "default": 400} + argument_spec["path"] = {"type": "path", "required": True} + argument_spec["binary"] = {"type": "bool", "default": False} module = AnsibleModule(argument_spec=argument_spec) execute_module(module) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tests/integration/targets/k8s_copy/library/kubectl_file_compare.py b/tests/integration/targets/k8s_copy/library/kubectl_file_compare.py new file mode 100644 index 0000000000..bcf097839c --- /dev/null +++ b/tests/integration/targets/k8s_copy/library/kubectl_file_compare.py @@ -0,0 +1,247 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright: (c) 2021, Aubin Bikouo <@abikouo> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +DOCUMENTATION = r""" + +module: kubectl_file_compare + +short_description: Compare file and directory using kubectl + +author: + - Aubin Bikouo (@abikouo) + +description: + - This module is used to validate k8s_cp module. + - Compare the local file/directory with the remote pod version + +notes: + - This module authenticates on kubernetes cluster using default kubeconfig only. + +options: + namespace: + description: + - The pod namespace name + type: str + required: yes + pod: + description: + - The pod name + type: str + required: yes + container: + description: + - The container to retrieve files from. + type: str + remote_path: + description: + - Path of the file or directory on Pod. + type: path + required: yes + local_path: + description: + - Path of the local file or directory. + type: path + content: + description: + - local content to compare with remote file from pod. + - mutually exclusive with option I(local_path). + type: path + required: yes + args: + description: + - The file is considered to be an executable. + - The tool will be run locally and on pod and compare result from output and stderr. + type: list + kubectl_path: + description: + - Path to the kubectl executable, if not specified it will be download. + type: path +""" + +EXAMPLES = r""" +- name: compare local /tmp/foo with /tmp/bar in a remote pod + kubectl_file_compare: + namespace: some-namespace + pod: some-pod + remote_path: /tmp/bar + local_path: /tmp/foo + kubectl_path: /tmp/test/kubectl + +- name: Compare executable running help command + kubectl_file_compare: + namespace: some-namespace + pod: some-pod + remote_path: /tmp/test/kubectl + local_path: kubectl + kubectl_path: /tmp/test/kubectl + args: + - "--help" +""" + + +RETURN = r""" +""" + +import os +import filecmp + +from tempfile import NamedTemporaryFile, TemporaryDirectory +from ansible.module_utils.basic import AnsibleModule + + +def kubectl_get_content(module, dest_dir): + kubectl_path = module.params.get("kubectl_path") + if kubectl_path is None: + kubectl_path = module.get_bin_path("kubectl", required=True) + + namespace = module.params.get("namespace") + pod = module.params.get("pod") + file = module.params.get("remote_path") + + cmd = [kubectl_path, "cp", "{0}/{1}:{2}".format(namespace, pod, file)] + container = module.params.get("container") + if container: + cmd += ["-c", container] + local_file = os.path.join( + dest_dir, os.path.basename(module.params.get("remote_path")) + ) + cmd.append(local_file) + rc, out, err = module.run_command(cmd) + return local_file, err, rc, out + + +def kubectl_run_from_pod(module): + kubectl_path = module.params.get("kubectl_path") + if kubectl_path is None: + kubectl_path = module.get_bin_path("kubectl", required=True) + + cmd = [ + kubectl_path, + "exec", + module.params.get("pod"), + "-n", + module.params.get("namespace"), + ] + container = module.params.get("container") + if container: + cmd += ["-c", container] + cmd += ["--", module.params.get("remote_path")] + cmd += module.params.get("args") + return module.run_command(cmd) + + +def compare_directories(dir1, dir2): + test = filecmp.dircmp(dir1, dir2) + if any( + [len(test.left_only) > 0, len(test.right_only) > 0, len(test.funny_files) > 0] + ): + return False + (t, mismatch, errors) = filecmp.cmpfiles( + dir1, dir2, test.common_files, shallow=False + ) + if len(mismatch) > 0 or len(errors) > 0: + return False + for common_dir in test.common_dirs: + new_dir1 = os.path.join(dir1, common_dir) + new_dir2 = os.path.join(dir2, common_dir) + if not compare_directories(new_dir1, new_dir2): + return False + return True + + +def execute_module(module): + + args = module.params.get("args") + local_path = module.params.get("local_path") + namespace = module.params.get("namespace") + pod = module.params.get("pod") + file = module.params.get("remote_path") + content = module.params.get("content") + if args: + pod_rc, pod_out, pod_err = kubectl_run_from_pod(module) + rc, out, err = module.run_command([module.params.get("local_path")] + args) + if rc == pod_rc and out == pod_out: + module.exit_json( + msg="{0} and {1}/{2}:{3} are same.".format( + local_path, namespace, pod, file + ), + rc=rc, + stderr=err, + stdout=out, + ) + result = dict( + local=dict(rc=rc, out=out, err=err), + remote=dict(rc=pod_rc, out=pod_out, err=pod_err), + ) + module.fail_json( + msg=f"{local_path} and {namespace}/{pod}:{file} are same.", **result + ) + else: + with TemporaryDirectory() as tmpdirname: + file_from_pod, err, rc, out = kubectl_get_content( + module=module, dest_dir=tmpdirname + ) + if not os.path.exists(file_from_pod): + module.fail_json( + msg="failed to copy content from pod", error=err, output=out + ) + + if content is not None: + with NamedTemporaryFile(mode="w") as tmp_file: + tmp_file.write(content) + tmp_file.flush() + if filecmp.cmp(file_from_pod, tmp_file.name): + module.exit_json( + msg=f"defined content and {namespace}/{pod}:{file} are same." + ) + module.fail_json( + msg=f"defined content and {namespace}/{pod}:{file} are same." + ) + + if os.path.isfile(local_path): + if filecmp.cmp(file_from_pod, local_path): + module.exit_json( + msg=f"{local_path} and {namespace}/{pod}:{file} are same." + ) + module.fail_json( + msg=f"{local_path} and {namespace}/{pod}:{file} are same." + ) + + if os.path.isdir(local_path): + if compare_directories(file_from_pod, local_path): + module.exit_json( + msg=f"{local_path} and {namespace}/{pod}:{file} are same." + ) + module.fail_json( + msg=f"{local_path} and {namespace}/{pod}:{file} are same." + ) + + +def main(): + argument_spec = {} + argument_spec["namespace"] = {"type": "str", "required": True} + argument_spec["pod"] = {"type": "str", "required": True} + argument_spec["container"] = {} + argument_spec["remote_path"] = {"type": "path", "required": True} + argument_spec["local_path"] = {"type": "path"} + argument_spec["content"] = {"type": "str"} + argument_spec["kubectl_path"] = {"type": "path"} + argument_spec["args"] = {"type": "list"} + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[("local_path", "content")], + required_one_of=[["local_path", "content"]], + ) + + execute_module(module) + + +if __name__ == "__main__": + main() diff --git a/molecule/default/roles/helm/meta/main.yml b/tests/integration/targets/k8s_copy/meta/main.yml similarity index 52% rename from molecule/default/roles/helm/meta/main.yml rename to tests/integration/targets/k8s_copy/meta/main.yml index d05af689a7..4b952614cf 100644 --- a/molecule/default/roles/helm/meta/main.yml +++ b/tests/integration/targets/k8s_copy/meta/main.yml @@ -1,3 +1,5 @@ --- collections: - kubernetes.core +dependencies: + - setup_namespace diff --git a/molecule/default/roles/k8scopy/tasks/main.yml b/tests/integration/targets/k8s_copy/tasks/main.yml similarity index 95% rename from molecule/default/roles/k8scopy/tasks/main.yml rename to tests/integration/targets/k8s_copy/tasks/main.yml index dd823747df..cef8bb80ab 100644 --- a/molecule/default/roles/k8scopy/tasks/main.yml +++ b/tests/integration/targets/k8s_copy/tasks/main.yml @@ -1,4 +1,7 @@ --- +- set_fact: + copy_namespace: "{{ test_namespace }}" + - block: - name: Download kubeclt executable used to compare results get_url: diff --git a/molecule/default/roles/k8scopy/tasks/test_copy_directory.yml b/tests/integration/targets/k8s_copy/tasks/test_copy_directory.yml similarity index 100% rename from molecule/default/roles/k8scopy/tasks/test_copy_directory.yml rename to tests/integration/targets/k8s_copy/tasks/test_copy_directory.yml diff --git a/molecule/default/roles/k8scopy/tasks/test_copy_errors.yml b/tests/integration/targets/k8s_copy/tasks/test_copy_errors.yml similarity index 100% rename from molecule/default/roles/k8scopy/tasks/test_copy_errors.yml rename to tests/integration/targets/k8s_copy/tasks/test_copy_errors.yml diff --git a/molecule/default/roles/k8scopy/tasks/test_copy_file.yml b/tests/integration/targets/k8s_copy/tasks/test_copy_file.yml similarity index 100% rename from molecule/default/roles/k8scopy/tasks/test_copy_file.yml rename to tests/integration/targets/k8s_copy/tasks/test_copy_file.yml diff --git a/molecule/default/roles/k8scopy/tasks/test_copy_large_file.yml b/tests/integration/targets/k8s_copy/tasks/test_copy_large_file.yml similarity index 100% rename from molecule/default/roles/k8scopy/tasks/test_copy_large_file.yml rename to tests/integration/targets/k8s_copy/tasks/test_copy_large_file.yml diff --git a/molecule/default/roles/k8scopy/tasks/test_multi_container_pod.yml b/tests/integration/targets/k8s_copy/tasks/test_multi_container_pod.yml similarity index 100% rename from molecule/default/roles/k8scopy/tasks/test_multi_container_pod.yml rename to tests/integration/targets/k8s_copy/tasks/test_multi_container_pod.yml diff --git a/molecule/default/roles/k8scopy/templates/pods_definition.j2 b/tests/integration/targets/k8s_copy/templates/pods_definition.j2 similarity index 100% rename from molecule/default/roles/k8scopy/templates/pods_definition.j2 rename to tests/integration/targets/k8s_copy/templates/pods_definition.j2 diff --git a/tests/integration/targets/k8s_crd/aliases b/tests/integration/targets/k8s_crd/aliases new file mode 100644 index 0000000000..cd32372b35 --- /dev/null +++ b/tests/integration/targets/k8s_crd/aliases @@ -0,0 +1,2 @@ +time=22 +k8s diff --git a/tests/integration/targets/k8s_crd/defaults/main.yml b/tests/integration/targets/k8s_crd/defaults/main.yml new file mode 100644 index 0000000000..9ccaec0bd9 --- /dev/null +++ b/tests/integration/targets/k8s_crd/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "crd" diff --git a/tests/integration/targets/kubernetes/files/crd-resource.yml b/tests/integration/targets/k8s_crd/files/crd-resource.yml similarity index 100% rename from tests/integration/targets/kubernetes/files/crd-resource.yml rename to tests/integration/targets/k8s_crd/files/crd-resource.yml diff --git a/tests/integration/targets/kubernetes/files/setup-crd.yml b/tests/integration/targets/k8s_crd/files/setup-crd.yml similarity index 100% rename from tests/integration/targets/kubernetes/files/setup-crd.yml rename to tests/integration/targets/k8s_crd/files/setup-crd.yml diff --git a/tests/integration/targets/k8s_crd/meta/main.yml b/tests/integration/targets/k8s_crd/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_crd/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/crd.yml b/tests/integration/targets/k8s_crd/tasks/main.yml similarity index 58% rename from molecule/default/tasks/crd.yml rename to tests/integration/targets/k8s_crd/tasks/main.yml index 2a96610c80..f26e341916 100644 --- a/molecule/default/tasks/crd.yml +++ b/tests/integration/targets/k8s_crd/tasks/main.yml @@ -1,13 +1,8 @@ --- - block: - - name: Create a namespace - k8s: - name: crd - kind: Namespace - - name: Install custom resource definitions k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/setup-crd.yml') }}" + definition: "{{ lookup('file', 'setup-crd.yml') }}" - name: Pause 5 seconds to avoid race condition pause: @@ -15,15 +10,15 @@ - name: Create custom resource definition k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" - namespace: crd + definition: "{{ lookup('file', 'crd-resource.yml') }}" + namespace: "{{ test_namespace }}" apply: "{{ create_crd_with_apply | default(omit) }}" register: create_crd - name: Patch custom resource definition k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" - namespace: crd + definition: "{{ lookup('file', 'crd-resource.yml') }}" + namespace: "{{ test_namespace }}" register: recreate_crd ignore_errors: yes @@ -35,33 +30,32 @@ - block: - name: Recreate custom resource definition with merge_type k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" + definition: "{{ lookup('file', 'crd-resource.yml') }}" merge_type: - merge - namespace: crd + namespace: "{{ test_namespace }}" register: recreate_crd_with_merge - name: Recreate custom resource definition with merge_type list k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" + definition: "{{ lookup('file', 'crd-resource.yml') }}" merge_type: - strategic-merge - merge - namespace: crd + namespace: "{{ test_namespace }}" register: recreate_crd_with_merge_list when: recreate_crd is successful - name: Remove crd k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" - namespace: crd + definition: "{{ lookup('file', 'crd-resource.yml') }}" + namespace: "{{ test_namespace }}" state: absent always: - name: Remove crd namespace k8s: kind: Namespace - name: crd + name: "{{ test_namespace }}" state: absent - ignore_errors: yes diff --git a/tests/integration/targets/k8s_delete/aliases b/tests/integration/targets/k8s_delete/aliases new file mode 100644 index 0000000000..66de780e5a --- /dev/null +++ b/tests/integration/targets/k8s_delete/aliases @@ -0,0 +1,3 @@ +time=70 +k8s_info +k8s diff --git a/tests/integration/targets/k8s_delete/defaults/main.yml b/tests/integration/targets/k8s_delete/defaults/main.yml new file mode 100644 index 0000000000..43db9196c5 --- /dev/null +++ b/tests/integration/targets/k8s_delete/defaults/main.yml @@ -0,0 +1,25 @@ +--- +k8s_pod_template: + metadata: + labels: + app: "{{ k8s_pod_name }}" + spec: + serviceAccount: "default" + containers: + - image: "{{ k8s_pod_image }}" + imagePullPolicy: Always + name: "{{ k8s_pod_name }}" + command: [] + readinessProbe: + initialDelaySeconds: 15 + exec: + command: + - /bin/true + resources: + limits: + cpu: "100m" + memory: "100Mi" + ports: [] + env: [] + +test_namespace: "delete" diff --git a/tests/integration/targets/k8s_delete/meta/main.yml b/tests/integration/targets/k8s_delete/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_delete/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/delete.yml b/tests/integration/targets/k8s_delete/tasks/main.yml similarity index 77% rename from molecule/default/tasks/delete.yml rename to tests/integration/targets/k8s_delete/tasks/main.yml index e49ff221e2..f3dafd789e 100644 --- a/molecule/default/tasks/delete.yml +++ b/tests/integration/targets/k8s_delete/tasks/main.yml @@ -1,16 +1,5 @@ --- - block: - - set_fact: - delete_namespace: delete - - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ delete_namespace }}" - - name: Add a daemonset k8s: definition: @@ -18,14 +7,14 @@ kind: DaemonSet metadata: name: delete-daemonset - namespace: "{{ delete_namespace }}" + namespace: "{{ test_namespace }}" spec: selector: matchLabels: app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes - wait_timeout: 180 + wait_timeout: 400 vars: k8s_pod_name: delete-ds k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:1 @@ -38,7 +27,7 @@ - name: Check if pods exist k8s_info: - namespace: "{{ delete_namespace }}" + namespace: "{{ test_namespace }}" kind: Pod label_selectors: - "app={{ k8s_pod_name }}" @@ -55,13 +44,13 @@ k8s: kind: DaemonSet name: delete-daemonset - namespace: "{{ delete_namespace }}" + namespace: "{{ test_namespace }}" state: absent wait: yes - name: Show status of pods k8s_info: - namespace: "{{ delete_namespace }}" + namespace: "{{ test_namespace }}" kind: Pod label_selectors: - "app={{ k8s_pod_name }}" @@ -74,7 +63,7 @@ - name: Check if pods still exist k8s_info: - namespace: "{{ delete_namespace }}" + namespace: "{{ test_namespace }}" kind: Pod label_selectors: - "app={{ k8s_pod_name }}" @@ -91,5 +80,5 @@ - name: Remove namespace k8s: kind: Namespace - name: "{{ delete_namespace }}" + name: "{{ test_namespace }}" state: absent diff --git a/tests/integration/targets/k8s_diff/aliases b/tests/integration/targets/k8s_diff/aliases new file mode 100644 index 0000000000..05895d249e --- /dev/null +++ b/tests/integration/targets/k8s_diff/aliases @@ -0,0 +1,2 @@ +time=20 +k8s diff --git a/tests/integration/targets/k8s_diff/defaults/main.yml b/tests/integration/targets/k8s_diff/defaults/main.yml new file mode 100644 index 0000000000..5e2db246b1 --- /dev/null +++ b/tests/integration/targets/k8s_diff/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "diff" +diff_configmap: "diff-configmap" diff --git a/tests/integration/targets/k8s_diff/meta/main.yml b/tests/integration/targets/k8s_diff/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_diff/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/diff.yml b/tests/integration/targets/k8s_diff/tasks/main.yml similarity index 90% rename from molecule/default/tasks/diff.yml rename to tests/integration/targets/k8s_diff/tasks/main.yml index 0e13067b71..81e3dacc92 100644 --- a/molecule/default/tasks/diff.yml +++ b/tests/integration/targets/k8s_diff/tasks/main.yml @@ -1,20 +1,14 @@ --- -- set_fact: - diff_namespace: "diff" - diff_configmap: "diff-configmap" - - block: - - name: Ensure namespace - k8s: - kind: Namespace - name: '{{ diff_namespace }}' + - set_fact: + diff_namespace: "{{ test_namespace }}" # Using option 'apply' set to 'yes' - name: Create Pod using apply and diff set to yes k8s: namespace: '{{ diff_namespace }}' apply: yes - template: "pod_diff.j2" + template: "pod.j2" diff: yes vars: pod_name: "pod-apply" @@ -31,7 +25,7 @@ k8s: namespace: '{{ diff_namespace }}' apply: yes - template: "pod_diff.j2" + template: "pod.j2" diff: no vars: pod_name: "pod-apply" @@ -49,7 +43,7 @@ k8s: namespace: '{{ diff_namespace }}' state: present - template: "pod_diff.j2" + template: "pod.j2" vars: pod_name: "pod-patch" pod_image: "busybox:1.32.0" @@ -59,7 +53,7 @@ k8s: namespace: '{{ diff_namespace }}' state: patched - template: "pod_diff.j2" + template: "pod.j2" diff: no vars: pod_name: "pod-patch" @@ -77,7 +71,7 @@ k8s: namespace: '{{ diff_namespace }}' state: patched - template: "pod_diff.j2" + template: "pod.j2" diff: yes vars: pod_name: "pod-patch" @@ -151,3 +145,4 @@ state: absent kind: Namespace name: '{{ diff_namespace }}' + ignore_errors: true diff --git a/molecule/default/templates/pod_diff.j2 b/tests/integration/targets/k8s_diff/templates/pod.j2 similarity index 100% rename from molecule/default/templates/pod_diff.j2 rename to tests/integration/targets/k8s_diff/templates/pod.j2 diff --git a/tests/integration/targets/k8s_drain/aliases b/tests/integration/targets/k8s_drain/aliases new file mode 100644 index 0000000000..476fde2bdb --- /dev/null +++ b/tests/integration/targets/k8s_drain/aliases @@ -0,0 +1,4 @@ +k8s_drain +k8s +k8s_info +time=78 diff --git a/tests/integration/targets/k8s_drain/defaults/main.yml b/tests/integration/targets/k8s_drain/defaults/main.yml new file mode 100644 index 0000000000..918c67d29d --- /dev/null +++ b/tests/integration/targets/k8s_drain/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "drain" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_drain/meta/main.yml b/tests/integration/targets/k8s_drain/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_drain/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/drain.yml b/tests/integration/targets/k8s_drain/tasks/main.yml similarity index 93% rename from molecule/default/tasks/drain.yml rename to tests/integration/targets/k8s_drain/tasks/main.yml index 6bc2428b81..806869c16c 100644 --- a/molecule/default/tasks/drain.yml +++ b/tests/integration/targets/k8s_drain/tasks/main.yml @@ -2,15 +2,9 @@ - block: - name: Set common facts set_fact: - drain_namespace: "drain" drain_daemonset_name: "promotheus-dset" drain_pod_name: "pod-drain" - - name: Create {{ drain_namespace }} namespace - k8s: - kind: Namespace - name: '{{ drain_namespace }}' - # It seems that the default ServiceAccount can take a bit to be created # right after a cluster is brought up. This can lead to the ServiceAccount # admission controller rejecting a Pod creation request because the @@ -19,7 +13,7 @@ k8s_info: kind: ServiceAccount name: default - namespace: "{{ drain_namespace }}" + namespace: "{{ test_namespace }}" wait: yes - name: list cluster nodes @@ -42,7 +36,7 @@ - name: Deploy daemonset on cluster k8s: - namespace: '{{ drain_namespace }}' + namespace: '{{ test_namespace }}' definition: apiVersion: apps/v1 kind: DaemonSet @@ -74,8 +68,9 @@ - name: Create Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet. k8s: - namespace: '{{ drain_namespace }}' + namespace: '{{ test_namespace }}' wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: v1 kind: Pod @@ -124,7 +119,7 @@ - name: Get pods k8s_info: kind: Pod - namespace: '{{ drain_namespace }}' + namespace: '{{ test_namespace }}' register: Pod - name: assert that pods are running on cordoned node @@ -186,7 +181,7 @@ - name: assert that unmanaged pod were deleted k8s_info: - namespace: '{{ drain_namespace }}' + namespace: '{{ test_namespace }}' kind: Pod name: '{{ drain_pod_name }}' register: _result @@ -209,7 +204,7 @@ - name: Get DaemonSet k8s_info: kind: DaemonSet - namespace: '{{ drain_namespace }}' + namespace: '{{ test_namespace }}' name: '{{ drain_daemonset_name }}' register: dset_result @@ -235,4 +230,4 @@ k8s: state: absent kind: namespace - name: '{{ drain_namespace }}' + name: '{{ test_namespace }}' diff --git a/tests/integration/targets/k8s_exec/aliases b/tests/integration/targets/k8s_exec/aliases new file mode 100644 index 0000000000..334dc47987 --- /dev/null +++ b/tests/integration/targets/k8s_exec/aliases @@ -0,0 +1,3 @@ +k8s_exec +k8s +time=23 diff --git a/tests/integration/targets/k8s_exec/defaults/main.yml b/tests/integration/targets/k8s_exec/defaults/main.yml new file mode 100644 index 0000000000..d87b3e9fe4 --- /dev/null +++ b/tests/integration/targets/k8s_exec/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "k8s-exec" diff --git a/tests/integration/targets/k8s_exec/meta/main.yml b/tests/integration/targets/k8s_exec/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_exec/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/exec.yml b/tests/integration/targets/k8s_exec/tasks/main.yml similarity index 76% rename from molecule/default/tasks/exec.yml rename to tests/integration/targets/k8s_exec/tasks/main.yml index 1878f91e18..16668e4550 100644 --- a/molecule/default/tasks/exec.yml +++ b/tests/integration/targets/k8s_exec/tasks/main.yml @@ -1,13 +1,13 @@ --- - vars: - exec_namespace: k8s-exec + k8s_wait_timeout: 400 pod: sleep-pod exec_pod_definition: apiVersion: v1 kind: Pod metadata: name: "{{ pod }}" - namespace: "{{ exec_namespace }}" + namespace: "{{ test_namespace }}" spec: containers: - name: sleeper @@ -15,22 +15,17 @@ command: ["sleep", "infinity"] block: - - name: "Ensure that {{ exec_namespace }} namespace exists" - k8s: - kind: Namespace - name: "{{ exec_namespace }}" - - name: "Create a pod" k8s: definition: "{{ exec_pod_definition }}" wait: yes wait_sleep: 1 - wait_timeout: 30 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" - name: "Execute a command" k8s_exec: pod: "{{ pod }}" - namespace: "{{ exec_namespace }}" + namespace: "{{ test_namespace }}" command: cat /etc/resolv.conf register: output @@ -45,7 +40,7 @@ - name: Check if rc is returned for the given command k8s_exec: - namespace: "{{ exec_namespace }}" + namespace: "{{ test_namespace }}" pod: "{{ pod }}" command: 'false' register: command_status @@ -61,5 +56,5 @@ - name: "Cleanup namespace" k8s: kind: Namespace - name: "{{ exec_namespace }}" + name: "{{ test_namespace }}" state: absent diff --git a/tests/integration/targets/k8s_full/aliases b/tests/integration/targets/k8s_full/aliases new file mode 100644 index 0000000000..c9ed608b35 --- /dev/null +++ b/tests/integration/targets/k8s_full/aliases @@ -0,0 +1,3 @@ +time=57 +k8s +k8s_info \ No newline at end of file diff --git a/tests/integration/targets/k8s_full/defaults/main.yml b/tests/integration/targets/k8s_full/defaults/main.yml new file mode 100644 index 0000000000..3d0d3394a5 --- /dev/null +++ b/tests/integration/targets/k8s_full/defaults/main.yml @@ -0,0 +1,10 @@ +--- +test_namespace: + - testing + - testing1 + - testing2 + - testing3 + - testing4 + - testing5 + - testing6 + - test-namespace-module-defaults diff --git a/tests/integration/targets/k8s_full/meta/main.yml b/tests/integration/targets/k8s_full/meta/main.yml new file mode 100644 index 0000000000..2e3ba2fa37 --- /dev/null +++ b/tests/integration/targets/k8s_full/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - remove_namespace diff --git a/molecule/default/tasks/full.yml b/tests/integration/targets/k8s_full/tasks/main.yml similarity index 100% rename from molecule/default/tasks/full.yml rename to tests/integration/targets/k8s_full/tasks/main.yml diff --git a/tests/integration/targets/k8s_gc/aliases b/tests/integration/targets/k8s_gc/aliases new file mode 100644 index 0000000000..c778397150 --- /dev/null +++ b/tests/integration/targets/k8s_gc/aliases @@ -0,0 +1 @@ +time=142 diff --git a/tests/integration/targets/k8s_gc/defaults/main.yml b/tests/integration/targets/k8s_gc/defaults/main.yml new file mode 100644 index 0000000000..d0c74f81df --- /dev/null +++ b/tests/integration/targets/k8s_gc/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "garbage" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_gc/meta/main.yml b/tests/integration/targets/k8s_gc/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_gc/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/gc.yml b/tests/integration/targets/k8s_gc/tasks/main.yml similarity index 91% rename from molecule/default/tasks/gc.yml rename to tests/integration/targets/k8s_gc/tasks/main.yml index 3d71ddcf61..923ffc3f9c 100644 --- a/molecule/default/tasks/gc.yml +++ b/tests/integration/targets/k8s_gc/tasks/main.yml @@ -1,6 +1,6 @@ --- - vars: - gc_namespace: garbage + gc_namespace: "{{ test_namespace }}" gc_name: garbage-job # This is a job definition that runs for 10 minutes and won't gracefully # shutdown. It allows us to test foreground vs background deletion. @@ -25,14 +25,6 @@ restartPolicy: Never block: - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ gc_namespace }}" - - name: Add a job k8s: definition: "{{ job_definition }}" @@ -54,6 +46,7 @@ namespace: "{{ gc_namespace }}" name: "{{ wait_job.resources[0].metadata.name }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: job - name: Assert job's pod is running @@ -67,7 +60,7 @@ namespace: "{{ gc_namespace }}" state: absent wait: yes - wait_timeout: 100 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" delete_options: propagationPolicy: Foreground @@ -104,6 +97,7 @@ namespace: "{{ gc_namespace }}" name: "{{ wait_job.resources[0].metadata.name }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: job - name: Assert job's pod is running @@ -117,7 +111,7 @@ namespace: "{{ gc_namespace }}" state: absent wait: yes - wait_timeout: 100 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" delete_options: propagationPolicy: "Background" @@ -155,6 +149,7 @@ namespace: "{{ gc_namespace }}" name: "{{ wait_job.resources[0].metadata.name }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: job - name: Assert job's pod is running @@ -168,7 +163,7 @@ namespace: "{{ gc_namespace }}" state: absent wait: yes - wait_timeout: 100 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" delete_options: propagationPolicy: "Orphan" @@ -219,7 +214,7 @@ preconditions: uid: "{{ job.result.metadata.uid }}" wait: yes - wait_timeout: 100 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" - name: Check that job is deleted k8s_info: @@ -238,3 +233,4 @@ kind: Namespace name: "{{ gc_namespace }}" state: absent + ignore_errors: true diff --git a/tests/integration/targets/k8s_info/aliases b/tests/integration/targets/k8s_info/aliases new file mode 100644 index 0000000000..00b93ecfbe --- /dev/null +++ b/tests/integration/targets/k8s_info/aliases @@ -0,0 +1,3 @@ +time=13 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_info/defaults/main.yml b/tests/integration/targets/k8s_info/defaults/main.yml new file mode 100644 index 0000000000..26b87c7f4a --- /dev/null +++ b/tests/integration/targets/k8s_info/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "wait" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_info/meta/main.yml b/tests/integration/targets/k8s_info/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_info/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/info.yml b/tests/integration/targets/k8s_info/tasks/main.yml similarity index 92% rename from molecule/default/tasks/info.yml rename to tests/integration/targets/k8s_info/tasks/main.yml index 9c1633d1e1..7a8efeec05 100644 --- a/molecule/default/tasks/info.yml +++ b/tests/integration/targets/k8s_info/tasks/main.yml @@ -1,18 +1,10 @@ --- - block: - set_fact: - wait_namespace: wait + wait_namespace: "{{ test_namespace }}" multi_pod_one: multi-pod-1 multi_pod_two: multi-pod-2 - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ wait_namespace }}" - - name: Add a simple pod with initContainer k8s: definition: @@ -38,7 +30,7 @@ namespace: "{{ wait_namespace }}" wait: yes wait_sleep: 5 - wait_timeout: 400 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: wait_info - name: Assert that pod creation succeeded @@ -56,6 +48,7 @@ namespace: "{{ wait_namespace }}" state: absent wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" ignore_errors: yes register: short_wait_remove_pod @@ -111,7 +104,7 @@ namespace: "{{ wait_namespace }}" wait: yes wait_sleep: 5 - wait_timeout: 400 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" label_selectors: - run == multi-box register: wait_info @@ -132,6 +125,7 @@ namespace: "{{ wait_namespace }}" state: absent wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" ignore_errors: yes register: multi_pod_one_remove @@ -149,6 +143,7 @@ namespace: "{{ wait_namespace }}" state: absent wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" ignore_errors: yes register: multi_pod_two_remove @@ -191,7 +186,7 @@ name: does-not-exist namespace: "{{ wait_namespace }}" wait: yes - wait_timeout: 45 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: Check that module waited @@ -223,7 +218,7 @@ label_selectors: - thislabel=doesnotexist wait: yes - wait_timeout: 10 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: Assert no pods were found @@ -240,3 +235,4 @@ kind: Namespace name: "{{ wait_namespace }}" state: absent + ignore_errors: true diff --git a/tests/integration/targets/k8s_json_patch/aliases b/tests/integration/targets/k8s_json_patch/aliases new file mode 100644 index 0000000000..7398433232 --- /dev/null +++ b/tests/integration/targets/k8s_json_patch/aliases @@ -0,0 +1,3 @@ +k8s_json_patch +k8s +time=33 diff --git a/tests/integration/targets/k8s_json_patch/defaults/main.yml b/tests/integration/targets/k8s_json_patch/defaults/main.yml new file mode 100644 index 0000000000..a6c8adb7bd --- /dev/null +++ b/tests/integration/targets/k8s_json_patch/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "json-patch" diff --git a/tests/integration/targets/k8s_json_patch/meta/main.yml b/tests/integration/targets/k8s_json_patch/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_json_patch/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/json_patch.yml b/tests/integration/targets/k8s_json_patch/tasks/main.yml similarity index 87% rename from molecule/default/tasks/json_patch.yml rename to tests/integration/targets/k8s_json_patch/tasks/main.yml index 4aa1bd0ef7..314f611bf3 100644 --- a/molecule/default/tasks/json_patch.yml +++ b/tests/integration/targets/k8s_json_patch/tasks/main.yml @@ -1,21 +1,16 @@ - vars: - namespace: json-patch pod: json-patch deployment: json-patch + k8s_wait_timeout: 400 block: - - name: Ensure namespace exists - kubernetes.core.k8s: - kind: namespace - name: "{{ namespace }}" - - name: Create a simple pod kubernetes.core.k8s: definition: apiVersion: v1 kind: Pod metadata: - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ pod }}" labels: label1: foo @@ -28,11 +23,12 @@ - -c - while true; do echo $(date); sleep 10; done wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" - name: Add a label and replace the image in checkmode kubernetes.core.k8s_json_patch: kind: Pod - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ pod }}" patch: - op: add @@ -57,7 +53,7 @@ kubernetes.core.k8s_info: kind: Pod name: "{{ pod }}" - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" register: result - name: Assert pod has not changed @@ -69,7 +65,7 @@ - name: Add a label and replace the image kubernetes.core.k8s_json_patch: kind: Pod - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ pod }}" patch: - op: add @@ -79,6 +75,7 @@ path: /spec/containers/0/image value: busybox:glibc register: result + diff: no - name: Assert patch was made assert: @@ -90,7 +87,7 @@ kubernetes.core.k8s_info: kind: Pod name: "{{ pod }}" - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" register: result - name: Assert that both patch operations have been applied @@ -102,7 +99,7 @@ - name: Apply the same patch to the pod kubernetes.core.k8s_json_patch: kind: Pod - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ pod }}" patch: - op: add @@ -120,12 +117,13 @@ - name: Create a simple deployment kubernetes.core.k8s: + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" wait: yes definition: apiVersion: apps/v1 kind: Deployment metadata: - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ deployment }}" labels: name: "{{ deployment }}" @@ -150,13 +148,14 @@ - name: Apply patch and wait for deployment to be ready kubernetes.core.k8s_json_patch: kind: Deployment - namespace: "{{ namespace }}" + namespace: "{{ test_namespace }}" name: "{{ deployment }}" patch: - op: replace path: /spec/replicas value: 3 wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: Assert all replicas are available @@ -168,6 +167,6 @@ - name: Ensure namespace has been deleted kubernetes.core.k8s: kind: Namespace - name: "{{ namespace }}" + name: "{{ test_namespace }}" state: absent ignore_errors: yes diff --git a/tests/integration/targets/k8s_label_selectors/aliases b/tests/integration/targets/k8s_label_selectors/aliases new file mode 100644 index 0000000000..1c5bbb1bfb --- /dev/null +++ b/tests/integration/targets/k8s_label_selectors/aliases @@ -0,0 +1,3 @@ +time=184 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_label_selectors/defaults/main.yml b/tests/integration/targets/k8s_label_selectors/defaults/main.yml new file mode 100644 index 0000000000..d50c8fe217 --- /dev/null +++ b/tests/integration/targets/k8s_label_selectors/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "label-selectors" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_label_selectors/meta/main.yml b/tests/integration/targets/k8s_label_selectors/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_label_selectors/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/label_selectors.yml b/tests/integration/targets/k8s_label_selectors/tasks/main.yml similarity index 98% rename from molecule/default/tasks/label_selectors.yml rename to tests/integration/targets/k8s_label_selectors/tasks/main.yml index 3d7e55919f..af43e7eaa6 100644 --- a/molecule/default/tasks/label_selectors.yml +++ b/tests/integration/targets/k8s_label_selectors/tasks/main.yml @@ -1,7 +1,7 @@ --- - block: - set_fact: - selector_namespace: "selector" + selector_namespace: "{{ test_namespace }}" selector_pod_delete: "pod-selector-delete" selector_pod_apply: "pod-selector-apply" selector_pod_create: @@ -10,11 +10,6 @@ - "pod-selector-apply-02" - "pod-selector-apply-03" - - name: Ensure namespace selector - k8s: - kind: namespace - name: '{{ selector_namespace }}' - # Resource deletion using label selector (equality-based requirement) - name: Create simple pod k8s: @@ -45,7 +40,7 @@ label_selectors: - ansible.dev/team=cloud wait: yes - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" - name: Ensure resources have been deleted k8s_info: @@ -87,7 +82,7 @@ label_selectors: - environment in (test, qa) wait: yes - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: check that no resources were deleted @@ -115,7 +110,7 @@ label_selectors: - environment in (production) wait: yes - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: check result is changed diff --git a/tests/integration/targets/k8s_lists/aliases b/tests/integration/targets/k8s_lists/aliases new file mode 100644 index 0000000000..c0d2100ec8 --- /dev/null +++ b/tests/integration/targets/k8s_lists/aliases @@ -0,0 +1,3 @@ +time=22 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_lists/defaults/main.yml b/tests/integration/targets/k8s_lists/defaults/main.yml new file mode 100644 index 0000000000..2ad3cd0158 --- /dev/null +++ b/tests/integration/targets/k8s_lists/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "lists" diff --git a/tests/integration/targets/k8s_lists/meta/main.yml b/tests/integration/targets/k8s_lists/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_lists/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/lists.yml b/tests/integration/targets/k8s_lists/tasks/main.yml similarity index 86% rename from molecule/default/tasks/lists.yml rename to tests/integration/targets/k8s_lists/tasks/main.yml index 3ff939c251..ab9a134ff3 100644 --- a/molecule/default/tasks/lists.yml +++ b/tests/integration/targets/k8s_lists/tasks/main.yml @@ -1,15 +1,9 @@ --- - block: - - name: Ensure testing1 namespace exists - k8s: - api_version: v1 - kind: Namespace - name: testing1 - - block: - name: Create configmaps k8s: - namespace: testing1 + namespace: "{{ test_namespace }}" definition: apiVersion: v1 kind: ConfigMapList @@ -19,7 +13,7 @@ k8s_info: api_version: v1 kind: ConfigMap - namespace: testing1 + namespace: "{{ test_namespace }}" label_selectors: - app=test register: cms @@ -32,7 +26,7 @@ - name: Delete configmaps k8s: state: absent - namespace: testing1 + namespace: "{{ test_namespace }}" definition: apiVersion: v1 kind: ConfigMapList @@ -42,7 +36,7 @@ k8s_info: api_version: v1 kind: ConfigMap - namespace: testing1 + namespace: "{{ test_namespace }}" label_selectors: - app=test register: cms @@ -74,18 +68,18 @@ - block: - name: Create list of arbitrary resources k8s: - namespace: testing1 + namespace: "{{ test_namespace }}" definition: apiVersion: v1 kind: List - namespace: testing1 + namespace: "{{ test_namespace }}" items: '{{ resources }}' - name: Get the created resources k8s_info: api_version: '{{ item.apiVersion }}' kind: '{{ item.kind }}' - namespace: testing1 + namespace: "{{ test_namespace }}" name: '{{ item.metadata.name }}' register: list_resources with_items: '{{ resources }}' @@ -97,18 +91,18 @@ - name: Delete list of arbitrary resources k8s: state: absent - namespace: testing1 + namespace: "{{ test_namespace }}" definition: apiVersion: v1 kind: List - namespace: testing1 + namespace: "{{ test_namespace }}" items: '{{ resources }}' - name: Get the resources k8s_info: api_version: '{{ item.apiVersion }}' kind: '{{ item.kind }}' - namespace: testing1 + namespace: "{{ test_namespace }}" name: '{{ item.metadata.name }}' register: list_resources with_items: '{{ resources }}' @@ -139,9 +133,9 @@ name: port-8000-tcp port: 8000 always: - - name: Remove testing1 namespace + - name: Remove "{{ test_namespace }}" namespace k8s: kind: Namespace - name: testing1 + name: "{{ test_namespace }}" state: absent ignore_errors: yes diff --git a/tests/integration/targets/k8s_log/aliases b/tests/integration/targets/k8s_log/aliases new file mode 100644 index 0000000000..38be79f87c --- /dev/null +++ b/tests/integration/targets/k8s_log/aliases @@ -0,0 +1,2 @@ +k8s_log +time=27 diff --git a/tests/integration/targets/k8s_log/defaults/main.yml b/tests/integration/targets/k8s_log/defaults/main.yml new file mode 100644 index 0000000000..e58925216d --- /dev/null +++ b/tests/integration/targets/k8s_log/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "k8s-log" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_log/meta/main.yml b/tests/integration/targets/k8s_log/meta/main.yml new file mode 100644 index 0000000000..9963f67efa --- /dev/null +++ b/tests/integration/targets/k8s_log/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_namespace diff --git a/molecule/default/tasks/log.yml b/tests/integration/targets/k8s_log/tasks/main.yml similarity index 85% rename from molecule/default/tasks/log.yml rename to tests/integration/targets/k8s_log/tasks/main.yml index d3da05d3e2..299874f7fd 100644 --- a/molecule/default/tasks/log.yml +++ b/tests/integration/targets/k8s_log/tasks/main.yml @@ -1,19 +1,15 @@ --- - block: - - name: ensure that k8s-log namespace exists - k8s: - kind: Namespace - name: k8s-log - - name: create hello-world deployment k8s: wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: Deployment metadata: name: hello-world - namespace: k8s-log + namespace: "{{ test_namespace }}" spec: selector: matchLabels: @@ -34,7 +30,7 @@ k8s_log: api_version: apps/v1 kind: Deployment - namespace: k8s-log + namespace: "{{ test_namespace }}" name: hello-world register: deployment_log @@ -47,7 +43,7 @@ - name: retrieve the log with a label selector k8s_log: - namespace: k8s-log + namespace: "{{ test_namespace }}" label_selectors: - 'app=hello-world' register: label_selector_log @@ -62,14 +58,14 @@ - name: get the hello-world pod k8s_info: kind: Pod - namespace: k8s-log + namespace: "{{ test_namespace }}" label_selectors: - 'app=hello-world' register: k8s_log_pods - name: retrieve the log directly with the pod name k8s_log: - namespace: k8s-log + namespace: "{{ test_namespace }}" name: '{{ k8s_log_pods.resources.0.metadata.name }}' register: pod_log @@ -84,7 +80,7 @@ k8s: state: present wait: yes - wait_timeout: 120 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" wait_condition: type: Complete status: 'True' @@ -93,7 +89,7 @@ kind: Job metadata: name: int-log - namespace: k8s-log + namespace: "{{ test_namespace }}" spec: template: spec: @@ -108,7 +104,7 @@ k8s_log: api_version: batch/v1 kind: Job - namespace: k8s-log + namespace: "{{ test_namespace }}" name: int-log register: job_logs @@ -120,5 +116,6 @@ - name: ensure that namespace is removed k8s: kind: Namespace - name: k8s-log + name: "{{ test_namespace }}" state: absent + ignore_errors: true diff --git a/tests/integration/targets/k8s_merge_type/aliases b/tests/integration/targets/k8s_merge_type/aliases new file mode 100644 index 0000000000..b961a8b1fb --- /dev/null +++ b/tests/integration/targets/k8s_merge_type/aliases @@ -0,0 +1,3 @@ +time=19 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_merge_type/defaults/main.yml b/tests/integration/targets/k8s_merge_type/defaults/main.yml new file mode 100644 index 0000000000..93c5a7b5d4 --- /dev/null +++ b/tests/integration/targets/k8s_merge_type/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "merge-type" diff --git a/tests/integration/targets/k8s_merge_type/meta/main.yml b/tests/integration/targets/k8s_merge_type/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_merge_type/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/merge_type.yml b/tests/integration/targets/k8s_merge_type/tasks/main.yml similarity index 95% rename from molecule/default/tasks/merge_type.yml rename to tests/integration/targets/k8s_merge_type/tasks/main.yml index fad238bd60..32e41d8b72 100644 --- a/molecule/default/tasks/merge_type.yml +++ b/tests/integration/targets/k8s_merge_type/tasks/main.yml @@ -1,17 +1,11 @@ - block: - name: Define common facts set_fact: - k8s_patch_namespace: "patch" + k8s_patch_namespace: "{{ test_namespace }}" 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: diff --git a/tests/integration/targets/k8s_patched/aliases b/tests/integration/targets/k8s_patched/aliases new file mode 100644 index 0000000000..106e8b4409 --- /dev/null +++ b/tests/integration/targets/k8s_patched/aliases @@ -0,0 +1,3 @@ +time=20 +k8s +k8s_info \ No newline at end of file diff --git a/tests/integration/targets/k8s_patched/defaults/main.yml b/tests/integration/targets/k8s_patched/defaults/main.yml new file mode 100644 index 0000000000..a2ecfe95c4 --- /dev/null +++ b/tests/integration/targets/k8s_patched/defaults/main.yml @@ -0,0 +1,4 @@ +--- +test_namespace: + - patched-namespace-1 + - patched-namespace-2 diff --git a/tests/integration/targets/k8s_patched/meta/main.yml b/tests/integration/targets/k8s_patched/meta/main.yml new file mode 100644 index 0000000000..54561c975c --- /dev/null +++ b/tests/integration/targets/k8s_patched/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- remove_namespace diff --git a/molecule/default/tasks/patched.yml b/tests/integration/targets/k8s_patched/tasks/main.yml similarity index 71% rename from molecule/default/tasks/patched.yml rename to tests/integration/targets/k8s_patched/tasks/main.yml index 9c0f90774e..6fe514d30e 100644 --- a/molecule/default/tasks/patched.yml +++ b/tests/integration/targets/k8s_patched/tasks/main.yml @@ -1,27 +1,25 @@ --- - block: - set_fact: - patch_only_namespace: - first: patched-namespace-1 - second: patched-namespace-2 + patch_only_namespace: "{{ test_namespace }}" - - name: Ensure namespace {{ patch_only_namespace.first }} exist + - name: Ensure namespace {{ patch_only_namespace[0] }} exist kubernetes.core.k8s: definition: apiVersion: v1 kind: Namespace metadata: - name: "{{ patch_only_namespace.first }}" + name: "{{ patch_only_namespace[0] }}" labels: existingLabel: "labelValue" annotations: existingAnnotation: "annotationValue" wait: yes - - name: Ensure namespace {{ patch_only_namespace.second }} does not exist + - name: Ensure namespace {{ patch_only_namespace[1] }} does not exist kubernetes.core.k8s_info: kind: namespace - name: "{{ patch_only_namespace.second }}" + name: "{{ patch_only_namespace[1] }}" register: second_namespace - name: assert that second namespace does not exist @@ -38,14 +36,14 @@ apiVersion: v1 kind: Namespace metadata: - name: "{{ patch_only_namespace.first }}" + name: "{{ patch_only_namespace[0] }}" labels: ansible: patched --- apiVersion: v1 kind: Namespace metadata: - name: "{{ patch_only_namespace.second }}" + name: "{{ patch_only_namespace[1] }}" labels: ansible: patched register: patch_resource @@ -56,10 +54,10 @@ - patch_resource.changed - patch_resource.result.results | selectattr('warning', 'defined') | list | length == 1 - - name: Ensure namespace {{ patch_only_namespace.first }} was patched correctly + - name: Ensure namespace {{ patch_only_namespace[0] }} was patched correctly kubernetes.core.k8s_info: kind: namespace - name: "{{ patch_only_namespace.first }}" + name: "{{ patch_only_namespace[0] }}" register: first_namespace - name: assert labels are as expected @@ -68,10 +66,10 @@ - first_namespace.resources[0].metadata.labels.ansible == "patched" - first_namespace.resources[0].metadata.labels.existingLabel == "labelValue" - first_namespace.resources[0].metadata.annotations.existingAnnotation == "annotationValue" - - name: Ensure namespace {{ patch_only_namespace.second }} was not created + - name: Ensure namespace {{ patch_only_namespace[1] }} was not created kubernetes.core.k8s_info: kind: namespace - name: "{{ patch_only_namespace.second }}" + name: "{{ patch_only_namespace[1] }}" register: second_namespace - name: assert that second namespace does not exist @@ -87,23 +85,23 @@ apiVersion: v1 kind: Namespace metadata: - name: "{{ patch_only_namespace.first }}" + name: "{{ patch_only_namespace[0] }}" labels: patch: ansible --- apiVersion: v1 kind: Namespace metadata: - name: "{{ patch_only_namespace.second }}" + name: "{{ patch_only_namespace[1] }}" labels: patch: ansible wait: yes register: patch_resource - - name: Ensure namespace {{ patch_only_namespace.second }} was created + - name: Ensure namespace {{ patch_only_namespace[1] }} was created kubernetes.core.k8s_info: kind: namespace - name: "{{ patch_only_namespace.second }}" + name: "{{ patch_only_namespace[1] }}" register: second_namespace - name: assert that second namespace exist @@ -118,6 +116,6 @@ name: "{{ item }}" state: absent with_items: - - "{{ patch_only_namespace.first }}" - - "{{ patch_only_namespace.second }}" + - "{{ patch_only_namespace[0] }}" + - "{{ patch_only_namespace[1] }}" ignore_errors: true diff --git a/tests/integration/targets/k8s_rollback/aliases b/tests/integration/targets/k8s_rollback/aliases new file mode 100644 index 0000000000..90770cd04d --- /dev/null +++ b/tests/integration/targets/k8s_rollback/aliases @@ -0,0 +1,4 @@ +k8s_rollback +k8s +k8s_info +time=187 diff --git a/tests/integration/targets/k8s_rollback/defaults/main.yml b/tests/integration/targets/k8s_rollback/defaults/main.yml new file mode 100644 index 0000000000..58d8ae175c --- /dev/null +++ b/tests/integration/targets/k8s_rollback/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "testingrollback" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_rollback/meta/main.yml b/tests/integration/targets/k8s_rollback/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_rollback/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/rollback.yml b/tests/integration/targets/k8s_rollback/tasks/main.yml similarity index 94% rename from molecule/default/tasks/rollback.yml rename to tests/integration/targets/k8s_rollback/tasks/main.yml index 743ff53c04..952e5608c0 100644 --- a/molecule/default/tasks/rollback.yml +++ b/tests/integration/targets/k8s_rollback/tasks/main.yml @@ -2,24 +2,13 @@ - block: - name: Set variables set_fact: - namespace: "testingrollback" - - - name: Create a namespace - k8s: - name: "{{ namespace }}" - kind: Namespace - api_version: v1 - apply: no - register: output - - - name: show output - debug: - var: output + namespace: "{{ test_namespace }}" - name: Create a deployment k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" inline: &deploy apiVersion: apps/v1 kind: Deployment @@ -53,6 +42,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: Deployment @@ -96,6 +86,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: DaemonSet @@ -149,6 +140,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: DaemonSet @@ -215,3 +207,4 @@ kind: Namespace api_version: v1 state: absent + ignore_errors: yes diff --git a/tests/integration/targets/k8s_scale/aliases b/tests/integration/targets/k8s_scale/aliases new file mode 100644 index 0000000000..08e7cd5dcf --- /dev/null +++ b/tests/integration/targets/k8s_scale/aliases @@ -0,0 +1,4 @@ +k8s_scale +k8s +k8s_info +time=210 diff --git a/tests/integration/targets/k8s_scale/defaults/main.yml b/tests/integration/targets/k8s_scale/defaults/main.yml new file mode 100644 index 0000000000..5089314bbe --- /dev/null +++ b/tests/integration/targets/k8s_scale/defaults/main.yml @@ -0,0 +1,42 @@ +--- +k8s_pod_metadata: + labels: + app: "{{ k8s_pod_name }}" + +k8s_pod_spec: + serviceAccount: "{{ k8s_pod_service_account }}" + containers: + - image: "{{ k8s_pod_image }}" + imagePullPolicy: Always + name: "{{ k8s_pod_name }}" + command: "{{ k8s_pod_command }}" + readinessProbe: + initialDelaySeconds: 15 + exec: + command: + - /bin/true + resources: "{{ k8s_pod_resources }}" + ports: "{{ k8s_pod_ports }}" + env: "{{ k8s_pod_env }}" + + +k8s_pod_service_account: default + +k8s_pod_resources: + limits: + cpu: "100m" + memory: "100Mi" + +k8s_pod_command: [] + +k8s_pod_ports: [] + +k8s_pod_env: [] + +k8s_pod_template: + metadata: "{{ k8s_pod_metadata }}" + spec: "{{ k8s_pod_spec }}" + +test_namespace: "scale" + +k8s_wait_timeout: 400 diff --git a/molecule/default/files/deployment.yaml b/tests/integration/targets/k8s_scale/files/deployment.yaml similarity index 100% rename from molecule/default/files/deployment.yaml rename to tests/integration/targets/k8s_scale/files/deployment.yaml diff --git a/tests/integration/targets/k8s_scale/meta/main.yml b/tests/integration/targets/k8s_scale/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_scale/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/scale.yml b/tests/integration/targets/k8s_scale/tasks/main.yml similarity index 94% rename from molecule/default/tasks/scale.yml rename to tests/integration/targets/k8s_scale/tasks/main.yml index 7a846ae13d..c446da37ea 100644 --- a/molecule/default/tasks/scale.yml +++ b/tests/integration/targets/k8s_scale/tasks/main.yml @@ -1,15 +1,7 @@ --- - block: - set_fact: - scale_namespace: scale - - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ scale_namespace }}" + scale_namespace: "{{ test_namespace }}" - name: Add a deployment k8s: @@ -26,7 +18,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes - wait_timeout: 60 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes vars: k8s_pod_name: scale-deploy @@ -53,6 +45,7 @@ namespace: "{{ scale_namespace }}" replicas: 0 wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_down diff: true @@ -91,7 +84,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes - wait_timeout: 60 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" apply: yes vars: k8s_pod_name: scale-deploy @@ -126,8 +119,9 @@ namespace: "{{ scale_namespace }}" replicas: 2 wait: yes - wait_timeout: 60 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_up + diff: no - name: Get pods in scale-deploy k8s_info: @@ -156,6 +150,7 @@ replicas: 2 wait: yes register: scale_up_noop + diff: no - name: Get pods in scale-deploy k8s_info: @@ -259,6 +254,8 @@ namespace: "{{ scale_namespace }}" label_selectors: - app=nginx + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_out - assert: @@ -272,3 +269,4 @@ kind: Namespace name: "{{ scale_namespace }}" state: absent + ignore_errors: true diff --git a/tests/integration/targets/k8s_template/aliases b/tests/integration/targets/k8s_template/aliases new file mode 100644 index 0000000000..7a847f3cae --- /dev/null +++ b/tests/integration/targets/k8s_template/aliases @@ -0,0 +1,4 @@ +k8s_service +k8s +k8s_info +time=75 diff --git a/tests/integration/targets/k8s_template/defaults/main.yml b/tests/integration/targets/k8s_template/defaults/main.yml new file mode 100644 index 0000000000..0d62f5859c --- /dev/null +++ b/tests/integration/targets/k8s_template/defaults/main.yml @@ -0,0 +1,3 @@ +--- +test_namespace: "template-test" +k8s_wait_timeout: 400 diff --git a/tests/integration/targets/k8s_template/meta/main.yml b/tests/integration/targets/k8s_template/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_template/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/template.yml b/tests/integration/targets/k8s_template/tasks/main.yml similarity index 86% rename from molecule/default/tasks/template.yml rename to tests/integration/targets/k8s_template/tasks/main.yml index 13246c3743..c9c5725288 100644 --- a/molecule/default/tasks/template.yml +++ b/tests/integration/targets/k8s_template/tasks/main.yml @@ -1,19 +1,11 @@ --- - block: - set_fact: - template_namespace: template-test - - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ template_namespace }}" + template_namespace: "{{ test_namespace }}" - name: Check if k8s_service does not inherit parameter kubernetes.core.k8s_service: - template: "pod_template_one.j2" + template: "pod_one.j2" state: present ignore_errors: yes register: r @@ -27,7 +19,7 @@ - name: Specify both definition and template kubernetes.core.k8s: state: present - template: "pod_template_one.j2" + template: "pod_one.j2" definition: apiVersion: apps/v1 kind: Deployment @@ -54,8 +46,8 @@ - name: Specify both src and template kubernetes.core.k8s: state: present - src: "../templates/pod_template_one.j2" - template: "pod_template_one.j2" + src: "../templates/pod_one.j2" + template: "pod_one.j2" vars: k8s_pod_name_one: pod k8s_pod_namespace: "{{ template_namespace }}" @@ -70,8 +62,9 @@ - name: Create pod using template (direct specification) kubernetes.core.k8s: - template: "pod_template_one.j2" + template: "pod_one.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-1 k8s_pod_namespace: "{{ template_namespace }}" @@ -87,6 +80,7 @@ template: - default wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-2 k8s_pod_namespace: "{{ template_namespace }}" @@ -101,8 +95,9 @@ - name: Create pod using template (path parameter) kubernetes.core.k8s: template: - path: "pod_template_one.j2" + path: "pod_one.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-3 k8s_pod_namespace: "{{ template_namespace }}" @@ -116,10 +111,11 @@ - name: Create pod using template (different variable string) kubernetes.core.k8s: template: - path: "pod_template_two.j2" + path: "pod_two.j2" variable_start_string: '[[' variable_end_string: ']]' wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_two: pod-4 k8s_pod_namespace: "[[ template_namespace ]]" @@ -134,8 +130,9 @@ - name: Create pods using multi-resource template kubernetes.core.k8s: template: - path: "pod_template_three.j2" + path: "pod_three.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_three_one: pod-5 k8s_pod_name_three_two: pod-6 @@ -150,12 +147,13 @@ - name: Create pods using list of template kubernetes.core.k8s: template: - - pod_template_one.j2 - - path: "pod_template_two.j2" + - pod_one.j2 + - path: "pod_two.j2" variable_start_string: '[[' variable_end_string: ']]' - - path: "pod_template_three.j2" + - path: "pod_three.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-7 k8s_pod_name_two: pod-8 @@ -179,15 +177,16 @@ - name: delete pod if it exists kubernetes.core.k8s: - template: pod_template_one.j2 + template: pod_one.j2 wait: true + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" state: absent - name: create pod on bad namespace ( continue_on_error set to default(false) ) kubernetes.core.k8s: template: - pod_with_bad_namespace.j2 - - pod_template_one.j2 + - pod_one.j2 register: resource ignore_errors: true @@ -221,9 +220,10 @@ kubernetes.core.k8s: template: - pod_with_bad_namespace.j2 - - pod_template_one.j2 + - pod_one.j2 continue_on_error: true wait: true + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: resource ignore_errors: true @@ -256,3 +256,4 @@ kind: Namespace name: "{{ template_namespace }}" state: absent + ignore_errors: true diff --git a/molecule/default/templates/pod_template_one.j2 b/tests/integration/targets/k8s_template/templates/pod_one.j2 similarity index 100% rename from molecule/default/templates/pod_template_one.j2 rename to tests/integration/targets/k8s_template/templates/pod_one.j2 diff --git a/molecule/default/templates/pod_template_three.j2 b/tests/integration/targets/k8s_template/templates/pod_three.j2 similarity index 100% rename from molecule/default/templates/pod_template_three.j2 rename to tests/integration/targets/k8s_template/templates/pod_three.j2 diff --git a/molecule/default/templates/pod_template_two.j2 b/tests/integration/targets/k8s_template/templates/pod_two.j2 similarity index 100% rename from molecule/default/templates/pod_template_two.j2 rename to tests/integration/targets/k8s_template/templates/pod_two.j2 diff --git a/molecule/default/templates/pod_with_bad_namespace.j2 b/tests/integration/targets/k8s_template/templates/pod_with_bad_namespace.j2 similarity index 100% rename from molecule/default/templates/pod_with_bad_namespace.j2 rename to tests/integration/targets/k8s_template/templates/pod_with_bad_namespace.j2 diff --git a/tests/integration/targets/k8s_validate/aliases b/tests/integration/targets/k8s_validate/aliases new file mode 100644 index 0000000000..64f66d0a5f --- /dev/null +++ b/tests/integration/targets/k8s_validate/aliases @@ -0,0 +1,3 @@ +time=59 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_validate/defaults/main.yml b/tests/integration/targets/k8s_validate/defaults/main.yml new file mode 100644 index 0000000000..f868ad2db5 --- /dev/null +++ b/tests/integration/targets/k8s_validate/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "validate" diff --git a/tests/integration/targets/k8s_validate/meta/main.yml b/tests/integration/targets/k8s_validate/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_validate/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/validate.yml b/tests/integration/targets/k8s_validate/tasks/main.yml similarity index 96% rename from molecule/default/tasks/validate.yml rename to tests/integration/targets/k8s_validate/tasks/main.yml index 73ea93e02a..185875606c 100644 --- a/molecule/default/tasks/validate.yml +++ b/tests/integration/targets/k8s_validate/tasks/main.yml @@ -1,12 +1,4 @@ - block: - - name: Create namespace - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ validate_namespace }}" - - name: Create temp directory tempfile: state: directory @@ -235,6 +227,6 @@ ignore_errors: true vars: - validate_namespace: validate + validate_namespace: "{{ test_namespace }}" environment: ENABLE_TURBO_MODE: false diff --git a/tests/integration/targets/k8s_waiter/aliases b/tests/integration/targets/k8s_waiter/aliases new file mode 100644 index 0000000000..295a154c26 --- /dev/null +++ b/tests/integration/targets/k8s_waiter/aliases @@ -0,0 +1,5 @@ +# duration 10min +slow +time=504 +k8s +k8s_info diff --git a/tests/integration/targets/k8s_waiter/defaults/main.yml b/tests/integration/targets/k8s_waiter/defaults/main.yml new file mode 100644 index 0000000000..04c873ce36 --- /dev/null +++ b/tests/integration/targets/k8s_waiter/defaults/main.yml @@ -0,0 +1,40 @@ +--- +k8s_pod_metadata: + labels: + app: "{{ k8s_pod_name }}" + +k8s_pod_spec: + serviceAccount: "{{ k8s_pod_service_account }}" + containers: + - image: "{{ k8s_pod_image }}" + imagePullPolicy: Always + name: "{{ k8s_pod_name }}" + command: "{{ k8s_pod_command }}" + readinessProbe: + initialDelaySeconds: 15 + exec: + command: + - /bin/true + resources: "{{ k8s_pod_resources }}" + ports: "{{ k8s_pod_ports }}" + env: "{{ k8s_pod_env }}" + + +k8s_pod_service_account: default + +k8s_pod_resources: + limits: + cpu: "100m" + memory: "100Mi" + +k8s_pod_command: [] + +k8s_pod_ports: [] + +k8s_pod_env: [] + +k8s_pod_template: + metadata: "{{ k8s_pod_metadata }}" + spec: "{{ k8s_pod_spec }}" + +test_namespace: "wait" diff --git a/tests/integration/targets/k8s_waiter/meta/main.yml b/tests/integration/targets/k8s_waiter/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/k8s_waiter/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/waiter.yml b/tests/integration/targets/k8s_waiter/tasks/main.yml similarity index 94% rename from molecule/default/tasks/waiter.yml rename to tests/integration/targets/k8s_waiter/tasks/main.yml index a2e5c1e5aa..1cb7e4c405 100644 --- a/molecule/default/tasks/waiter.yml +++ b/tests/integration/targets/k8s_waiter/tasks/main.yml @@ -1,15 +1,8 @@ --- - block: - set_fact: - wait_namespace: wait - - - name: Ensure namespace exists - k8s: - definition: - apiVersion: v1 - kind: Namespace - metadata: - name: "{{ wait_namespace }}" + wait_namespace: "{{ test_namespace }}" + k8s_wait_timeout: 400 - name: Add a simple pod k8s: @@ -21,19 +14,13 @@ namespace: "{{ wait_namespace }}" spec: "{{ k8s_pod_spec }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-pod k8s_pod_image: alpine:3.8 k8s_pod_command: - sleep - "10000" - register: wait_pod - ignore_errors: yes - - - name: Assert that pod creation succeeded - assert: - that: - - wait_pod is successful - name: Add a daemonset k8s: @@ -50,7 +37,7 @@ template: "{{ k8s_pod_template }}" wait: yes wait_sleep: 5 - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-ds k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:1 @@ -114,7 +101,7 @@ template: "{{ k8s_pod_template }}" wait: yes wait_sleep: 3 - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-ds k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:3 @@ -155,7 +142,7 @@ template: "{{ k8s_pod_template }}" wait: yes wait_sleep: 5 - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-sts k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:1 @@ -219,7 +206,7 @@ template: "{{ k8s_pod_template }}" wait: yes wait_sleep: 3 - wait_timeout: 180 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-sts k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:3 @@ -308,6 +295,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-deploy k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:1 @@ -338,6 +326,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-deploy k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:2 @@ -384,6 +373,7 @@ paused: True apply: no wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" wait_condition: type: Progressing status: Unknown @@ -414,6 +404,7 @@ targetPort: 8080 protocol: TCP wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-deploy register: service @@ -438,6 +429,7 @@ app: "{{ k8s_pod_name }}" template: "{{ k8s_pod_template }}" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name: wait-crash-deploy k8s_pod_image: alpine:3.8 @@ -475,3 +467,4 @@ kind: Namespace name: "{{ wait_namespace }}" state: absent + ignore_errors: yes diff --git a/tests/integration/targets/kubernetes/README.md b/tests/integration/targets/kubernetes/README.md deleted file mode 100644 index 2a09ca1784..0000000000 --- a/tests/integration/targets/kubernetes/README.md +++ /dev/null @@ -1,19 +0,0 @@ -Wait tests ----------- - -wait tests require at least one node, and don't work on the normal k8s -openshift-origin container as provided by ansible-test --docker -v k8s - -minikube, Kubernetes from Docker or any other Kubernetes service will -suffice. - -If kubectl is already using the right config file and context, you can -just do - -``` -cd tests/integration/targets/k8s -./runme.sh -vv -``` - -otherwise set one or both of `K8S_AUTH_KUBECONFIG` and `K8S_AUTH_CONTEXT` -and use the same command diff --git a/tests/integration/targets/kubernetes/aliases b/tests/integration/targets/kubernetes/aliases deleted file mode 100644 index 326e691050..0000000000 --- a/tests/integration/targets/kubernetes/aliases +++ /dev/null @@ -1,2 +0,0 @@ -cloud/openshift -shippable/cloud/group1 diff --git a/tests/integration/targets/kubernetes/files/kuard-extra-property.yml b/tests/integration/targets/kubernetes/files/kuard-extra-property.yml deleted file mode 100644 index bed92bc76b..0000000000 --- a/tests/integration/targets/kubernetes/files/kuard-extra-property.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - labels: - app: kuard - name: kuard - namespace: default -spec: - replicas: 3 - selector: - matchLabels: - app: kuard - unwanted: value - template: - metadata: - labels: - app: kuard - spec: - containers: - - image: gcr.io/kuar-demo/kuard-amd64:1 - name: kuard diff --git a/tests/integration/targets/kubernetes/files/kuard-invalid-type.yml b/tests/integration/targets/kubernetes/files/kuard-invalid-type.yml deleted file mode 100644 index 72505f8824..0000000000 --- a/tests/integration/targets/kubernetes/files/kuard-invalid-type.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - labels: - app: kuard - name: kuard - namespace: default -spec: - replicas: hello - selector: - matchLabels: - app: kuard - template: - metadata: - labels: - app: kuard - spec: - containers: - - image: gcr.io/kuar-demo/kuard-amd64:1 - name: kuard diff --git a/tests/integration/targets/kubernetes/handlers/main.yml b/tests/integration/targets/kubernetes/handlers/main.yml deleted file mode 100644 index efb5408e2e..0000000000 --- a/tests/integration/targets/kubernetes/handlers/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- name: delete temporary directory - file: - path: "{{ remote_tmp_dir }}" - state: absent - no_log: yes diff --git a/tests/integration/targets/kubernetes/library/README.md b/tests/integration/targets/kubernetes/library/README.md deleted file mode 100644 index ac312297d4..0000000000 --- a/tests/integration/targets/kubernetes/library/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# README - -The `test_tempfile.py` module added here is only used for the `setup_remote_tmp_dir.yml` temporary directory setup task. It is a clone of the `tempfile.py` community-supported Ansible module, and has to be included with the tests here because it is not available in the `ansible-base` distribution against which this collection is tested. diff --git a/tests/integration/targets/kubernetes/library/test_tempfile.py b/tests/integration/targets/kubernetes/library/test_tempfile.py deleted file mode 100644 index c89f5a3196..0000000000 --- a/tests/integration/targets/kubernetes/library/test_tempfile.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: (c) 2016, Krzysztof Magosa -# Copyright: (c) 2017, Ansible Project -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: test_tempfile - -short_description: Creates temporary files and directories - -description: - - The C(test_tempfile) module creates temporary files and directories. C(mktemp) command takes different parameters on various systems, this module helps - to avoid troubles related to that. Files/directories created by module are accessible only by creator. In case you need to make them world-accessible - you need to use M(ansible.builtin.file) module. - - For Windows targets, use the M(ansible.builtin.win_tempfile) module instead. - -options: - state: - description: - - Whether to create file or directory. - type: str - choices: [ directory, file ] - default: file - path: - description: - - Location where temporary file or directory should be created. - - If path is not specified, the default system temporary directory will be used. - type: path - prefix: - description: - - Prefix of file/directory name created by module. - type: str - default: ansible. - suffix: - description: - - Suffix of file/directory name created by module. - type: str - default: "" - -seealso: -- module: file -- module: win_tempfile - -author: - - Krzysztof Magosa (@krzysztof-magosa) -''' - -EXAMPLES = """ -- name: create temporary build directory - test_tempfile: - state: directory - suffix: build - -- name: create temporary file - test_tempfile: - state: file - suffix: temp - register: tempfile_1 - -- name: use the registered var and the file module to remove the temporary file - file: - path: "{{ tempfile_1.path }}" - state: absent - when: tempfile_1.path is defined -""" - -RETURN = ''' -path: - description: Path to created file or directory - returned: success - type: str - sample: "/tmp/ansible.bMlvdk" -''' - -from os import close -from tempfile import mkstemp, mkdtemp -from traceback import format_exc - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils._text import to_native - - -def main(): - module = AnsibleModule( - argument_spec=dict( - state=dict(type='str', default='file', choices=['file', 'directory']), - path=dict(type='path'), - prefix=dict(type='str', default='ansible.'), - suffix=dict(type='str', default=''), - ), - ) - - try: - if module.params['state'] == 'file': - handle, path = mkstemp( - prefix=module.params['prefix'], - suffix=module.params['suffix'], - dir=module.params['path'], - ) - close(handle) - elif module.params['state'] == 'directory': - path = mkdtemp( - prefix=module.params['prefix'], - suffix=module.params['suffix'], - dir=module.params['path'], - ) - - module.exit_json(changed=True, path=path) - except Exception as e: - module.fail_json(msg=to_native(e), exception=format_exc()) - - -if __name__ == '__main__': - main() diff --git a/tests/integration/targets/kubernetes/meta/main.yml b/tests/integration/targets/kubernetes/meta/main.yml deleted file mode 100644 index 23d65c7ef4..0000000000 --- a/tests/integration/targets/kubernetes/meta/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -dependencies: [] diff --git a/tests/integration/targets/kubernetes/tasks/main.yml b/tests/integration/targets/kubernetes/tasks/main.yml deleted file mode 100644 index 52fae25f32..0000000000 --- a/tests/integration/targets/kubernetes/tasks/main.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -- include_tasks: setup_remote_tmp_dir.yml - -- set_fact: - virtualenv: "{{ remote_tmp_dir }}/virtualenv" - virtualenv_command: "{{ ansible_python_interpreter }} -m venv" - -- set_fact: - virtualenv_interpreter: "{{ virtualenv }}/bin/python" - -# Test graceful failure for missing kubernetes-validate - -- pip: - name: - - kubernetes>=12.0.0 - - coverage>=5.3 - virtualenv: "{{ virtualenv }}" - virtualenv_command: "{{ virtualenv_command }}" - virtualenv_site_packages: no - -- include_tasks: validate_not_installed.yml - vars: - ansible_python_interpreter: "{{ virtualenv_interpreter }}" - -- file: - path: "{{ virtualenv }}" - state: absent - no_log: yes - -# Test validate with kubernetes-validate - -- pip: - name: - - kubernetes-validate==1.12.0 - - kubernetes>=12.0.0 - - coverage>=5.3 - virtualenv: "{{ virtualenv }}" - virtualenv_command: "{{ virtualenv_command }}" - virtualenv_site_packages: no - -- include_tasks: validate_installed.yml - vars: - ansible_python_interpreter: "{{ virtualenv_interpreter }}" - playbook_namespace: ansible-test-k8s-validate - -- file: - path: "{{ virtualenv }}" - state: absent - no_log: yes - -# Test new config getter (kubernetes==12.0.0) - -- pip: - name: - - kubernetes==12.0.0 - - coverage>=5.3 - virtualenv: "{{ virtualenv }}" - virtualenv_command: "{{ virtualenv_command }}" - virtualenv_site_packages: no - -- pip: - name: - - kubernetes>=12.0.0 - virtualenv: "{{ virtualenv }}" - virtualenv_command: "{{ virtualenv_command }}" - virtualenv_site_packages: no - -- include_tasks: new_config_getter.yml - vars: - ansible_python_interpreter: "{{ virtualenv_interpreter }}" - playbook_namespace: ansible-test-k8s-config-getter - -- file: - path: "{{ virtualenv }}" - state: absent - no_log: yes diff --git a/tests/integration/targets/kubernetes/tasks/new_config_getter.yml b/tests/integration/targets/kubernetes/tasks/new_config_getter.yml deleted file mode 100644 index 7a5348826a..0000000000 --- a/tests/integration/targets/kubernetes/tasks/new_config_getter.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -- block: - - name: Create a namespace - k8s: - name: "{{ playbook_namespace }}" - kind: Namespace - - - name: Delete namespace - k8s: - state: absent - definition: - - kind: Namespace - apiVersion: v1 - metadata: - name: "{{ playbook_namespace }}" - ignore_errors: yes diff --git a/tests/integration/targets/kubernetes/tasks/setup_remote_tmp_dir.yml b/tests/integration/targets/kubernetes/tasks/setup_remote_tmp_dir.yml deleted file mode 100644 index 8acdb49eb9..0000000000 --- a/tests/integration/targets/kubernetes/tasks/setup_remote_tmp_dir.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -- name: create temporary directory - test_tempfile: - state: directory - suffix: .test - register: remote_tmp_dir - notify: - - delete temporary directory - -- name: record temporary directory - set_fact: - remote_tmp_dir: "{{ remote_tmp_dir.path }}" diff --git a/tests/integration/targets/kubernetes/tasks/validate_installed.yml b/tests/integration/targets/kubernetes/tasks/validate_installed.yml deleted file mode 100644 index e00c7c23d7..0000000000 --- a/tests/integration/targets/kubernetes/tasks/validate_installed.yml +++ /dev/null @@ -1,126 +0,0 @@ ---- -- block: - - name: Create a namespace - k8s: - name: "{{ playbook_namespace }}" - kind: Namespace - - - copy: - src: files - dest: "{{ remote_tmp_dir }}" - - - name: incredibly simple ConfigMap - k8s: - definition: - apiVersion: v1 - kind: ConfigMap - metadata: - name: hello - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: yes - register: k8s_with_validate - - - name: assert that k8s_with_validate succeeds - assert: - that: - - k8s_with_validate is successful - - - name: extra property does not fail without strict - k8s: - src: "{{ remote_tmp_dir }}/files/kuard-extra-property.yml" - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: yes - strict: no - - - name: extra property fails with strict - k8s: - src: "{{ remote_tmp_dir }}/files/kuard-extra-property.yml" - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: yes - strict: yes - ignore_errors: yes - register: extra_property - - - name: check that extra property fails with strict - assert: - that: - - extra_property is failed - - - name: invalid type fails at validation stage - k8s: - src: "{{ remote_tmp_dir }}/files/kuard-invalid-type.yml" - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: yes - strict: no - ignore_errors: yes - register: invalid_type - - - name: check that invalid type fails - assert: - that: - - invalid_type is failed - - - name: invalid type fails with warnings when fail_on_error is False - k8s: - src: "{{ remote_tmp_dir }}/files/kuard-invalid-type.yml" - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: no - strict: no - ignore_errors: yes - register: invalid_type_no_fail - - - name: check that invalid type fails - assert: - that: - - invalid_type_no_fail is failed - - - name: setup custom resource definition - k8s: - src: "{{ remote_tmp_dir }}/files/setup-crd.yml" - - - name: wait a few seconds - pause: - seconds: 5 - - - name: add custom resource definition - k8s: - src: "{{ remote_tmp_dir }}/files/crd-resource.yml" - namespace: "{{ playbook_namespace }}" - validate: - fail_on_error: yes - strict: yes - register: unknown_kind - - - name: check that unknown kind warns - assert: - that: - - unknown_kind is successful - - "'warnings' in unknown_kind" - - always: - - name: remove custom resource - k8s: - definition: "{{ lookup('file', role_path + '/files/crd-resource.yml') }}" - namespace: "{{ playbook_namespace }}" - state: absent - ignore_errors: yes - - - name: remove custom resource definitions - k8s: - definition: "{{ lookup('file', role_path + '/files/setup-crd.yml') }}" - state: absent - - - name: Delete namespace - k8s: - state: absent - definition: - - kind: Namespace - apiVersion: v1 - metadata: - name: "{{ playbook_namespace }}" - ignore_errors: yes diff --git a/tests/integration/targets/kubernetes/tasks/validate_not_installed.yml b/tests/integration/targets/kubernetes/tasks/validate_not_installed.yml deleted file mode 100644 index aeda2522dd..0000000000 --- a/tests/integration/targets/kubernetes/tasks/validate_not_installed.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -# TODO: Not available in ansible-base -# - python_requirements_info: -# dependencies: -# - openshift -# - kubernetes -# - kubernetes-validate - -- k8s: - definition: - apiVersion: v1 - kind: ConfigMap - metadata: - name: hello - namespace: default - validate: - fail_on_error: yes - ignore_errors: yes - register: k8s_no_validate - -- name: assert that k8s_no_validate fails gracefully - assert: - that: - - k8s_no_validate is failed - - "k8s_no_validate.msg == 'kubernetes-validate python library is required to validate resources'" diff --git a/tests/integration/targets/lookup_k8s/aliases b/tests/integration/targets/lookup_k8s/aliases new file mode 100644 index 0000000000..db0ee6ed03 --- /dev/null +++ b/tests/integration/targets/lookup_k8s/aliases @@ -0,0 +1,3 @@ +context/target +time=16 +k8s diff --git a/tests/integration/targets/lookup_k8s/defaults/main.yml b/tests/integration/targets/lookup_k8s/defaults/main.yml new file mode 100644 index 0000000000..13a3b3c4ff --- /dev/null +++ b/tests/integration/targets/lookup_k8s/defaults/main.yml @@ -0,0 +1,4 @@ +--- +test_namespace: + - app-development-one + - app-development-two diff --git a/tests/integration/targets/lookup_k8s/meta/main.yml b/tests/integration/targets/lookup_k8s/meta/main.yml new file mode 100644 index 0000000000..54561c975c --- /dev/null +++ b/tests/integration/targets/lookup_k8s/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- remove_namespace diff --git a/molecule/default/tasks/lookup_k8s.yml b/tests/integration/targets/lookup_k8s/tasks/main.yml similarity index 88% rename from molecule/default/tasks/lookup_k8s.yml rename to tests/integration/targets/lookup_k8s/tasks/main.yml index b5733c421d..4ef7ce43d1 100644 --- a/molecule/default/tasks/lookup_k8s.yml +++ b/tests/integration/targets/lookup_k8s/tasks/main.yml @@ -2,9 +2,9 @@ - block: - set_fact: pre_test1: "{{ lookup('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - pre_test2: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" + pre_test2: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" pre_test3: "{{ query('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - pre_test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" + pre_test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" # https://github.com/ansible-collections/kubernetes.core/issues/147 - name: Create a namespace with label @@ -13,17 +13,17 @@ apiVersion: v1 kind: Namespace metadata: - name: "app-development-one" + name: "{{ test_namespace[0] }}" labels: namespace_label: "app_development" - set_fact: test1: "{{ lookup('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development', wantlist=True) }}" test2: "{{ query('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - test3: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one', wantlist=True) }}" - test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" + test3: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0], wantlist=True) }}" + test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" test5: "{{ lookup('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - test6: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" + test6: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" test7: "{{ lookup('kubernetes.core.k8s', kind='Ingress', api_version='networking.k8s.io/vINVALID', errors='ignore') }}" - set_fact: @@ -64,20 +64,20 @@ apiVersion: v1 kind: Namespace metadata: - name: "app-development-two" + name: "{{ test_namespace[1] }}" labels: namespace_label: "app_development" - set_fact: test1: "{{ lookup('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development', wantlist=True) }}" test2: "{{ query('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - test3: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one', wantlist=True) }}" - test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" - test5: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-two', wantlist=True) }}" - test6: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-two') }}" + test3: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0], wantlist=True) }}" + test4: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" + test5: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[1], wantlist=True) }}" + test6: "{{ query('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[1]) }}" test7: "{{ lookup('kubernetes.core.k8s', kind='Namespace', label_selector='namespace_label=app_development') }}" - test8: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-one') }}" - test9: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name='app-development-two') }}" + test8: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[0]) }}" + test9: "{{ lookup('kubernetes.core.k8s', kind='Namespace', resource_name=test_namespace[1]) }}" - name: Assert that every test is passed after creating second object assert: @@ -110,3 +110,4 @@ with_items: - one - two + ignore_errors: true diff --git a/tests/integration/targets/lookup_kustomize/aliases b/tests/integration/targets/lookup_kustomize/aliases new file mode 100644 index 0000000000..6e6cbcf1db --- /dev/null +++ b/tests/integration/targets/lookup_kustomize/aliases @@ -0,0 +1,3 @@ +context/target +time=44 +k8s diff --git a/tests/integration/targets/lookup_kustomize/defaults/main.yml b/tests/integration/targets/lookup_kustomize/defaults/main.yml new file mode 100644 index 0000000000..bc7e6fbe63 --- /dev/null +++ b/tests/integration/targets/lookup_kustomize/defaults/main.yml @@ -0,0 +1,2 @@ +--- +test_namespace: "kustomize" diff --git a/tests/integration/targets/lookup_kustomize/meta/main.yml b/tests/integration/targets/lookup_kustomize/meta/main.yml new file mode 100644 index 0000000000..08362c7808 --- /dev/null +++ b/tests/integration/targets/lookup_kustomize/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- setup_namespace diff --git a/molecule/default/tasks/lookup_kustomize.yml b/tests/integration/targets/lookup_kustomize/tasks/main.yml similarity index 95% rename from molecule/default/tasks/lookup_kustomize.yml rename to tests/integration/targets/lookup_kustomize/tasks/main.yml index 164bb828c7..4e96314131 100644 --- a/molecule/default/tasks/lookup_kustomize.yml +++ b/tests/integration/targets/lookup_kustomize/tasks/main.yml @@ -1,14 +1,10 @@ --- - block: - set_fact: - kustomize_ns: "kustomize" + kustomize_ns: "{{ test_namespace }}" - name: create environment for test block: - - name: Ensure namespace - k8s: - kind: Namespace - name: "{{ kustomize_ns }}" - name: Create temp directory tempfile: diff --git a/tests/integration/targets/remove_namespace/aliases b/tests/integration/targets/remove_namespace/aliases new file mode 100644 index 0000000000..7a68b11da8 --- /dev/null +++ b/tests/integration/targets/remove_namespace/aliases @@ -0,0 +1 @@ +disabled diff --git a/tests/integration/targets/remove_namespace/tasks/main.yml b/tests/integration/targets/remove_namespace/tasks/main.yml new file mode 100644 index 0000000000..b715c38309 --- /dev/null +++ b/tests/integration/targets/remove_namespace/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: Delete existing namespace + kubernetes.core.k8s: + kind: Namespace + name: "{{ item }}" + state: absent + wait: yes + with_items: "{{ test_namespace }}" + when: test_namespace | type_debug == "list" + +- name: Delete existing namespace + kubernetes.core.k8s: + kind: Namespace + name: "{{ test_namespace }}" + state: absent + wait: yes + when: test_namespace | type_debug == "AnsibleUnicode" diff --git a/tests/integration/targets/setup_namespace/aliases b/tests/integration/targets/setup_namespace/aliases new file mode 100644 index 0000000000..7a68b11da8 --- /dev/null +++ b/tests/integration/targets/setup_namespace/aliases @@ -0,0 +1 @@ +disabled diff --git a/tests/integration/targets/setup_namespace/defaults/main.yml b/tests/integration/targets/setup_namespace/defaults/main.yml new file mode 100644 index 0000000000..ed97d539c0 --- /dev/null +++ b/tests/integration/targets/setup_namespace/defaults/main.yml @@ -0,0 +1 @@ +--- diff --git a/tests/integration/targets/setup_namespace/tasks/create.yml b/tests/integration/targets/setup_namespace/tasks/create.yml new file mode 100644 index 0000000000..a25780ec75 --- /dev/null +++ b/tests/integration/targets/setup_namespace/tasks/create.yml @@ -0,0 +1,22 @@ +--- +- name: "Read namespace {{ namespace_to_create }}" + kubernetes.core.k8s_info: + kind: Namespace + name: "{{ namespace_to_create }}" + register: _namespace + +- name: Delete existing namespace + kubernetes.core.k8s: + kind: Namespace + name: "{{ namespace_to_create }}" + state: absent + wait: yes + +- name: "Ensure namespace {{ namespace_to_create }}" + kubernetes.core.k8s: + definition: + apiVersion: v1 + kind: Namespace + metadata: + name: "{{ namespace_to_create }}" + labels: "{{ namespace_labels | default(omit) }}" diff --git a/tests/integration/targets/setup_namespace/tasks/main.yml b/tests/integration/targets/setup_namespace/tasks/main.yml new file mode 100644 index 0000000000..31e1b36285 --- /dev/null +++ b/tests/integration/targets/setup_namespace/tasks/main.yml @@ -0,0 +1,13 @@ +--- +- include_tasks: tasks/create.yml + vars: + namespace_to_create: "{{ item.name }}" + namespace_labels: "{{ item.labels | default(omit) }}" + with_items: "{{ test_namespace }}" + when: test_namespace | type_debug == "list" + +- include_tasks: tasks/create.yml + vars: + namespace_to_create: "{{ test_namespace }}" + namespace_labels: "{{ test_namespace_labels | default(omit) }}" + when: test_namespace | type_debug == "AnsibleUnicode" diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt index c543b5de40..a33e9a6578 100644 --- a/tests/sanity/ignore-2.10.txt +++ b/tests/sanity/ignore-2.10.txt @@ -1,8 +1,8 @@ -molecule/default/files/deployment.yaml yamllint!skip -molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip -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 +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/__init__.py compile-2.6!skip plugins/module_utils/__init__.py compile-2.7!skip plugins/module_utils/__init__.py compile-3.5!skip @@ -232,18 +232,18 @@ plugins/modules/k8s_service.py validate-modules:return-syntax-error tests/sanity/refresh_ignore_files shebang!skip tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py shebang -molecule/default/roles/k8scopy/library/k8s_create_file.py shebang plugins/modules/k8s_cp.py compile-2.6!skip plugins/modules/k8s_cp.py compile-2.7!skip plugins/modules/k8s_cp.py import-2.6!skip plugins/modules/k8s_cp.py import-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.6!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-3.5!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.6!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.7!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-3.5!skip tests/unit/module_utils/test_selector.py future-import-boilerplate!skip tests/unit/module_utils/test_selector.py metaclass-boilerplate!skip plugins/module_utils/selector.py future-import-boilerplate!skip plugins/module_utils/selector.py metaclass-boilerplate!skip plugins/lookup/kustomize.py future-import-boilerplate!skip -plugins/lookup/kustomize.py metaclass-boilerplate!skip \ No newline at end of file +plugins/lookup/kustomize.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py future-import-boilerplate!skip diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index c543b5de40..a33e9a6578 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -1,8 +1,8 @@ -molecule/default/files/deployment.yaml yamllint!skip -molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip -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 +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/__init__.py compile-2.6!skip plugins/module_utils/__init__.py compile-2.7!skip plugins/module_utils/__init__.py compile-3.5!skip @@ -232,18 +232,18 @@ plugins/modules/k8s_service.py validate-modules:return-syntax-error tests/sanity/refresh_ignore_files shebang!skip tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py shebang -molecule/default/roles/k8scopy/library/k8s_create_file.py shebang plugins/modules/k8s_cp.py compile-2.6!skip plugins/modules/k8s_cp.py compile-2.7!skip plugins/modules/k8s_cp.py import-2.6!skip plugins/modules/k8s_cp.py import-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.6!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-3.5!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.6!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.7!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-3.5!skip tests/unit/module_utils/test_selector.py future-import-boilerplate!skip tests/unit/module_utils/test_selector.py metaclass-boilerplate!skip plugins/module_utils/selector.py future-import-boilerplate!skip plugins/module_utils/selector.py metaclass-boilerplate!skip plugins/lookup/kustomize.py future-import-boilerplate!skip -plugins/lookup/kustomize.py metaclass-boilerplate!skip \ No newline at end of file +plugins/lookup/kustomize.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py future-import-boilerplate!skip diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index f9aee54e04..2875d0d149 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -1,8 +1,8 @@ -molecule/default/files/deployment.yaml yamllint!skip -molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip -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 +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/__init__.py compile-2.6!skip plugins/module_utils/__init__.py compile-2.7!skip plugins/module_utils/__init__.py compile-3.5!skip @@ -45,8 +45,6 @@ plugins/module_utils/client/discovery.py import-3.8!skip plugins/module_utils/client/discovery.py import-3.9!skip plugins/module_utils/client/discovery.py import-3.10!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py shebang -molecule/default/roles/k8scopy/library/k8s_create_file.py shebang plugins/module_utils/client/resource.py import-2.6!skip plugins/module_utils/client/resource.py import-2.7!skip plugins/module_utils/client/resource.py import-3.5!skip @@ -240,4 +238,4 @@ plugins/modules/k8s_cp.py compile-2.7!skip plugins/modules/k8s_cp.py import-2.6!skip plugins/modules/k8s_cp.py import-2.7!skip plugins/module_utils/selector.py future-import-boilerplate!skip -plugins/module_utils/selector.py metaclass-boilerplate!skip \ No newline at end of file +plugins/module_utils/selector.py metaclass-boilerplate!skip diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt index b611ae99bb..e62b64d337 100644 --- a/tests/sanity/ignore-2.13.txt +++ b/tests/sanity/ignore-2.13.txt @@ -1,8 +1,8 @@ -molecule/default/files/deployment.yaml yamllint!skip -molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip -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 +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/__init__.py compile-2.7!skip plugins/module_utils/__init__.py compile-3.5!skip plugins/module_utils/__init__.py future-import-boilerplate!skip @@ -36,8 +36,6 @@ plugins/module_utils/client/discovery.py import-3.8!skip plugins/module_utils/client/discovery.py import-3.9!skip plugins/module_utils/client/discovery.py import-3.10!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py shebang -molecule/default/roles/k8scopy/library/k8s_create_file.py shebang plugins/module_utils/client/resource.py import-2.7!skip plugins/module_utils/client/resource.py import-3.5!skip plugins/module_utils/client/resource.py import-3.6!skip diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index 56c60dff47..1a68f5bfcf 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -1,8 +1,8 @@ -molecule/default/files/deployment.yaml yamllint!skip -molecule/default/roles/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip -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 +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/appversionless-chart/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart-v2/templates/configmap.yaml yamllint!skip +tests/integration/targets/helm/files/test-chart/templates/configmap.yaml yamllint!skip plugins/module_utils/__init__.py compile-2.6!skip plugins/module_utils/__init__.py compile-2.7!skip plugins/module_utils/__init__.py compile-3.5!skip @@ -226,18 +226,18 @@ plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc tests/sanity/refresh_ignore_files shebang!skip tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py shebang -molecule/default/roles/k8scopy/library/k8s_create_file.py shebang plugins/modules/k8s_cp.py compile-2.6!skip plugins/modules/k8s_cp.py compile-2.7!skip plugins/modules/k8s_cp.py import-2.6!skip plugins/modules/k8s_cp.py import-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.6!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-2.7!skip -molecule/default/roles/k8scopy/library/kubectl_file_compare.py compile-3.5!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.6!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-2.7!skip +tests/integration/targets/k8s_copy/library/kubectl_file_compare.py compile-3.5!skip tests/unit/module_utils/test_selector.py future-import-boilerplate!skip tests/unit/module_utils/test_selector.py metaclass-boilerplate!skip plugins/module_utils/selector.py future-import-boilerplate!skip plugins/module_utils/selector.py metaclass-boilerplate!skip plugins/lookup/kustomize.py future-import-boilerplate!skip -plugins/lookup/kustomize.py metaclass-boilerplate!skip \ No newline at end of file +plugins/lookup/kustomize.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py metaclass-boilerplate!skip +tests/integration/targets/helm/library/helm_test_version.py future-import-boilerplate!skip diff --git a/tox.ini b/tox.ini index 7d71a8116d..50273ef661 100644 --- a/tox.ini +++ b/tox.ini @@ -2,21 +2,6 @@ minversion = 1.4.2 skipsdist = True -[testenv:molecule] -install_command = pip install {opts} {packages} - -deps = ansible - kubernetes - molecule<3.3.0 - yamllint - flake8 - -passenv = - HOME - -commands= - {posargs} - [testenv:integration] install_command = pip install {opts} {packages} @@ -28,7 +13,7 @@ passenv = HOME commands= - ansible-test integration --docker -v --color --retry-on-error --diff --coverage --continue-on-error --python {posargs} + ansible-test integration -v --color --retry-on-error --diff --coverage --continue-on-error --python {posargs} [testenv:add_docs] deps = git+https://github.com/ansible-network/collection_prep