diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index c316c36b..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,141 +0,0 @@ ---- -name: CI -'on': - push: - branches: - - main - pull_request: - schedule: - - cron: '0 6 * * *' - -jobs: - - sanity: - runs-on: ubuntu-latest - strategy: - matrix: - python_version: ['3.7'] - ansible_version: ['stable-2.11', 'stable-2.10', 'stable-2.9', 'devel'] - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/kubernetes/core - - - name: Set up Python ${{ matrix.python_version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python_version }} - - - name: Check ansible version - uses: actions/checkout@v2 - with: - repository: ansible/ansible - ref: ${{ matrix.ansible_version }} - path: ansible_collections/kubernetes/core/ansible - - - name: Run sanity tests on Python ${{ matrix.python_version }} - run: source ./ansible/hacking/env-setup && make test-sanity PYTHON_VERSION=${{ matrix.python_version }} - working-directory: ./ansible_collections/kubernetes/core - - integration: - runs-on: ubuntu-latest - strategy: - matrix: - # Our old integration tests fail under newer Python versions. - python_version: ['3.6'] - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/kubernetes/core - - - name: Set up Python ${{ matrix.python_version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python_version }} - - - name: Install ansible base (devel branch) - run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - - name: Run integration tests on Python ${{ matrix.python_version }} - run: make test-integration PYTHON_VERSION=${{ matrix.python_version }} - working-directory: ./ansible_collections/kubernetes/core - - - name: Generate coverage report. - run: ansible-test coverage xml -v --requirements --group-by command --group-by version - working-directory: ./ansible_collections/kubernetes/core - - - uses: codecov/codecov-action@v1 - with: - fail_ci_if_error: false - - molecule: - runs-on: ubuntu-latest - strategy: - matrix: - python_version: ['3.7'] - ansible_version: ['==2.9.*', '==2.10.*', ''] - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/kubernetes/core - - - name: Set up KinD cluster - uses: engineerd/setup-kind@v0.5.0 - - - name: Set up Python ${{ matrix.python_version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python_version }} - - # The 3.3.0 release of molecule introduced a breaking change. See - # https://github.com/ansible-community/molecule/issues/3083 - - name: Install molecule and kubernetes dependencies - run: pip install ansible${{ matrix.ansible_version }} "molecule<3.3.0" yamllint kubernetes flake8 jsonpatch - - # The latest release doesn't work with Molecule currently. - # See: https://github.com/ansible-community/molecule/issues/2757 - # - name: Install ansible base, latest release. - # run: | - # pip uninstall -y ansible - # pip install --pre ansible-base - - # The devel branch doesn't work with Molecule currently. - # See: https://github.com/ansible-community/molecule/issues/2757 - # - name: Install ansible base (devel branch) - # run: | - # pip uninstall -y ansible - # pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - name: Create default collection path symlink - run: | - mkdir -p /home/runner/.ansible - ln -s /home/runner/work/kubernetes/kubernetes /home/runner/.ansible/collections - - - name: Run molecule default test scenario - run: make test-molecule - working-directory: ./ansible_collections/kubernetes/core - - unit: - runs-on: ubuntu-latest - strategy: - matrix: - python_version: ['3.7'] - steps: - - name: Check out code - uses: actions/checkout@v2 - with: - path: ansible_collections/kubernetes/core - - - name: Set up Python ${{ matrix.python_version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python_version }} - - - name: Install ansible base (devel branch) - run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check - - - name: Run unit tests on Python ${{ matrix.python_version }} - run: make test-unit PYTHON_VERSION=${{ matrix.python_version }} - working-directory: ./ansible_collections/kubernetes/core diff --git a/.gitignore b/.gitignore index 01b4466a..2c1a59c0 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,9 @@ changelogs/.plugin-cache.yaml tests/output tests/integration/cloud-config-* .cache + +tests/integration/*-chart-*.tgz + +# ansible-test generated file +tests/integration/inventory +tests/integration/*-*.yml diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml deleted file mode 100644 index 730081e6..00000000 --- a/molecule/default/converge.yml +++ /dev/null @@ -1,254 +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 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 ] - tags: - - always - - roles: - - role: helm - tags: - - helm - - 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 e6b1cddc..00000000 --- a/molecule/default/molecule.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -driver: - name: delegated - options: - managed: false - login_cmd_template: 'docker exec -ti {instance} bash' - ansible_connection_options: - ansible_connection: docker -lint: | - set -e - yamllint . - flake8 -platforms: - - name: instance-kind -provisioner: - name: ansible - log: true - config_options: - inventory: - enable_plugins: kubernetes.core.k8s - 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 - - lint - - syntax - - converge - - verify -dependency: - name: galaxy - options: - requirements-file: requirements.yml diff --git a/test-requirements.txt b/test-requirements.txt index 038d73d0..880eec68 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1 +1,4 @@ kubernetes-validate +coverage==4.5.4 +pytest +pytest-xdist diff --git a/tests/integration/targets/helm/aliases b/tests/integration/targets/helm/aliases new file mode 100644 index 00000000..a07a1cbc --- /dev/null +++ b/tests/integration/targets/helm/aliases @@ -0,0 +1,7 @@ +slow +time=609 +helm_info +helm_repository +helm_template +helm_plugin +helm_plugin_info diff --git a/molecule/default/roles/helm/defaults/main.yml b/tests/integration/targets/helm/defaults/main.yml similarity index 90% rename from molecule/default/roles/helm/defaults/main.yml rename to tests/integration/targets/helm/defaults/main.yml index 26c0a1e9..cafe372c 100644 --- a/molecule/default/roles/helm/defaults/main.yml +++ b/tests/integration/targets/helm/defaults/main.yml @@ -3,9 +3,6 @@ helm_archive_name: "helm-{{ helm_version }}-{{ ansible_system | lower }}-amd64.t 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" chart_test_version: 3.8.0 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 100% rename from molecule/default/roles/helm/files/test-crds/crds/crd.yaml rename to tests/integration/targets/helm/files/test-crds/crds/crd.yaml 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/molecule/default/roles/helm/tasks/install.yml b/tests/integration/targets/helm/tasks/install.yml similarity index 74% rename from molecule/default/roles/helm/tasks/install.yml rename to tests/integration/targets/helm/tasks/install.yml index 8030aac7..4b68b873 100644 --- a/molecule/default/roles/helm/tasks/install.yml +++ b/tests/integration/targets/helm/tasks/install.yml @@ -9,3 +9,7 @@ src: 'https://get.helm.sh/{{ helm_archive_name }}' dest: /tmp/helm/ remote_src: yes + retries: 10 + delay: 5 + register: result + until: result is not failed 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 95% rename from molecule/default/roles/helm/tasks/test_crds.yml rename to tests/integration/targets/helm/tasks/test_crds.yml index 071ebc71..f8370f4a 100644 --- a/molecule/default/roles/helm/tasks/test_crds.yml +++ b/tests/integration/targets/helm/tasks/test_crds.yml @@ -15,6 +15,7 @@ - name: Install chart while skipping CRDs helm: + binary_path: "{{ helm_binary }}" chart_ref: "/tmp/helm_test_crds/{{ test_chart }}" namespace: "{{ helm_namespace }}" name: test-crds @@ -46,12 +47,14 @@ # 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 }}" name: test-crds state: absent - name: Install chart with CRDs helm: + binary_path: "{{ helm_binary }}" chart_ref: "/tmp/helm_test_crds/{{ test_chart }}" namespace: "{{ helm_namespace }}" name: test-crds 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 100% rename from molecule/default/roles/helm/tasks/test_helm_not_installed.yml rename to tests/integration/targets/helm/tasks/test_helm_not_installed.yml diff --git a/molecule/default/roles/helm/tasks/test_read_envvars.yml b/tests/integration/targets/helm/tasks/test_read_envvars.yml similarity index 100% rename from molecule/default/roles/helm/tasks/test_read_envvars.yml rename to tests/integration/targets/helm/tasks/test_read_envvars.yml diff --git a/molecule/default/roles/helm/tasks/tests_chart.yml b/tests/integration/targets/helm/tasks/tests_chart.yml similarity index 100% rename from molecule/default/roles/helm/tasks/tests_chart.yml rename to tests/integration/targets/helm/tasks/tests_chart.yml 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 100% 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 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 87% 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 067b216b..566bfff9 100644 --- a/molecule/default/roles/helm/tasks/tests_chart/from_repository.yml +++ b/tests/integration/targets/helm/tasks/tests_chart/from_repository.yml @@ -1,6 +1,7 @@ --- - name: Add chart repo helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm repo_url: "{{ chart_test_repo }}" @@ -14,6 +15,7 @@ - name: Add chart repo helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm repo_url: "{{ chart_test_repo }}" state: absent 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 100% rename from molecule/default/roles/helm/tasks/tests_chart/from_url.yml rename to tests/integration/targets/helm/tasks/tests_chart/from_url.yml diff --git a/molecule/default/roles/helm/tasks/tests_helm_diff.yml b/tests/integration/targets/helm/tasks/tests_helm_diff.yml similarity index 97% rename from molecule/default/roles/helm/tasks/tests_helm_diff.yml rename to tests/integration/targets/helm/tasks/tests_helm_diff.yml index c461be6d..5b4ec579 100644 --- a/molecule/default/roles/helm/tasks/tests_helm_diff.yml +++ b/tests/integration/targets/helm/tasks/tests_helm_diff.yml @@ -6,6 +6,7 @@ block: - name: Install helm diff helm_plugin: + binary_path: "{{ helm_binary }}" state: present plugin_path: https://github.com/databus23/helm-diff @@ -136,6 +137,7 @@ - name: Uninstall helm diff helm_plugin: + binary_path: "{{ helm_binary }}" state: absent plugin_name: diff 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 98% rename from molecule/default/roles/helm/tasks/tests_helm_plugin.yml rename to tests/integration/targets/helm/tasks/tests_helm_plugin.yml index 7a97e3e1..d64573c2 100644 --- a/molecule/default/roles/helm/tasks/tests_helm_plugin.yml +++ b/tests/integration/targets/helm/tasks/tests_helm_plugin.yml @@ -97,6 +97,7 @@ - name: Gather Helm plugin info helm_plugin_info: + binary_path: "{{ helm_binary }}" register: r - name: Set sample_plugin version diff --git a/molecule/default/roles/helm/tasks/tests_repository.yml b/tests/integration/targets/helm/tasks/tests_repository.yml similarity index 85% rename from molecule/default/roles/helm/tasks/tests_repository.yml rename to tests/integration/targets/helm/tasks/tests_repository.yml index 9d274819..eedea01a 100644 --- a/molecule/default/roles/helm/tasks/tests_repository.yml +++ b/tests/integration/targets/helm/tasks/tests_repository.yml @@ -1,11 +1,13 @@ --- - name: "Ensure test_helm_repo doesn't exist" helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo state: absent - name: Add test_helm_repo chart repository helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo repo_url: "{{ chart_test_repo }}" register: repository @@ -17,6 +19,7 @@ - name: Check idempotency helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo repo_url: "{{ chart_test_repo }}" register: repository @@ -28,6 +31,7 @@ - name: Failed to add repository with the same name helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo repo_url: "https://other-charts.url" register: repository_errors @@ -40,6 +44,7 @@ - name: Remove test_helm_repo chart repository helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo state: absent register: repository @@ -51,6 +56,7 @@ - name: Check idempotency after remove helm_repository: + binary_path: "{{ helm_binary }}" name: test_helm_repo state: absent register: repository diff --git a/tests/integration/targets/inventory_k8s/aliases b/tests/integration/targets/inventory_k8s/aliases new file mode 100644 index 00000000..b62ee8bb --- /dev/null +++ b/tests/integration/targets/inventory_k8s/aliases @@ -0,0 +1,2 @@ +context/target +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 00000000..e02761b4 --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/play.yml @@ -0,0 +1,94 @@ +--- +- name: Converge + hosts: localhost + connection: local + + collections: + - kubernetes.core + + vars_files: + - vars/main.yml + + 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: 240 + 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/runme.sh b/tests/integration/targets/inventory_k8s/playbooks/runme.sh new file mode 100644 index 00000000..1ec40e26 --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/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/inventory_k8s/playbooks/test.inventory_k8s.yml b/tests/integration/targets/inventory_k8s/playbooks/test.inventory_k8s.yml new file mode 100644 index 00000000..cdbb9316 --- /dev/null +++ b/tests/integration/targets/inventory_k8s/playbooks/test.inventory_k8s.yml @@ -0,0 +1,2 @@ +--- +plugin: kubernetes.core.k8s diff --git a/molecule/default/vars/main.yml b/tests/integration/targets/inventory_k8s/playbooks/vars/main.yml similarity index 100% rename from molecule/default/vars/main.yml rename to tests/integration/targets/inventory_k8s/playbooks/vars/main.yml diff --git a/tests/integration/targets/k8s_access_review/aliases b/tests/integration/targets/k8s_access_review/aliases new file mode 100644 index 00000000..f8f49b1e --- /dev/null +++ b/tests/integration/targets/k8s_access_review/aliases @@ -0,0 +1,2 @@ +time=5 +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 00000000..1f0218da --- /dev/null +++ b/tests/integration/targets/k8s_append_hash/aliases @@ -0,0 +1,2 @@ +time=6 +k8s 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 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/k8s_append_hash/defaults/main.yml @@ -0,0 +1 @@ +--- diff --git a/molecule/default/tasks/append_hash.yml b/tests/integration/targets/k8s_append_hash/tasks/main.yml similarity index 100% rename from molecule/default/tasks/append_hash.yml rename to tests/integration/targets/k8s_append_hash/tasks/main.yml diff --git a/tests/integration/targets/k8s_apply/aliases b/tests/integration/targets/k8s_apply/aliases new file mode 100644 index 00000000..9685c4eb --- /dev/null +++ b/tests/integration/targets/k8s_apply/aliases @@ -0,0 +1,4 @@ +slow +k8s_service +k8s +time=192 diff --git a/tests/integration/targets/k8s_apply/defaults/main.yml b/tests/integration/targets/k8s_apply/defaults/main.yml new file mode 100644 index 00000000..303a7c16 --- /dev/null +++ b/tests/integration/targets/k8s_apply/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 }}" + +k8s_wait_timeout: 240 diff --git a/molecule/default/tasks/apply.yml b/tests/integration/targets/k8s_apply/tasks/main.yml similarity index 64% rename from molecule/default/tasks/apply.yml rename to tests/integration/targets/k8s_apply/tasks/main.yml index 18c60d83..0fe24c40 100644 --- a/molecule/default/tasks/apply.yml +++ b/tests/integration/targets/k8s_apply/tasks/main.yml @@ -307,6 +307,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 @@ -378,6 +379,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 @@ -426,6 +428,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 +452,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: diff --git a/tests/integration/targets/k8s_cluster_info/aliases b/tests/integration/targets/k8s_cluster_info/aliases new file mode 100644 index 00000000..1e4b03b8 --- /dev/null +++ b/tests/integration/targets/k8s_cluster_info/aliases @@ -0,0 +1,2 @@ +k8s_cluster_info +time=6 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_crd/aliases b/tests/integration/targets/k8s_crd/aliases new file mode 100644 index 00000000..dd3bd303 --- /dev/null +++ b/tests/integration/targets/k8s_crd/aliases @@ -0,0 +1,2 @@ +k8s +time=15 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 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/k8s_crd/defaults/main.yml @@ -0,0 +1 @@ +--- 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/molecule/default/tasks/crd.yml b/tests/integration/targets/k8s_crd/tasks/main.yml similarity index 71% rename from molecule/default/tasks/crd.yml rename to tests/integration/targets/k8s_crd/tasks/main.yml index 2a96610c..503c5cff 100644 --- a/molecule/default/tasks/crd.yml +++ b/tests/integration/targets/k8s_crd/tasks/main.yml @@ -7,7 +7,7 @@ - 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,14 +15,14 @@ - name: Create custom resource definition k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" + definition: "{{ lookup('file', 'crd-resource.yml') }}" namespace: crd 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') }}" + definition: "{{ lookup('file', 'crd-resource.yml') }}" namespace: crd register: recreate_crd ignore_errors: yes @@ -35,7 +35,7 @@ - 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 @@ -43,7 +43,7 @@ - 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 @@ -54,7 +54,7 @@ - name: Remove crd k8s: - definition: "{{ lookup('file', kubernetes_role_path + '/files/crd-resource.yml') }}" + definition: "{{ lookup('file', 'crd-resource.yml') }}" namespace: crd state: absent diff --git a/tests/integration/targets/k8s_delete/aliases b/tests/integration/targets/k8s_delete/aliases new file mode 100644 index 00000000..ee3d09e2 --- /dev/null +++ b/tests/integration/targets/k8s_delete/aliases @@ -0,0 +1,3 @@ +k8s_info +k8s +time=64 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 00000000..a478de97 --- /dev/null +++ b/tests/integration/targets/k8s_delete/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 }}" + +kubernetes_role_path: ../../tests/integration/targets/kubernetes diff --git a/molecule/default/tasks/delete.yml b/tests/integration/targets/k8s_delete/tasks/main.yml similarity index 100% rename from molecule/default/tasks/delete.yml rename to tests/integration/targets/k8s_delete/tasks/main.yml diff --git a/tests/integration/targets/k8s_exec/aliases b/tests/integration/targets/k8s_exec/aliases new file mode 100644 index 00000000..30e4928b --- /dev/null +++ b/tests/integration/targets/k8s_exec/aliases @@ -0,0 +1,3 @@ +k8s_exec +k8s +time=11 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 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/k8s_exec/defaults/main.yml @@ -0,0 +1 @@ +--- diff --git a/molecule/default/tasks/exec.yml b/tests/integration/targets/k8s_exec/tasks/main.yml similarity index 100% rename from molecule/default/tasks/exec.yml rename to tests/integration/targets/k8s_exec/tasks/main.yml diff --git a/tests/integration/targets/k8s_full/aliases b/tests/integration/targets/k8s_full/aliases new file mode 100644 index 00000000..20c568cb --- /dev/null +++ b/tests/integration/targets/k8s_full/aliases @@ -0,0 +1,3 @@ +k8s +k8s_info +time=37 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 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/k8s_full/defaults/main.yml @@ -0,0 +1 @@ +--- 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 00000000..bd75b207 --- /dev/null +++ b/tests/integration/targets/k8s_gc/aliases @@ -0,0 +1,2 @@ +k8s +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 00000000..ed97d539 --- /dev/null +++ b/tests/integration/targets/k8s_gc/defaults/main.yml @@ -0,0 +1 @@ +--- diff --git a/molecule/default/tasks/gc.yml b/tests/integration/targets/k8s_gc/tasks/main.yml similarity index 100% rename from molecule/default/tasks/gc.yml rename to tests/integration/targets/k8s_gc/tasks/main.yml diff --git a/tests/integration/targets/k8s_info/aliases b/tests/integration/targets/k8s_info/aliases new file mode 100644 index 00000000..21c9c811 --- /dev/null +++ b/tests/integration/targets/k8s_info/aliases @@ -0,0 +1,3 @@ +k8s +k8s_info +time=13 diff --git a/molecule/default/tasks/info.yml b/tests/integration/targets/k8s_info/tasks/main.yml similarity index 100% rename from molecule/default/tasks/info.yml rename to tests/integration/targets/k8s_info/tasks/main.yml diff --git a/tests/integration/targets/k8s_json_patch/aliases b/tests/integration/targets/k8s_json_patch/aliases new file mode 100644 index 00000000..73984332 --- /dev/null +++ b/tests/integration/targets/k8s_json_patch/aliases @@ -0,0 +1,3 @@ +k8s_json_patch +k8s +time=33 diff --git a/molecule/default/tasks/json_patch.yml b/tests/integration/targets/k8s_json_patch/tasks/main.yml similarity index 95% rename from molecule/default/tasks/json_patch.yml rename to tests/integration/targets/k8s_json_patch/tasks/main.yml index 3c7aec07..63ad70f6 100644 --- a/molecule/default/tasks/json_patch.yml +++ b/tests/integration/targets/k8s_json_patch/tasks/main.yml @@ -2,6 +2,7 @@ namespace: json-patch pod: json-patch deployment: json-patch + k8s_wait_timeout: 240 block: - name: Ensure namespace exists @@ -28,6 +29,7 @@ - -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: @@ -118,6 +120,7 @@ - name: Create a simple deployment kubernetes.core.k8s: wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: Deployment @@ -154,6 +157,7 @@ path: /spec/replicas value: 3 wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: result - name: Assert all replicas are available diff --git a/tests/integration/targets/k8s_lists/aliases b/tests/integration/targets/k8s_lists/aliases new file mode 100644 index 00000000..5b4920bc --- /dev/null +++ b/tests/integration/targets/k8s_lists/aliases @@ -0,0 +1,3 @@ +k8s_info +k8s +time=22 diff --git a/molecule/default/tasks/lists.yml b/tests/integration/targets/k8s_lists/tasks/main.yml similarity index 100% rename from molecule/default/tasks/lists.yml rename to tests/integration/targets/k8s_lists/tasks/main.yml diff --git a/tests/integration/targets/k8s_log/aliases b/tests/integration/targets/k8s_log/aliases new file mode 100644 index 00000000..38be79f8 --- /dev/null +++ b/tests/integration/targets/k8s_log/aliases @@ -0,0 +1,2 @@ +k8s_log +time=27 diff --git a/molecule/default/tasks/log.yml b/tests/integration/targets/k8s_log/tasks/main.yml similarity index 96% rename from molecule/default/tasks/log.yml rename to tests/integration/targets/k8s_log/tasks/main.yml index d3da05d3..39fb9d55 100644 --- a/molecule/default/tasks/log.yml +++ b/tests/integration/targets/k8s_log/tasks/main.yml @@ -1,5 +1,8 @@ --- - block: + - set_fact: + k8s_wait_timeout: 240 + - name: ensure that k8s-log namespace exists k8s: kind: Namespace @@ -8,6 +11,7 @@ - name: create hello-world deployment k8s: wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: Deployment diff --git a/tests/integration/targets/k8s_merge_type/aliases b/tests/integration/targets/k8s_merge_type/aliases new file mode 100644 index 00000000..b961a8b1 --- /dev/null +++ b/tests/integration/targets/k8s_merge_type/aliases @@ -0,0 +1,3 @@ +time=19 +k8s +k8s_info diff --git a/molecule/default/tasks/merge_type.yml b/tests/integration/targets/k8s_merge_type/tasks/main.yml similarity index 100% rename from molecule/default/tasks/merge_type.yml rename to tests/integration/targets/k8s_merge_type/tasks/main.yml diff --git a/tests/integration/targets/k8s_patched/aliases b/tests/integration/targets/k8s_patched/aliases new file mode 100644 index 00000000..0b42008c --- /dev/null +++ b/tests/integration/targets/k8s_patched/aliases @@ -0,0 +1,3 @@ +time=20 +k8s +k8s_info diff --git a/molecule/default/tasks/patched.yml b/tests/integration/targets/k8s_patched/tasks/main.yml similarity index 100% rename from molecule/default/tasks/patched.yml rename to tests/integration/targets/k8s_patched/tasks/main.yml diff --git a/tests/integration/targets/k8s_rollback/aliases b/tests/integration/targets/k8s_rollback/aliases new file mode 100644 index 00000000..90770cd0 --- /dev/null +++ b/tests/integration/targets/k8s_rollback/aliases @@ -0,0 +1,4 @@ +k8s_rollback +k8s +k8s_info +time=187 diff --git a/molecule/default/tasks/rollback.yml b/tests/integration/targets/k8s_rollback/tasks/main.yml similarity index 95% rename from molecule/default/tasks/rollback.yml rename to tests/integration/targets/k8s_rollback/tasks/main.yml index 743ff53c..7bb64351 100644 --- a/molecule/default/tasks/rollback.yml +++ b/tests/integration/targets/k8s_rollback/tasks/main.yml @@ -3,6 +3,7 @@ - name: Set variables set_fact: namespace: "testingrollback" + k8s_wait_timeout: 240 - name: Create a namespace k8s: @@ -20,6 +21,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" inline: &deploy apiVersion: apps/v1 kind: Deployment @@ -53,6 +55,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: Deployment @@ -96,6 +99,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: DaemonSet @@ -149,6 +153,7 @@ k8s: state: present wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" definition: apiVersion: apps/v1 kind: DaemonSet diff --git a/tests/integration/targets/k8s_scale/aliases b/tests/integration/targets/k8s_scale/aliases new file mode 100644 index 00000000..525c72a7 --- /dev/null +++ b/tests/integration/targets/k8s_scale/aliases @@ -0,0 +1,4 @@ +k8s_scale +k8s +k8s_info +time=150 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 00000000..20a83454 --- /dev/null +++ b/tests/integration/targets/k8s_scale/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 }}" + +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/molecule/default/tasks/scale.yml b/tests/integration/targets/k8s_scale/tasks/main.yml similarity index 93% rename from molecule/default/tasks/scale.yml rename to tests/integration/targets/k8s_scale/tasks/main.yml index 866a5deb..072e1eb7 100644 --- a/molecule/default/tasks/scale.yml +++ b/tests/integration/targets/k8s_scale/tasks/main.yml @@ -26,7 +26,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 +53,7 @@ namespace: "{{ scale_namespace }}" replicas: 0 wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_down - name: Get pods in scale-deploy @@ -90,7 +91,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 @@ -125,7 +126,7 @@ namespace: "{{ scale_namespace }}" replicas: 2 wait: yes - wait_timeout: 60 + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_up - name: Get pods in scale-deploy @@ -154,6 +155,7 @@ namespace: "{{ scale_namespace }}" replicas: 2 wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_up_noop - name: Get pods in scale-deploy @@ -227,6 +229,8 @@ resource_version: 0 label_selectors: - app=nginx + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_out - assert: @@ -257,6 +261,8 @@ namespace: "{{ scale_namespace }}" label_selectors: - app=nginx + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: scale_out - assert: diff --git a/tests/integration/targets/k8s_template/aliases b/tests/integration/targets/k8s_template/aliases new file mode 100644 index 00000000..7a847f3c --- /dev/null +++ b/tests/integration/targets/k8s_template/aliases @@ -0,0 +1,4 @@ +k8s_service +k8s +k8s_info +time=75 diff --git a/molecule/default/tasks/template.yml b/tests/integration/targets/k8s_template/tasks/main.yml similarity index 94% rename from molecule/default/tasks/template.yml rename to tests/integration/targets/k8s_template/tasks/main.yml index d7cba2dc..d62f6331 100644 --- a/molecule/default/tasks/template.yml +++ b/tests/integration/targets/k8s_template/tasks/main.yml @@ -2,6 +2,7 @@ - block: - set_fact: template_namespace: template-test + k8s_wait_timeout: 240 - name: Ensure namespace exists k8s: @@ -72,6 +73,7 @@ kubernetes.core.k8s: template: "pod_template_one.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-1 k8s_pod_namespace: "{{ template_namespace }}" @@ -103,6 +105,7 @@ template: path: "pod_template_one.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-3 k8s_pod_namespace: "{{ template_namespace }}" @@ -120,6 +123,7 @@ 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 ]]" @@ -136,6 +140,7 @@ template: path: "pod_template_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 @@ -156,6 +161,7 @@ variable_end_string: ']]' - path: "pod_template_three.j2" wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" vars: k8s_pod_name_one: pod-7 k8s_pod_name_two: pod-8 @@ -224,6 +230,7 @@ - pod_template_one.j2 continue_on_error: true wait: true + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" register: resource ignore_errors: true @@ -239,17 +246,6 @@ - resource.result.results | selectattr('changed') | list | length == 1 - resource.result.results | selectattr('error', 'defined') | list | length == 1 - - name: Remove Pod (Cleanup) - kubernetes.core.k8s: - api_version: v1 - kind: Pod - name: "pod-{{ item }}" - namespace: "{{ template_namespace }}" - state: absent - wait: yes - ignore_errors: yes - loop: "{{ range(1, 12) | list }}" - always: - name: Remove namespace (Cleanup) kubernetes.core.k8s: diff --git a/molecule/default/templates/pod_template_one.j2 b/tests/integration/targets/k8s_template/templates/pod_template_one.j2 similarity index 100% rename from molecule/default/templates/pod_template_one.j2 rename to tests/integration/targets/k8s_template/templates/pod_template_one.j2 diff --git a/molecule/default/templates/pod_template_three.j2 b/tests/integration/targets/k8s_template/templates/pod_template_three.j2 similarity index 100% rename from molecule/default/templates/pod_template_three.j2 rename to tests/integration/targets/k8s_template/templates/pod_template_three.j2 diff --git a/molecule/default/templates/pod_template_two.j2 b/tests/integration/targets/k8s_template/templates/pod_template_two.j2 similarity index 100% rename from molecule/default/templates/pod_template_two.j2 rename to tests/integration/targets/k8s_template/templates/pod_template_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_waiter/aliases b/tests/integration/targets/k8s_waiter/aliases new file mode 100644 index 00000000..295a154c --- /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 00000000..303a7c16 --- /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 }}" + +k8s_wait_timeout: 240 diff --git a/molecule/default/tasks/waiter.yml b/tests/integration/targets/k8s_waiter/tasks/main.yml similarity index 95% rename from molecule/default/tasks/waiter.yml rename to tests/integration/targets/k8s_waiter/tasks/main.yml index 44fc42b3..6dc3d29a 100644 --- a/molecule/default/tasks/waiter.yml +++ b/tests/integration/targets/k8s_waiter/tasks/main.yml @@ -21,6 +21,7 @@ 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 @@ -49,8 +50,7 @@ app: "{{ k8s_pod_name }}" 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 @@ -81,7 +81,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:2 @@ -114,7 +114,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 @@ -203,6 +203,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 @@ -233,6 +234,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 @@ -279,6 +281,7 @@ paused: True apply: no wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" wait_condition: type: Progressing status: Unknown diff --git a/tests/integration/targets/kubernetes/README.md b/tests/integration/targets/kubernetes/README.md deleted file mode 100644 index 2a09ca17..00000000 --- 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 326e6910..00000000 --- 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 bed92bc7..00000000 --- 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 72505f88..00000000 --- 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 efb5408e..00000000 --- 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 ac312297..00000000 --- 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 c89f5a31..00000000 --- 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 23d65c7e..00000000 --- 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 52fae25f..00000000 --- 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 7a534882..00000000 --- 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 8acdb49e..00000000 --- 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 e00c7c23..00000000 --- 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 aeda2522..00000000 --- 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 00000000..db0ee6ed --- /dev/null +++ b/tests/integration/targets/lookup_k8s/aliases @@ -0,0 +1,3 @@ +context/target +time=16 +k8s diff --git a/molecule/default/tasks/lookup_k8s.yml b/tests/integration/targets/lookup_k8s/tasks/main.yml similarity index 100% rename from molecule/default/tasks/lookup_k8s.yml rename to tests/integration/targets/lookup_k8s/tasks/main.yml diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt index 36c8f4e7..9b712685 100644 --- a/tests/sanity/ignore-2.10.txt +++ b/tests/sanity/ignore-2.10.txt @@ -4,10 +4,10 @@ plugins/modules/k8s_scale.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s_scale.py validate-modules:return-syntax-error plugins/modules/k8s_service.py validate-modules:return-syntax-error plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc -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/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/k8sdynamicclient.py import-3.7!skip plugins/module_utils/client/discovery.py import-3.7!skip plugins/module_utils/client/resource.py import-3.7!skip @@ -15,4 +15,51 @@ plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/files/deployment.yaml yamllint!skip \ No newline at end of file +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py import-2.6!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.5!skip +plugins/module_utils/client/discovery.py import-3.6!skip +plugins/module_utils/client/discovery.py import-3.7!skip +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 +plugins/module_utils/common.py compile-2.6!skip +plugins/module_utils/common.py compile-2.7!skip +plugins/module_utils/common.py compile-3.5!skip +plugins/module_utils/common.py future-import-boilerplate!skip +plugins/module_utils/common.py import-2.6!skip +plugins/module_utils/common.py import-2.7!skip +plugins/module_utils/common.py import-3.5!skip +plugins/module_utils/common.py metaclass-boilerplate!skip +plugins/modules/k8s_info.py compile-2.6!skip +plugins/modules/k8s_info.py compile-2.7!skip +plugins/modules/k8s_info.py compile-3.5!skip +plugins/modules/k8s_info.py future-import-boilerplate!skip +plugins/modules/k8s_info.py import-2.6!skip +plugins/modules/k8s_info.py import-2.7!skip +plugins/modules/k8s_info.py import-3.5!skip +plugins/modules/k8s_info.py metaclass-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py compile-2.6!skip +plugins/module_utils/k8sdynamicclient.py compile-2.7!skip +plugins/module_utils/k8sdynamicclient.py compile-3.5!skip +plugins/module_utils/k8sdynamicclient.py future-import-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py import-2.6!skip +plugins/module_utils/k8sdynamicclient.py import-2.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.5!skip +plugins/module_utils/k8sdynamicclient.py import-3.6!skip +plugins/module_utils/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.8!skip +plugins/module_utils/k8sdynamicclient.py import-3.9!skip +plugins/module_utils/k8sdynamicclient.py import-3.10!skip +plugins/module_utils/k8sdynamicclient.py metaclass-boilerplate!skip +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 +plugins/module_utils/client/resource.py import-3.6!skip +plugins/module_utils/client/resource.py import-3.7!skip +plugins/module_utils/client/resource.py import-3.8!skip +plugins/module_utils/client/resource.py import-3.9!skip +plugins/module_utils/client/resource.py import-3.10!skip \ No newline at end of file diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index 36c8f4e7..ac8025c1 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -1,18 +1,49 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc -plugins/modules/k8s.py validate-modules:return-syntax-error plugins/modules/k8s_scale.py validate-modules:parameter-type-not-in-doc -plugins/modules/k8s_scale.py validate-modules:return-syntax-error -plugins/modules/k8s_service.py validate-modules:return-syntax-error plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc -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/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/k8sdynamicclient.py import-3.7!skip plugins/module_utils/client/discovery.py import-3.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip -tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.5!skip +plugins/module_utils/client/discovery.py import-3.6!skip +plugins/module_utils/client/discovery.py import-3.8!skip +plugins/module_utils/common.py compile-2.7!skip +plugins/module_utils/common.py compile-3.5!skip +plugins/module_utils/common.py future-import-boilerplate!skip +plugins/module_utils/common.py import-2.7!skip +plugins/module_utils/common.py import-3.5!skip +plugins/module_utils/common.py metaclass-boilerplate!skip +plugins/modules/k8s_info.py compile-2.7!skip +plugins/modules/k8s_info.py compile-3.5!skip +plugins/modules/k8s_info.py future-import-boilerplate!skip +plugins/modules/k8s_info.py import-2.7!skip +plugins/modules/k8s_info.py import-3.5!skip +plugins/modules/k8s_info.py metaclass-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py compile-2.7!skip +plugins/module_utils/k8sdynamicclient.py compile-3.5!skip +plugins/module_utils/k8sdynamicclient.py future-import-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py import-2.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.5!skip +plugins/module_utils/k8sdynamicclient.py import-3.6!skip +plugins/module_utils/k8sdynamicclient.py import-3.8!skip +plugins/module_utils/k8sdynamicclient.py metaclass-boilerplate!skip +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 +plugins/module_utils/client/resource.py import-3.8!skip +plugins/module_utils/client/discovery.py pylint!skip +plugins/module_utils/common.py pylint!skip +plugins/action/k8s_info.py pylint!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/files/deployment.yaml yamllint!skip \ No newline at end of file +tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +plugins/modules/k8s_scale.py validate-modules:return-syntax-error +plugins/modules/k8s.py validate-modules:return-syntax-error +plugins/modules/k8s_service.py validate-modules:return-syntax-error \ No newline at end of file diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index 742b5cad..fe20bdea 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -1,16 +1,47 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc -plugins/modules/k8s.py validate-modules:return-syntax-error plugins/modules/k8s_scale.py validate-modules:parameter-type-not-in-doc -plugins/modules/k8s_scale.py validate-modules:return-syntax-error -plugins/modules/k8s_service.py validate-modules:return-syntax-error plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc -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/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/k8sdynamicclient.py import-3.7!skip plugins/module_utils/client/discovery.py import-3.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip -molecule/default/files/deployment.yaml yamllint!skip \ No newline at end of file +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.5!skip +plugins/module_utils/client/discovery.py import-3.6!skip +plugins/module_utils/client/discovery.py import-3.8!skip +plugins/module_utils/common.py compile-2.7!skip +plugins/module_utils/common.py compile-3.5!skip +plugins/module_utils/common.py future-import-boilerplate!skip +plugins/module_utils/common.py import-2.7!skip +plugins/module_utils/common.py import-3.5!skip +plugins/module_utils/common.py metaclass-boilerplate!skip +plugins/modules/k8s_info.py compile-2.7!skip +plugins/modules/k8s_info.py compile-3.5!skip +plugins/modules/k8s_info.py future-import-boilerplate!skip +plugins/modules/k8s_info.py import-2.7!skip +plugins/modules/k8s_info.py import-3.5!skip +plugins/modules/k8s_info.py metaclass-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py compile-2.7!skip +plugins/module_utils/k8sdynamicclient.py compile-3.5!skip +plugins/module_utils/k8sdynamicclient.py future-import-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py import-2.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.5!skip +plugins/module_utils/k8sdynamicclient.py import-3.6!skip +plugins/module_utils/k8sdynamicclient.py import-3.8!skip +plugins/module_utils/k8sdynamicclient.py metaclass-boilerplate!skip +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 +plugins/module_utils/client/resource.py import-3.8!skip +plugins/module_utils/client/discovery.py pylint!skip +plugins/module_utils/common.py pylint!skip +plugins/action/k8s_info.py pylint!skip +plugins/modules/k8s_scale.py validate-modules:return-syntax-error +plugins/modules/k8s.py validate-modules:return-syntax-error +plugins/modules/k8s_service.py validate-modules:return-syntax-error \ No newline at end of file diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt new file mode 100644 index 00000000..88afb16c --- /dev/null +++ b/tests/sanity/ignore-2.13.txt @@ -0,0 +1,57 @@ +plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc +plugins/modules/k8s.py validate-modules:return-syntax-error +plugins/modules/k8s.py validate-modules:invalid-documentation-markup +plugins/modules/k8s_scale.py validate-modules:parameter-type-not-in-doc +plugins/modules/k8s_scale.py validate-modules:return-syntax-error +plugins/modules/k8s_scale.py validate-modules:invalid-documentation-markup +plugins/modules/k8s_service.py validate-modules:return-syntax-error +plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc +plugins/modules/k8s_service.py validate-modules:invalid-documentation-markup +plugins/modules/k8s_json_patch.py validate-modules:invalid-documentation-markup +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/k8sdynamicclient.py import-3.7!skip +plugins/module_utils/client/discovery.py import-3.7!skip +plugins/module_utils/client/resource.py import-3.7!skip +plugins/module_utils/client/discovery.py future-import-boilerplate!skip +plugins/module_utils/client/discovery.py metaclass-boilerplate!skip +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.5!skip +plugins/module_utils/client/discovery.py import-3.6!skip +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/common.py compile-2.7!skip +plugins/module_utils/common.py compile-3.5!skip +plugins/module_utils/common.py future-import-boilerplate!skip +plugins/module_utils/common.py import-2.7!skip +plugins/module_utils/common.py import-3.5!skip +plugins/module_utils/common.py metaclass-boilerplate!skip +plugins/modules/k8s_info.py compile-2.7!skip +plugins/modules/k8s_info.py compile-3.5!skip +plugins/modules/k8s_info.py future-import-boilerplate!skip +plugins/modules/k8s_info.py import-2.7!skip +plugins/modules/k8s_info.py import-3.5!skip +plugins/modules/k8s_info.py metaclass-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py compile-2.7!skip +plugins/module_utils/k8sdynamicclient.py compile-3.5!skip +plugins/module_utils/k8sdynamicclient.py future-import-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py import-2.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.5!skip +plugins/module_utils/k8sdynamicclient.py import-3.6!skip +plugins/module_utils/k8sdynamicclient.py import-3.8!skip +plugins/module_utils/k8sdynamicclient.py import-3.9!skip +plugins/module_utils/k8sdynamicclient.py import-3.10!skip +plugins/module_utils/k8sdynamicclient.py metaclass-boilerplate!skip +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 +plugins/module_utils/client/resource.py import-3.8!skip +plugins/module_utils/client/resource.py import-3.9!skip +plugins/module_utils/client/resource.py import-3.10!skip +plugins/module_utils/client/discovery.py pylint!skip +plugins/module_utils/common.py pylint!skip +plugins/action/k8s_info.py pylint!skip \ No newline at end of file diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index 14c8a24c..990e17e3 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -1,15 +1,46 @@ plugins/modules/k8s.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s_scale.py validate-modules:parameter-type-not-in-doc plugins/modules/k8s_service.py validate-modules:parameter-type-not-in-doc -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/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/k8sdynamicclient.py import-3.7!skip plugins/module_utils/client/discovery.py import-3.7!skip plugins/module_utils/client/resource.py import-3.7!skip plugins/module_utils/client/discovery.py future-import-boilerplate!skip plugins/module_utils/client/discovery.py metaclass-boilerplate!skip -tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip +tests/integration/targets/k8s_scale/files/deployment.yaml yamllint!skip +plugins/module_utils/client/discovery.py import-2.7!skip +plugins/module_utils/client/discovery.py import-3.5!skip +plugins/module_utils/client/discovery.py import-3.6!skip +plugins/module_utils/client/discovery.py import-3.8!skip +plugins/module_utils/common.py compile-2.7!skip +plugins/module_utils/common.py compile-3.5!skip +plugins/module_utils/common.py future-import-boilerplate!skip +plugins/module_utils/common.py import-2.7!skip +plugins/module_utils/common.py import-3.5!skip +plugins/module_utils/common.py metaclass-boilerplate!skip +plugins/modules/k8s_info.py compile-2.7!skip +plugins/modules/k8s_info.py compile-3.5!skip +plugins/modules/k8s_info.py future-import-boilerplate!skip +plugins/modules/k8s_info.py import-2.7!skip +plugins/modules/k8s_info.py import-3.5!skip +plugins/modules/k8s_info.py metaclass-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py compile-2.7!skip +plugins/module_utils/k8sdynamicclient.py compile-3.5!skip +plugins/module_utils/k8sdynamicclient.py future-import-boilerplate!skip +plugins/module_utils/k8sdynamicclient.py import-2.7!skip +plugins/module_utils/k8sdynamicclient.py import-3.5!skip +plugins/module_utils/k8sdynamicclient.py import-3.6!skip +plugins/module_utils/k8sdynamicclient.py import-3.8!skip +plugins/module_utils/k8sdynamicclient.py metaclass-boilerplate!skip +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 +plugins/module_utils/client/resource.py import-3.8!skip +plugins/module_utils/client/discovery.py pylint!skip +plugins/module_utils/common.py pylint!skip +plugins/action/k8s_info.py pylint!skip tests/unit/module_utils/test_discoverer.py metaclass-boilerplate!skip -molecule/default/files/deployment.yaml yamllint!skip \ No newline at end of file +tests/unit/module_utils/test_discoverer.py future-import-boilerplate!skip \ No newline at end of file diff --git a/tests/unit/module_utils/test_helm.py b/tests/unit/module_utils/test_helm.py index 9e498e3e..129cde75 100644 --- a/tests/unit/module_utils/test_helm.py +++ b/tests/unit/module_utils/test_helm.py @@ -41,7 +41,7 @@ def test_write_temp_kubeconfig_server_only(): file_name = write_temp_kubeconfig("ff") try: with open(file_name, "r") as fd: - content = yaml.load(fd) + content = yaml.safe_load(fd) finally: os.remove(file_name) @@ -60,7 +60,7 @@ def test_write_temp_kubeconfig_server_inscure_certs(): file_name = write_temp_kubeconfig("ff", False, "my-certificate") try: with open(file_name, "r") as fd: - content = yaml.load(fd) + content = yaml.safe_load(fd) finally: os.remove(file_name) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..91923e11 --- /dev/null +++ b/tox.ini @@ -0,0 +1,28 @@ +[tox] +minversion = 1.4.2 +skipsdist = True + +[testenv:integration] +install_command = pip install {opts} {packages} + +deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt + https://github.com/ansible/ansible/archive/devel.tar.gz + +passenv = + HOME + +commands= + ansible-test integration --docker -v --color --retry-on-error --diff --coverage --continue-on-error --python {posargs} + +[testenv:linters] +deps = + yamllint + flake8 + +commands = + yamllint -s {toxinidir} + flake8 {toxinidir} + +[flake8] +exclude = .git,.tox,tests/output