From e5edf072cc137aed4b5d3018a3a09c51a004a6c0 Mon Sep 17 00:00:00 2001 From: Felix Matouschek Date: Wed, 24 Apr 2024 11:37:03 +0200 Subject: [PATCH] cleanup: Cleanup YAML passed to k8s module Cleanup the YAML passed to the k8s module so it conforms to yaml output you would expect from yaml.dump. Also refactor the tests to get rid of duplicate definitions and make use of pytest.mark.parametrize and yaml.dump. Signed-off-by: Felix Matouschek --- plugins/modules/kubevirt_vm.py | 10 +- .../unit/plugins/modules/test_kubevirt_vm.py | 137 ++++++++---------- 2 files changed, 69 insertions(+), 78 deletions(-) diff --git a/plugins/modules/kubevirt_vm.py b/plugins/modules/kubevirt_vm.py index e419675..da9d221 100644 --- a/plugins/modules/kubevirt_vm.py +++ b/plugins/modules/kubevirt_vm.py @@ -265,12 +265,12 @@ apiVersion: {{ api_version }} kind: VirtualMachine metadata: {% if name %} - name: "{{ name }}" + name: {{ name }} {% endif %} {% if generate_name %} - generateName: "{{ generate_name }}" + generateName: {{ generate_name }} {% endif %} - namespace: "{{ namespace }}" + namespace: {{ namespace }} {% if annotations %} annotations: {{ annotations | to_yaml | indent(4) }} @@ -280,7 +280,7 @@ metadata: {{ labels | to_yaml | indent(4) }} {%- endif %} spec: - running: {{ running }} + running: {{ running | lower }} {% if instancetype %} instancetype: {{ instancetype | to_yaml | indent(4) }} @@ -291,7 +291,7 @@ spec: {%- endif %} {% if data_volume_templates %} dataVolumeTemplates: - {{ data_volume_templates | to_yaml | indent(4) }} + {{ data_volume_templates | to_yaml | indent(2) }} {%- endif %} template: {% if annotations or labels %} diff --git a/tests/unit/plugins/modules/test_kubevirt_vm.py b/tests/unit/plugins/modules/test_kubevirt_vm.py index ee78b69..71983ea 100644 --- a/tests/unit/plugins/modules/test_kubevirt_vm.py +++ b/tests/unit/plugins/modules/test_kubevirt_vm.py @@ -8,6 +8,8 @@ __metaclass__ = type import pytest +from yaml import dump + from ansible.module_utils.basic import AnsibleModule from ansible_collections.kubernetes.core.plugins.module_utils.k8s import runner from ansible_collections.kubevirt.core.plugins.modules import kubevirt_vm @@ -21,7 +23,7 @@ from ansible_collections.kubevirt.core.tests.unit.utils.ansible_module_mock impo @pytest.fixture(scope="module") -def vm_definition(): +def vm_definition_create(): return { "apiVersion": "kubevirt.io/v1", "kind": "VirtualMachine", @@ -64,52 +66,46 @@ def vm_definition(): @pytest.fixture(scope="module") -def vm_manifest(): - return """apiVersion: kubevirt.io/v1 -kind: VirtualMachine -metadata: - name: "testvm" - namespace: "default" - labels: - environment: staging - service: loadbalancer -spec: - running: True - instancetype: - name: u1.medium - preference: - name: fedora - dataVolumeTemplates: - - metadata: - name: testdv - spec: - source: - registry: - url: docker://quay.io/containerdisks/fedora:latest - storage: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - template: - metadata: - labels: - environment: staging - service: loadbalancer - spec: - domain: - devices: {} - terminationGracePeriodSeconds: 180 -""" +def module_params_default(): + return { + "api_version": "kubevirt.io/v1", + "annotations": None, + "labels": None, + "running": True, + "instancetype": None, + "preference": None, + "data_volume_templates": None, + "spec": None, + "wait": False, + "wait_sleep": 5, + "wait_timeout": 5, + "kubeconfig": None, + "context": None, + "host": None, + "api_key": None, + "username": None, + "password": None, + "validate_certs": None, + "ca_cert": None, + "client_cert": None, + "client_key": None, + "proxy": None, + "no_proxy": None, + "proxy_headers": None, + "persist_config": None, + "impersonate_user": None, + "impersonate_groups": None, + "state": "present", + "force": False, + "delete_options": None, + } @pytest.fixture(scope="module") -def module_params_create(): - return { +def module_params_create(module_params_default): + return module_params_default | { "name": "testvm", "namespace": "default", - "state": "present", "labels": {"service": "loadbalancer", "environment": "staging"}, "instancetype": {"name": "u1.medium"}, "preference": {"name": "fedora"}, @@ -137,34 +133,10 @@ def module_params_create(): @pytest.fixture(scope="module") -def k8s_module_params_create(module_params_create, vm_manifest): +def k8s_module_params_create(module_params_create, vm_definition_create): return module_params_create | { - "api_version": "kubevirt.io/v1", - "running": True, - "wait": False, - "wait_sleep": 5, - "wait_timeout": 120, - "force": False, "generate_name": None, - "annotations": None, - "kubeconfig": None, - "context": None, - "host": None, - "api_key": None, - "username": None, - "password": None, - "validate_certs": None, - "ca_cert": None, - "client_cert": None, - "client_key": None, - "proxy": None, - "no_proxy": None, - "proxy_headers": None, - "persist_config": None, - "impersonate_user": None, - "impersonate_groups": None, - "delete_options": None, - "resource_definition": vm_manifest, + "resource_definition": dump(vm_definition_create, sort_keys=False), "wait_condition": {"type": "Ready", "status": True}, } @@ -176,17 +148,34 @@ def test_module_fails_when_required_args_missing(monkeypatch): kubevirt_vm.main() -def test_module_create( - monkeypatch, mocker, module_params_create, k8s_module_params_create, vm_definition +@pytest.mark.parametrize( + "module_params,k8s_module_params,vm_definition,method", + [ + ( + "module_params_create", + "k8s_module_params_create", + "vm_definition_create", + "create", + ), + ], +) +def test_module( + request, + monkeypatch, + mocker, + module_params, + k8s_module_params, + vm_definition, + method, ): monkeypatch.setattr(AnsibleModule, "exit_json", exit_json) monkeypatch.setattr(runner, "get_api_client", lambda _: None) - set_module_args(module_params_create) + set_module_args(request.getfixturevalue(module_params)) perform_action = mocker.patch.object(runner, "perform_action") perform_action.return_value = { - "method": "create", + "method": method, "changed": True, "result": "success", } @@ -194,5 +183,7 @@ def test_module_create( with pytest.raises(AnsibleExitJson): kubevirt_vm.main() perform_action.assert_called_once_with( - mocker.ANY, vm_definition, k8s_module_params_create + mocker.ANY, + request.getfixturevalue(vm_definition), + request.getfixturevalue(k8s_module_params), )