From 501bd3d52f7d59c911a925fec164dca30f2bab64 Mon Sep 17 00:00:00 2001 From: Felix Matouschek Date: Thu, 11 Jul 2024 16:29:11 +0200 Subject: [PATCH] cleanup(kubevirt_vm): Simplify tests Simplify kubevirt_vm tests by not using fixtures if not needed. Signed-off-by: Felix Matouschek --- .../unit/plugins/modules/test_kubevirt_vm.py | 905 ++++++++---------- 1 file changed, 404 insertions(+), 501 deletions(-) diff --git a/tests/unit/plugins/modules/test_kubevirt_vm.py b/tests/unit/plugins/modules/test_kubevirt_vm.py index a9ffe07..436904b 100644 --- a/tests/unit/plugins/modules/test_kubevirt_vm.py +++ b/tests/unit/plugins/modules/test_kubevirt_vm.py @@ -20,134 +20,26 @@ from ansible_collections.kubevirt.core.tests.unit.utils.ansible_module_mock impo ) -@pytest.fixture(scope="module") -def vm_definition_create(): - 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 test_module_fails_when_required_args_missing(mocker): + mocker.patch.object(AnsibleModule, "fail_json", fail_json) + with pytest.raises(AnsibleFailJson): + set_module_args({}) + kubevirt_vm.main() -@pytest.fixture(scope="module") -def vm_definition_running(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "name": "testvm", - "namespace": "default", - }, - "spec": { - "running": True, - "template": { - "spec": { - "domain": {"devices": {}}, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def vm_definition_stopped(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "name": "testvm", - "namespace": "default", - }, - "spec": { - "running": False, - "template": { - "spec": { - "domain": {"devices": {}}, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -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(module_params_default): - return module_params_default | { +VM_DEFINITION_CREATE = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { "name": "testvm", "namespace": "default", - "labels": {"service": "loadbalancer", "environment": "staging"}, + "labels": {"environment": "staging", "service": "loadbalancer"}, + }, + "spec": { + "running": True, "instancetype": {"name": "u1.medium"}, "preference": {"name": "fedora"}, - "data_volume_templates": [ + "dataVolumeTemplates": [ { "metadata": {"name": "testdv"}, "spec": { @@ -163,121 +55,187 @@ def module_params_create(module_params_default): }, } ], - "spec": { - "domain": {"devices": {}}, - "terminationGracePeriodSeconds": 180, + "template": { + "metadata": { + "labels": {"environment": "staging", "service": "loadbalancer"} + }, + "spec": { + "domain": {"devices": {}}, + "terminationGracePeriodSeconds": 180, + }, }, - } + }, +} - -@pytest.fixture(scope="module") -def module_params_running(module_params_default): - return module_params_default | { +VM_DEFINITION_RUNNING = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { "name": "testvm", "namespace": "default", + }, + "spec": { "running": True, - } + "template": { + "spec": { + "domain": {"devices": {}}, + }, + }, + }, +} - -@pytest.fixture(scope="module") -def module_params_stopped(module_params_default): - return module_params_default | { +VM_DEFINITION_STOPPED = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { "name": "testvm", "namespace": "default", + }, + "spec": { "running": False, - } + "template": { + "spec": { + "domain": {"devices": {}}, + }, + }, + }, +} +MODULE_PARAMS_DEFAULT = { + "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_delete(module_params_default): - return module_params_default | { - "name": "testvm", - "namespace": "default", - "state": "absent", - "wait": True, - } +MODULE_PARAMS_CREATE = MODULE_PARAMS_DEFAULT | { + "name": "testvm", + "namespace": "default", + "labels": {"service": "loadbalancer", "environment": "staging"}, + "instancetype": {"name": "u1.medium"}, + "preference": {"name": "fedora"}, + "data_volume_templates": [ + { + "metadata": {"name": "testdv"}, + "spec": { + "source": { + "registry": { + "url": "docker://quay.io/containerdisks/fedora:latest" + }, + }, + "storage": { + "accessModes": ["ReadWriteOnce"], + "resources": {"requests": {"storage": "5Gi"}}, + }, + }, + } + ], + "spec": { + "domain": {"devices": {}}, + "terminationGracePeriodSeconds": 180, + }, +} +MODULE_PARAMS_RUNNING = MODULE_PARAMS_DEFAULT | { + "name": "testvm", + "namespace": "default", + "running": True, +} -@pytest.fixture(scope="module") -def k8s_module_params_create(module_params_create, vm_definition_create): - return module_params_create | { - "generate_name": None, - "resource_definition": vm_definition_create, - "wait_condition": {"type": "Ready", "status": True}, - } +MODULE_PARAMS_STOPPED = MODULE_PARAMS_DEFAULT | { + "name": "testvm", + "namespace": "default", + "running": False, +} +MODULE_PARAMS_DELETE = MODULE_PARAMS_DEFAULT | { + "name": "testvm", + "namespace": "default", + "state": "absent", + "wait": True, +} -@pytest.fixture(scope="module") -def k8s_module_params_running(module_params_running, vm_definition_running): - return module_params_running | { - "generate_name": None, - "resource_definition": vm_definition_running, - "wait_condition": {"type": "Ready", "status": True}, - } +K8S_MODULE_PARAMS_CREATE = MODULE_PARAMS_CREATE | { + "generate_name": None, + "resource_definition": VM_DEFINITION_CREATE, + "wait_condition": {"type": "Ready", "status": True}, +} +K8S_MODULE_PARAMS_RUNNING = MODULE_PARAMS_RUNNING | { + "generate_name": None, + "resource_definition": VM_DEFINITION_RUNNING, + "wait_condition": {"type": "Ready", "status": True}, +} -@pytest.fixture(scope="module") -def k8s_module_params_stopped(module_params_stopped, vm_definition_stopped): - return module_params_stopped | { - "generate_name": None, - "resource_definition": vm_definition_stopped, - "wait_condition": {"type": "Ready", "status": False, "reason": "VMINotExists"}, - } +K8S_MODULE_PARAMS_STOPPED = MODULE_PARAMS_STOPPED | { + "generate_name": None, + "resource_definition": VM_DEFINITION_STOPPED, + "wait_condition": {"type": "Ready", "status": False, "reason": "VMINotExists"}, +} - -@pytest.fixture(scope="module") -def k8s_module_params_delete(module_params_delete, vm_definition_running): - return module_params_delete | { - "generate_name": None, - "resource_definition": vm_definition_running, - "wait_condition": {"type": "Ready", "status": True}, - } - - -def test_module_fails_when_required_args_missing(mocker): - mocker.patch.object(AnsibleModule, "fail_json", fail_json) - with pytest.raises(AnsibleFailJson): - set_module_args({}) - kubevirt_vm.main() +K8S_MODULE_PARAMS_DELETE = MODULE_PARAMS_DELETE | { + "generate_name": None, + "resource_definition": VM_DEFINITION_RUNNING, + "wait_condition": {"type": "Ready", "status": True}, +} @pytest.mark.parametrize( "module_params,k8s_module_params,vm_definition,method", [ ( - "module_params_create", - "k8s_module_params_create", - "vm_definition_create", + MODULE_PARAMS_CREATE, + K8S_MODULE_PARAMS_CREATE, + VM_DEFINITION_CREATE, "create", ), ( - "module_params_running", - "k8s_module_params_running", - "vm_definition_running", + MODULE_PARAMS_RUNNING, + K8S_MODULE_PARAMS_RUNNING, + VM_DEFINITION_RUNNING, "update", ), ( - "module_params_stopped", - "k8s_module_params_stopped", - "vm_definition_stopped", + MODULE_PARAMS_STOPPED, + K8S_MODULE_PARAMS_STOPPED, + VM_DEFINITION_STOPPED, "update", ), ( - "module_params_delete", - "k8s_module_params_delete", - "vm_definition_running", + MODULE_PARAMS_DELETE, + K8S_MODULE_PARAMS_DELETE, + VM_DEFINITION_RUNNING, "delete", ), ], ) -def test_module( - request, - mocker, - module_params, - k8s_module_params, - vm_definition, - method, -): +def test_module(mocker, module_params, k8s_module_params, vm_definition, method): mocker.patch.object(AnsibleModule, "exit_json", exit_json) mocker.patch.object(runner, "get_api_client") @@ -292,57 +250,192 @@ def test_module( ) with pytest.raises(AnsibleExitJson): - set_module_args(request.getfixturevalue(module_params)) + set_module_args(module_params) kubevirt_vm.main() perform_action.assert_called_once_with( mocker.ANY, - request.getfixturevalue(vm_definition), - request.getfixturevalue(k8s_module_params), + vm_definition, + k8s_module_params, ) -@pytest.fixture(scope="module") -def create_vm_params(): - return { - "api_version": "kubevirt.io/v1", - "running": True, +CREATE_VM_PARAMS = { + "api_version": "kubevirt.io/v1", + "running": True, + "namespace": "default", +} + +CREATE_VM_PARAMS_ANNOTATIONS = CREATE_VM_PARAMS | { + "annotations": {"test": "test"}, +} + +CREATE_VM_PARAMS_LABELS = CREATE_VM_PARAMS | { + "labels": {"test": "test"}, +} + +CREATE_VM_PARAMS_INSTANCETYPE = CREATE_VM_PARAMS | { + "instancetype": {"name": "u1.medium"}, +} + +CREATE_VM_PARAMS_PREFERENCE = CREATE_VM_PARAMS | { + "preference": {"name": "fedora"}, +} + +CREATE_VM_PARAMS_DATAVOLUMETEMPLATE = CREATE_VM_PARAMS | { + "data_volume_templates": [ + { + "metadata": {"name": "testdv"}, + "spec": { + "source": { + "registry": { + "url": "docker://quay.io/containerdisks/fedora:latest" + }, + }, + "storage": { + "accessModes": ["ReadWriteOnce"], + "resources": {"requests": {"storage": "5Gi"}}, + }, + }, + }, + ], +} + +CREATE_VM_PARAMS_NAME = CREATE_VM_PARAMS | { + "name": "testvm", +} + +CREATE_VM_PARAMS_GENERATE_NAME = CREATE_VM_PARAMS | { + "generate_name": "testvm-1234", +} + +CREATE_VM_PARAMS_SPECS = CREATE_VM_PARAMS | { + "spec": { + "domain": { + "devices": { + "cpu": { + "cores": 2, + "socket": 1, + "threads": 2, + } + } + } + } +} + +CREATED_VM = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { "namespace": "default", - } + }, + "spec": { + "running": True, + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} +CREATED_VM_LABELS = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + "labels": { + "test": "test", + }, + }, + "spec": { + "running": True, + "template": { + "metadata": { + "labels": {"test": "test"}, + }, + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} -@pytest.fixture(scope="module") -def create_vm_params_annotations(create_vm_params): - return create_vm_params | { - "annotations": {"test": "test"}, - } +CREATED_VM_ANNOTATIONS = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + "annotations": { + "test": "test", + }, + }, + "spec": { + "running": True, + "template": { + "metadata": { + "annotations": {"test": "test"}, + }, + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} - -@pytest.fixture(scope="module") -def create_vm_params_labels(create_vm_params): - return create_vm_params | { - "labels": {"test": "test"}, - } - - -@pytest.fixture(scope="module") -def create_vm_params_instancetype(create_vm_params): - return create_vm_params | { +CREATED_VM_INSTANCETYPE = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + }, + "spec": { + "running": True, "instancetype": {"name": "u1.medium"}, - } + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} - -@pytest.fixture(scope="module") -def create_vm_params_preference(create_vm_params): - return create_vm_params | { +CREATED_VM_PREFERENCE = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + }, + "spec": { + "running": True, "preference": {"name": "fedora"}, - } + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} - -@pytest.fixture(scope="module") -def create_vm_params_datavolumetemplate(create_vm_params): - return create_vm_params | { - "data_volume_templates": [ +CREATED_VM_DATAVOLUMETEMPLATE = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + }, + "spec": { + "running": True, + "dataVolumeTemplates": [ { "metadata": {"name": "testdv"}, "spec": { @@ -358,282 +451,92 @@ def create_vm_params_datavolumetemplate(create_vm_params): }, }, ], - } + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} - -@pytest.fixture(scope="module") -def create_vm_params_name(create_vm_params): - return create_vm_params | { +CREATED_VM_NAME = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { "name": "testvm", - } - - -@pytest.fixture(scope="module") -def create_vm_params_generate_name(create_vm_params): - return create_vm_params | { - "generate_name": "testvm-1234", - } - - -@pytest.fixture(scope="module") -def create_vm_params_specs(create_vm_params): - return create_vm_params | { - "spec": { - "domain": { - "devices": { - "cpu": { - "cores": 2, - "socket": 1, - "threads": 2, - } - } - } - } - } - - -@pytest.fixture(scope="module") -def created_vm(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", + "namespace": "default", + }, + "spec": { + "running": True, + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, }, - "spec": { - "running": True, - "template": { - "spec": { - "domain": { - "devices": {}, + }, +} + +CREATED_VM_GENERATE_NAME = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "generateName": "testvm-1234", + "namespace": "default", + }, + "spec": { + "running": True, + "template": { + "spec": { + "domain": { + "devices": {}, + }, + }, + }, + }, +} + +CREATED_VM_SPECS = { + "apiVersion": "kubevirt.io/v1", + "kind": "VirtualMachine", + "metadata": { + "namespace": "default", + }, + "spec": { + "running": True, + "template": { + "spec": { + "domain": { + "devices": { + "cpu": { + "cores": 2, + "socket": 1, + "threads": 2, + } }, }, }, }, - } - - -@pytest.fixture(scope="module") -def created_vm_labels(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - "labels": { - "test": "test", - }, - }, - "spec": { - "running": True, - "template": { - "metadata": { - "labels": {"test": "test"}, - }, - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_annotations(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - "annotations": { - "test": "test", - }, - }, - "spec": { - "running": True, - "template": { - "metadata": { - "annotations": {"test": "test"}, - }, - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_instancetype(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - }, - "spec": { - "running": True, - "instancetype": {"name": "u1.medium"}, - "template": { - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_preference(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - }, - "spec": { - "running": True, - "preference": {"name": "fedora"}, - "template": { - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_datavolumetemplate(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - }, - "spec": { - "running": True, - "dataVolumeTemplates": [ - { - "metadata": {"name": "testdv"}, - "spec": { - "source": { - "registry": { - "url": "docker://quay.io/containerdisks/fedora:latest" - }, - }, - "storage": { - "accessModes": ["ReadWriteOnce"], - "resources": {"requests": {"storage": "5Gi"}}, - }, - }, - }, - ], - "template": { - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_name(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "name": "testvm", - "namespace": "default", - }, - "spec": { - "running": True, - "template": { - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_generate_name(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "generateName": "testvm-1234", - "namespace": "default", - }, - "spec": { - "running": True, - "template": { - "spec": { - "domain": { - "devices": {}, - }, - }, - }, - }, - } - - -@pytest.fixture(scope="module") -def created_vm_specs(): - return { - "apiVersion": "kubevirt.io/v1", - "kind": "VirtualMachine", - "metadata": { - "namespace": "default", - }, - "spec": { - "running": True, - "template": { - "spec": { - "domain": { - "devices": { - "cpu": { - "cores": 2, - "socket": 1, - "threads": 2, - } - }, - }, - }, - }, - }, - } + }, +} @pytest.mark.parametrize( "params,expected", [ - ("create_vm_params", "created_vm"), - ("create_vm_params_annotations", "created_vm_annotations"), - ("create_vm_params_labels", "created_vm_labels"), - ("create_vm_params_instancetype", "created_vm_instancetype"), - ("create_vm_params_preference", "created_vm_preference"), - ("create_vm_params_datavolumetemplate", "created_vm_datavolumetemplate"), - ("create_vm_params_name", "created_vm_name"), - ("create_vm_params_generate_name", "created_vm_generate_name"), - ("create_vm_params_specs", "created_vm_specs"), + (CREATE_VM_PARAMS, CREATED_VM), + (CREATE_VM_PARAMS_ANNOTATIONS, CREATED_VM_ANNOTATIONS), + (CREATE_VM_PARAMS_LABELS, CREATED_VM_LABELS), + (CREATE_VM_PARAMS_INSTANCETYPE, CREATED_VM_INSTANCETYPE), + (CREATE_VM_PARAMS_PREFERENCE, CREATED_VM_PREFERENCE), + (CREATE_VM_PARAMS_DATAVOLUMETEMPLATE, CREATED_VM_DATAVOLUMETEMPLATE), + (CREATE_VM_PARAMS_NAME, CREATED_VM_NAME), + (CREATE_VM_PARAMS_GENERATE_NAME, CREATED_VM_GENERATE_NAME), + (CREATE_VM_PARAMS_SPECS, CREATED_VM_SPECS), ], ) -def test_create_vm(request, params, expected): - assert kubevirt_vm.create_vm( - request.getfixturevalue(params) - ) == request.getfixturevalue(expected) +def test_create_vm(params, expected): + assert kubevirt_vm.create_vm(params) == expected