Skip to content

Commit 6dd0522

Browse files
committed
Add guest load metrics tests.
The new test validates that guest load metrics are properly reported when the guest-agent is up to date to version 9.6 and above.
1 parent 517faf6 commit 6dd0522

4 files changed

Lines changed: 92 additions & 1 deletion

File tree

tests/global_config.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,12 @@ def _get_default_storage_class(sc_list):
171171
VirtualMachine.RunStrategy.RERUNONFAILURE,
172172
]
173173

174+
guest_load_os_matrix = [
175+
"kubevirt_vmi_guest_load_1m",
176+
"kubevirt_vmi_guest_load_5m",
177+
"kubevirt_vmi_guest_load_15m",
178+
]
179+
174180
aaq_allocation_methods_matrix = [AAQ_VIRTUAL_RESOURCES, AAQ_VMI_POD_USAGE]
175181

176182
sysprep_source_matrix = ["ConfigMap", "Secret"]

tests/observability/metrics/conftest.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import re
23
import shlex
34

45
import bitmath
@@ -10,6 +11,7 @@
1011
from ocp_resources.storage_class import StorageClass
1112
from ocp_resources.virtual_machine import VirtualMachine
1213
from ocp_resources.virtual_machine_instance_migration import VirtualMachineInstanceMigration
14+
from pyhelper_utils.shell import run_ssh_commands
1315
from pytest_testconfig import py_config
1416
from timeout_sampler import TimeoutExpiredError, TimeoutSampler
1517

@@ -37,6 +39,8 @@
3739
from tests.utils import create_vms
3840
from utilities import console
3941
from utilities.constants import (
42+
CENTOS_STREAM10_PREFERENCE,
43+
DATA_SOURCE_NAME,
4044
IPV4_STR,
4145
KUBEVIRT_VMI_MEMORY_PGMAJFAULT_TOTAL,
4246
KUBEVIRT_VMI_MEMORY_PGMINFAULT_TOTAL,
@@ -58,6 +62,7 @@
5862
TWO_CPU_THREADS,
5963
VIRT_TEMPLATE_VALIDATOR,
6064
Images,
65+
StorageClassNames,
6166
)
6267
from utilities.hco import ResourceEditorValidateHCOReconcile, enabled_aaq_in_hco
6368
from utilities.infra import (
@@ -69,6 +74,7 @@
6974
)
7075
from utilities.monitoring import get_metrics_value
7176
from utilities.network import assert_ping_successful, get_ip_from_vm_or_virt_handler_pod, ping
77+
from utilities.os_utils import generate_linux_instance_type_os_matrix
7278
from utilities.ssp import verify_ssp_pod_is_running
7379
from utilities.storage import (
7480
data_volume_template_with_source_ref_dict,
@@ -619,3 +625,63 @@ def aaq_resource_hard_limit_and_used(application_aware_resource_quota):
619625
for key, value in resource_used.items()
620626
}
621627
return formatted_hard_limit, formatted_used_value
628+
629+
630+
@pytest.fixture(scope="class")
631+
def centos_stream_10_vm(
632+
unprivileged_client,
633+
namespace,
634+
golden_images_namespace,
635+
modern_cpu_for_migration,
636+
):
637+
instance_type_centos_os_matrix = generate_linux_instance_type_os_matrix(
638+
os_name="centos.stream", preferences=[CENTOS_STREAM10_PREFERENCE]
639+
)[0]
640+
os_name = next(iter(instance_type_centos_os_matrix))
641+
data_source_name = instance_type_centos_os_matrix[os_name][DATA_SOURCE_NAME]
642+
with VirtualMachineForTests(
643+
client=unprivileged_client,
644+
name=f"{data_source_name}-vm-with-instance-type",
645+
namespace=namespace.name,
646+
vm_instance_type_infer=True,
647+
vm_preference_infer=True,
648+
data_volume_template=data_volume_template_with_source_ref_dict(
649+
data_source=DataSource(
650+
name=data_source_name,
651+
namespace=golden_images_namespace.name,
652+
),
653+
storage_class=StorageClassNames.CEPH_RBD_VIRTUALIZATION,
654+
),
655+
cpu_model=modern_cpu_for_migration,
656+
) as vm:
657+
running_vm(vm=vm)
658+
yield vm
659+
660+
661+
@pytest.fixture(scope="class")
662+
def qemu_guest_agent_version_updated_centos(centos_stream_10_vm):
663+
LOGGER.info(f"Checking qemu-guest-agent package on VM: {centos_stream_10_vm.name}")
664+
output = run_ssh_commands(
665+
host=centos_stream_10_vm.ssh_exec,
666+
commands=shlex.split("rpm -q qemu-guest-agent"),
667+
)
668+
agent_version = output[0].strip() if output else ""
669+
LOGGER.info(f"qemu-guest-agent version: {agent_version}")
670+
671+
# Parse version to ensure it's at least 9.6
672+
version_match = re.search(r"qemu-guest-agent-(\d+)\.(\d+)", agent_version)
673+
if version_match:
674+
version_num = float(f"{version_match.group(1)}.{version_match.group(2)}")
675+
676+
LOGGER.info(f"Parsed qemu-guest-agent version: {version_num}")
677+
if version_num >= 9.6:
678+
return
679+
raise ValueError(f"qemu-guest-agent version {version_num} is less than required 9.6")
680+
681+
682+
@pytest.fixture(scope="class")
683+
def stressed_vm_cpu_centos(centos_stream_10_vm):
684+
run_ssh_commands(
685+
host=centos_stream_10_vm.ssh_exec,
686+
commands=shlex.split("sudo dnf install stress-ng -y; stress-ng --cpu $(nproc) --timeout 60s"),
687+
)

tests/observability/metrics/test_metrics_cpu.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from tests.observability.metrics.utils import (
44
ONE_CPU_CORES,
55
ZERO_CPU_CORES,
6+
validate_metric_value_greater_than_initial_value,
67
wait_for_metric_vmi_request_cpu_cores_output,
78
)
89

@@ -40,3 +41,20 @@ class TestMetricsCpuErrorState:
4041
@pytest.mark.s390x
4142
def test_verify_metrics_error_state_vm(self, prometheus, error_state_vm):
4243
wait_for_metric_vmi_request_cpu_cores_output(prometheus=prometheus, expected_cpu=ZERO_CPU_CORES)
44+
45+
46+
class TestVMIGuestLoad:
47+
@pytest.mark.polarion("CNV-12369")
48+
def test_kubevirt_vmi_guest_load_centos(
49+
self,
50+
prometheus,
51+
centos_stream_10_vm,
52+
qemu_guest_agent_version_updated_centos,
53+
stressed_vm_cpu_centos,
54+
guest_load_os_matrix__function__,
55+
):
56+
validate_metric_value_greater_than_initial_value(
57+
prometheus=prometheus,
58+
metric_name=f"{guest_load_os_matrix__function__}{{name='{centos_stream_10_vm.name}'}}",
59+
initial_value=0,
60+
)

tests/observability/metrics/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,10 +805,11 @@ def validate_metric_value_greater_than_initial_value(
805805
prometheus=prometheus,
806806
metrics_name=metric_name,
807807
)
808+
sample = None
808809
try:
809810
for sample in samples:
810811
if sample:
811-
if int(sample) > initial_value:
812+
if float(sample) > initial_value:
812813
return
813814
except TimeoutExpiredError:
814815
LOGGER.error(f"{sample} should be greater than {initial_value}")

0 commit comments

Comments
 (0)