feat(kubevirt_vm): Add support for RunStrategy

This change adds support for setting the RunStrategy of a VM.

Depending on the value set the wait condition for the VM is adjusted.
For the values Always, RerunOnFailure or Once the wait condition will
wait for the VM to run and be ready. For the value Halted the wait
condition will wait for the VM to not exist. For the value Manual
the wait condition is not set.

Signed-off-by: Felix Matouschek <fmatouschek@redhat.com>
This commit is contained in:
Felix Matouschek
2024-07-15 10:35:34 +02:00
parent 6bc7607826
commit c1f651d972
3 changed files with 200 additions and 13 deletions

View File

@@ -101,11 +101,27 @@ VM_DEFINITION_STOPPED = {
},
}
VM_DEFINITION_HALTED = {
"apiVersion": "kubevirt.io/v1",
"kind": "VirtualMachine",
"metadata": {
"name": "testvm",
"namespace": "default",
},
"spec": {
"runStrategy": "Halted",
"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,
@@ -174,6 +190,12 @@ MODULE_PARAMS_STOPPED = MODULE_PARAMS_DEFAULT | {
"running": False,
}
MODULE_PARAMS_HALTED = MODULE_PARAMS_DEFAULT | {
"name": "testvm",
"namespace": "default",
"run_strategy": "Halted",
}
MODULE_PARAMS_DELETE = MODULE_PARAMS_DEFAULT | {
"name": "testvm",
"namespace": "default",
@@ -183,24 +205,37 @@ MODULE_PARAMS_DELETE = MODULE_PARAMS_DEFAULT | {
K8S_MODULE_PARAMS_CREATE = MODULE_PARAMS_CREATE | {
"generate_name": None,
"running": None,
"run_strategy": None,
"resource_definition": VM_DEFINITION_CREATE,
"wait_condition": {"type": "Ready", "status": True},
}
K8S_MODULE_PARAMS_RUNNING = MODULE_PARAMS_RUNNING | {
"generate_name": None,
"run_strategy": None,
"resource_definition": VM_DEFINITION_RUNNING,
"wait_condition": {"type": "Ready", "status": True},
}
K8S_MODULE_PARAMS_STOPPED = MODULE_PARAMS_STOPPED | {
"generate_name": None,
"run_strategy": None,
"resource_definition": VM_DEFINITION_STOPPED,
"wait_condition": {"type": "Ready", "status": False, "reason": "VMINotExists"},
}
K8S_MODULE_PARAMS_HALTED = MODULE_PARAMS_HALTED | {
"generate_name": None,
"running": None,
"resource_definition": VM_DEFINITION_HALTED,
"wait_condition": {"type": "Ready", "status": False, "reason": "VMINotExists"},
}
K8S_MODULE_PARAMS_DELETE = MODULE_PARAMS_DELETE | {
"generate_name": None,
"running": None,
"run_strategy": None,
"resource_definition": VM_DEFINITION_RUNNING,
"wait_condition": {"type": "Ready", "status": True},
}
@@ -227,6 +262,12 @@ K8S_MODULE_PARAMS_DELETE = MODULE_PARAMS_DELETE | {
VM_DEFINITION_STOPPED,
"update",
),
(
MODULE_PARAMS_HALTED,
K8S_MODULE_PARAMS_HALTED,
VM_DEFINITION_HALTED,
"update",
),
(
MODULE_PARAMS_DELETE,
K8S_MODULE_PARAMS_DELETE,
@@ -262,10 +303,15 @@ def test_module(mocker, module_params, k8s_module_params, vm_definition, method)
CREATE_VM_PARAMS = {
"api_version": "kubevirt.io/v1",
"running": True,
"namespace": "default",
}
CREATE_VM_PARAMS_RUN_STRATEGY = {
"api_version": "kubevirt.io/v1",
"namespace": "default",
"run_strategy": "Manual",
}
CREATE_VM_PARAMS_ANNOTATIONS = CREATE_VM_PARAMS | {
"annotations": {"test": "test"},
}
@@ -341,6 +387,24 @@ CREATED_VM = {
},
}
CREATED_VM_RUN_STRATEGY = {
"apiVersion": "kubevirt.io/v1",
"kind": "VirtualMachine",
"metadata": {
"namespace": "default",
},
"spec": {
"runStrategy": "Manual",
"template": {
"spec": {
"domain": {
"devices": {},
},
},
},
},
}
CREATED_VM_LABELS = {
"apiVersion": "kubevirt.io/v1",
"kind": "VirtualMachine",
@@ -528,6 +592,7 @@ CREATED_VM_SPECS = {
"params,expected",
[
(CREATE_VM_PARAMS, CREATED_VM),
(CREATE_VM_PARAMS_RUN_STRATEGY, CREATED_VM_RUN_STRATEGY),
(CREATE_VM_PARAMS_ANNOTATIONS, CREATED_VM_ANNOTATIONS),
(CREATE_VM_PARAMS_LABELS, CREATED_VM_LABELS),
(CREATE_VM_PARAMS_INSTANCETYPE, CREATED_VM_INSTANCETYPE),
@@ -540,3 +605,46 @@ CREATED_VM_SPECS = {
)
def test_create_vm(params, expected):
assert kubevirt_vm.create_vm(params) == expected
@pytest.mark.parametrize(
"params,expected",
[
({"running": None, "run_strategy": "Manual"}, {}),
(
{"running": None, "run_strategy": None},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_READY},
),
(
{"running": True, "run_strategy": None},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_READY},
),
(
{"running": None, "run_strategy": "Always"},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_READY},
),
(
{"running": None, "run_strategy": "RerunOnFailure"},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_READY},
),
(
{"running": None, "run_strategy": "Once"},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_READY},
),
(
{"running": False, "run_strategy": None},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_VMI_NOT_EXISTS},
),
(
{"running": None, "run_strategy": "Halted"},
{"wait_condition": kubevirt_vm.WAIT_CONDITION_VMI_NOT_EXISTS},
),
],
)
def test_set_wait_condition(mocker, params, expected):
module = mocker.Mock()
module.params = params
kubevirt_vm.set_wait_condition(module)
assert module.params == params | expected