From 829ace23a5f16ebd96511eaad9a5de0461e0cba5 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 11:21:39 -0700 Subject: [PATCH 1/8] [UNSTABLE] Moved files --- pkg/{virt-launcher => virt-launcher-libvirt-qemu}/BUILD.bazel | 0 pkg/{virt-launcher => virt-launcher-libvirt-qemu}/OWNERS | 0 .../metadata/BUILD.bazel | 0 .../metadata/cache.go | 0 .../metadata/kubevirt.go | 0 .../metadata/metadata_suite_test.go | 0 .../metadata/metadata_test.go | 0 .../metadata/safedata.go | 0 pkg/{virt-launcher => virt-launcher-libvirt-qemu}/monitor.go | 0 pkg/{virt-launcher => virt-launcher-libvirt-qemu}/monitor_test.go | 0 .../virt_launcher_suite_test.go | 0 .../virtwrap/BUILD.bazel | 0 .../virtwrap/access-credentials/BUILD.bazel | 0 .../virtwrap/access-credentials/access_credentials.go | 0 .../virtwrap/access-credentials/access_credentials_suite_test.go | 0 .../virtwrap/access-credentials/access_credentials_test.go | 0 .../virtwrap/agent-poller/BUILD.bazel | 0 .../virtwrap/agent-poller/agent_parser.go | 0 .../virtwrap/agent-poller/agent_parser_test.go | 0 .../virtwrap/agent-poller/agent_poller.go | 0 .../virtwrap/agent-poller/agent_poller_suite_test.go | 0 .../virtwrap/agent-poller/agent_poller_test.go | 0 .../virtwrap/agent/BUILD.bazel | 0 .../virtwrap/agent/exec.go | 0 .../virtwrap/agent/types.go | 0 .../virtwrap/cli/BUILD.bazel | 0 .../virtwrap/cli/cli_suite_test.go | 0 .../virtwrap/cli/event.go | 0 .../virtwrap/cli/generated_mock_libvirt.go | 0 .../virtwrap/cli/libvirt.go | 0 .../virtwrap/cli/libvirt_test.go | 0 .../virtwrap/converter/BUILD.bazel | 0 .../virtwrap/converter/arch/BUILD.bazel | 0 .../virtwrap/converter/arch/amd64.go | 0 .../virtwrap/converter/arch/arm64.go | 0 .../virtwrap/converter/arch/converter.go | 0 .../virtwrap/converter/arch/converter_suite_test.go | 0 .../virtwrap/converter/arch/converter_test.go | 0 .../virtwrap/converter/arch/ppc64le.go | 0 .../virtwrap/converter/arch/s390x.go | 0 .../virtwrap/converter/converter.go | 0 .../virtwrap/converter/converter_suite_test.go | 0 .../virtwrap/converter/converter_test.go | 0 .../virtwrap/converter/downwardmetrics.go | 0 .../virtwrap/converter/generated_mock_converter.go | 0 .../virtwrap/converter/network.go | 0 .../virtwrap/converter/pci-placement.go | 0 .../virtwrap/converter/testdata/domain_arm64.xml.tmpl | 0 .../virtwrap/converter/testdata/domain_ppc64le.xml.tmpl | 0 .../virtwrap/converter/testdata/domain_s390x.xml.tmpl | 0 .../virtwrap/converter/testdata/domain_x86_64.xml.tmpl | 0 .../virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl | 0 .../virtwrap/converter/vcpu/BUILD.bazel | 0 .../virtwrap/converter/vcpu/numa_placement_test.go | 0 .../virtwrap/converter/vcpu/vcpu.go | 0 .../virtwrap/converter/vcpu/vcpu_suite_test.go | 0 .../virtwrap/converter/vcpu/vcpu_test.go | 0 .../virtwrap/converter/virtiofs.go | 0 .../virtwrap/device/BUILD.bazel | 0 .../virtwrap/device/device_suite_test.go | 0 .../virtwrap/device/hostdevice/BUILD.bazel | 0 .../virtwrap/device/hostdevice/addresspool.go | 0 .../virtwrap/device/hostdevice/addresspool_test.go | 0 .../virtwrap/device/hostdevice/generic/BUILD.bazel | 0 .../virtwrap/device/hostdevice/generic/addresspool.go | 0 .../virtwrap/device/hostdevice/generic/addresspool_test.go | 0 .../virtwrap/device/hostdevice/generic/generic_suite_test.go | 0 .../virtwrap/device/hostdevice/generic/hostdev.go | 0 .../virtwrap/device/hostdevice/generic/hostdev_test.go | 0 .../virtwrap/device/hostdevice/gpu/BUILD.bazel | 0 .../virtwrap/device/hostdevice/gpu/addresspool.go | 0 .../virtwrap/device/hostdevice/gpu/addresspool_test.go | 0 .../virtwrap/device/hostdevice/gpu/gpu_suite_test.go | 0 .../virtwrap/device/hostdevice/gpu/hostdev.go | 0 .../virtwrap/device/hostdevice/gpu/hostdev_test.go | 0 .../virtwrap/device/hostdevice/hostdev.go | 0 .../virtwrap/device/hostdevice/hostdev_test.go | 0 .../virtwrap/device/hostdevice/hostdevice_suite_test.go | 0 .../virtwrap/device/hostdevice/hotplug.go | 0 .../virtwrap/device/hostdevice/hotplug_test.go | 0 .../virtwrap/device/hostdevice/sriov/BUILD.bazel | 0 .../virtwrap/device/hostdevice/sriov/OWNERS | 0 .../virtwrap/device/hostdevice/sriov/hostdev.go | 0 .../virtwrap/device/hostdevice/sriov/hostdev_test.go | 0 .../virtwrap/device/hostdevice/sriov/pcipool.go | 0 .../virtwrap/device/hostdevice/sriov/pcipool_netstatus.go | 0 .../virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go | 0 .../virtwrap/device/hostdevice/sriov/pcipool_test.go | 0 .../virtwrap/device/hostdevice/sriov/sriov_suite_test.go | 0 .../virtwrap/device/pciaddress.go | 0 .../virtwrap/device/pciaddress_test.go | 0 .../virtwrap/device/usbaddress.go | 0 .../virtwrap/efi/BUILD.bazel | 0 .../virtwrap/efi/efi.go | 0 .../virtwrap/efi/efi_suite_test.go | 0 .../virtwrap/efi/efi_test.go | 0 .../virtwrap/errors/BUILD.bazel | 0 .../virtwrap/errors/errors.go | 0 .../virtwrap/launchsecurity/BUILD.bazel | 0 .../virtwrap/launchsecurity/launchsecurity_suite_test.go | 0 .../virtwrap/launchsecurity/sev.go | 0 .../virtwrap/launchsecurity/sev_test.go | 0 .../virtwrap/libvirtxml/BUILD.bazel | 0 .../virtwrap/libvirtxml/convert.go | 0 .../virtwrap/libvirtxml/libvirtxml_suite_test.go | 0 .../virtwrap/libvirtxml/libvirtxml_test.go | 0 .../virtwrap/live-migration-source.go | 0 .../virtwrap/live-migration-source_test.go | 0 .../virtwrap/live-migration-target.go | 0 .../virtwrap/manager_test.go | 0 .../virtwrap/nichotplug.go | 0 .../virtwrap/nichotplug_test.go | 0 .../virtwrap/statsconv/BUILD.bazel | 0 .../virtwrap/statsconv/converter.go | 0 .../virtwrap/statsconv/converter_test.go | 0 .../virtwrap/statsconv/generated_mock_converter.go | 0 .../virtwrap/statsconv/stats_suite_test.go | 0 .../virtwrap/statsconv/util/BUILD.bazel | 0 .../virtwrap/statsconv/util/domstats_utils.go | 0 .../virtwrap/testdata/migration_domain.xml | 0 .../virtwrap/testing/BUILD.bazel | 0 .../virtwrap/testing/libvirt.go | 0 .../virtwrap/util/BUILD.bazel | 0 .../virtwrap/util/cpu_utils.go | 0 .../virtwrap/util/libvirt_helper.go | 0 .../virtwrap/util/libvirt_helper_test.go | 0 .../virtwrap/util/util_suite_test.go | 0 .../virtwrap/virtwrap_suite_test.go | 0 128 files changed, 0 insertions(+), 0 deletions(-) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/OWNERS (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/cache.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/kubevirt.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/metadata_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/metadata_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/metadata/safedata.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/monitor.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/monitor_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virt_launcher_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/access-credentials/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/access-credentials/access_credentials.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/access-credentials/access_credentials_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/access-credentials/access_credentials_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/agent_parser.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/agent_parser_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/agent_poller.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/agent_poller_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent-poller/agent_poller_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent/exec.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/agent/types.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/cli_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/event.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/generated_mock_libvirt.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/libvirt.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/cli/libvirt_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/amd64.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/arm64.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/converter.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/converter_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/converter_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/ppc64le.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/arch/s390x.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/converter.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/converter_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/converter_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/downwardmetrics.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/generated_mock_converter.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/network.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/pci-placement.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/testdata/domain_arm64.xml.tmpl (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/testdata/domain_ppc64le.xml.tmpl (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/testdata/domain_s390x.xml.tmpl (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/testdata/domain_x86_64.xml.tmpl (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/vcpu/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/vcpu/numa_placement_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/vcpu/vcpu.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/vcpu/vcpu_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/vcpu/vcpu_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/converter/virtiofs.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/device_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/addresspool.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/addresspool_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/addresspool.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/addresspool_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/generic_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/hostdev.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/generic/hostdev_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/addresspool.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/addresspool_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/gpu_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/hostdev.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/gpu/hostdev_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/hostdev.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/hostdev_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/hostdevice_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/hotplug.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/hotplug_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/OWNERS (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/hostdev.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/hostdev_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/pcipool.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/pcipool_netstatus.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/pcipool_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/hostdevice/sriov/sriov_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/pciaddress.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/pciaddress_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/device/usbaddress.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/efi/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/efi/efi.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/efi/efi_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/efi/efi_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/errors/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/errors/errors.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/launchsecurity/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/launchsecurity/launchsecurity_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/launchsecurity/sev.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/launchsecurity/sev_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/libvirtxml/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/libvirtxml/convert.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/libvirtxml/libvirtxml_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/libvirtxml/libvirtxml_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/live-migration-source.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/live-migration-source_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/live-migration-target.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/manager_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/nichotplug.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/nichotplug_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/converter.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/converter_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/generated_mock_converter.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/stats_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/util/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/statsconv/util/domstats_utils.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/testdata/migration_domain.xml (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/testing/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/testing/libvirt.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/util/BUILD.bazel (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/util/cpu_utils.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/util/libvirt_helper.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/util/libvirt_helper_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/util/util_suite_test.go (100%) rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/virtwrap/virtwrap_suite_test.go (100%) diff --git a/pkg/virt-launcher/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/BUILD.bazel diff --git a/pkg/virt-launcher/OWNERS b/pkg/virt-launcher-libvirt-qemu/OWNERS similarity index 100% rename from pkg/virt-launcher/OWNERS rename to pkg/virt-launcher-libvirt-qemu/OWNERS diff --git a/pkg/virt-launcher/metadata/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/metadata/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/metadata/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/metadata/BUILD.bazel diff --git a/pkg/virt-launcher/metadata/cache.go b/pkg/virt-launcher-libvirt-qemu/metadata/cache.go similarity index 100% rename from pkg/virt-launcher/metadata/cache.go rename to pkg/virt-launcher-libvirt-qemu/metadata/cache.go diff --git a/pkg/virt-launcher/metadata/kubevirt.go b/pkg/virt-launcher-libvirt-qemu/metadata/kubevirt.go similarity index 100% rename from pkg/virt-launcher/metadata/kubevirt.go rename to pkg/virt-launcher-libvirt-qemu/metadata/kubevirt.go diff --git a/pkg/virt-launcher/metadata/metadata_suite_test.go b/pkg/virt-launcher-libvirt-qemu/metadata/metadata_suite_test.go similarity index 100% rename from pkg/virt-launcher/metadata/metadata_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/metadata/metadata_suite_test.go diff --git a/pkg/virt-launcher/metadata/metadata_test.go b/pkg/virt-launcher-libvirt-qemu/metadata/metadata_test.go similarity index 100% rename from pkg/virt-launcher/metadata/metadata_test.go rename to pkg/virt-launcher-libvirt-qemu/metadata/metadata_test.go diff --git a/pkg/virt-launcher/metadata/safedata.go b/pkg/virt-launcher-libvirt-qemu/metadata/safedata.go similarity index 100% rename from pkg/virt-launcher/metadata/safedata.go rename to pkg/virt-launcher-libvirt-qemu/metadata/safedata.go diff --git a/pkg/virt-launcher/monitor.go b/pkg/virt-launcher-libvirt-qemu/monitor.go similarity index 100% rename from pkg/virt-launcher/monitor.go rename to pkg/virt-launcher-libvirt-qemu/monitor.go diff --git a/pkg/virt-launcher/monitor_test.go b/pkg/virt-launcher-libvirt-qemu/monitor_test.go similarity index 100% rename from pkg/virt-launcher/monitor_test.go rename to pkg/virt-launcher-libvirt-qemu/monitor_test.go diff --git a/pkg/virt-launcher/virt_launcher_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virt_launcher_suite_test.go similarity index 100% rename from pkg/virt-launcher/virt_launcher_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virt_launcher_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/access-credentials/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/access-credentials/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/access-credentials/access_credentials.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go similarity index 100% rename from pkg/virt-launcher/virtwrap/access-credentials/access_credentials.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go diff --git a/pkg/virt-launcher/virtwrap/access-credentials/access_credentials_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/access-credentials/access_credentials_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/access-credentials/access_credentials_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/access-credentials/access_credentials_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go diff --git a/pkg/virt-launcher/virtwrap/agent-poller/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/agent-poller/agent_parser.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_parser.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/agent_parser.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_parser.go diff --git a/pkg/virt-launcher/virtwrap/agent-poller/agent_parser_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_parser_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/agent_parser_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_parser_test.go diff --git a/pkg/virt-launcher/virtwrap/agent-poller/agent_poller.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/agent_poller.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go diff --git a/pkg/virt-launcher/virtwrap/agent-poller/agent_poller_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/agent_poller_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/agent-poller/agent_poller_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent-poller/agent_poller_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go diff --git a/pkg/virt-launcher/virtwrap/agent/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/agent/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/agent/exec.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent/exec.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go diff --git a/pkg/virt-launcher/virtwrap/agent/types.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/types.go similarity index 100% rename from pkg/virt-launcher/virtwrap/agent/types.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/agent/types.go diff --git a/pkg/virt-launcher/virtwrap/cli/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/cli/cli_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/cli_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/cli_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/cli_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/cli/event.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/event.go similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/event.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/event.go diff --git a/pkg/virt-launcher/virtwrap/cli/generated_mock_libvirt.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/generated_mock_libvirt.go similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/generated_mock_libvirt.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/generated_mock_libvirt.go diff --git a/pkg/virt-launcher/virtwrap/cli/libvirt.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/libvirt.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go diff --git a/pkg/virt-launcher/virtwrap/cli/libvirt_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/cli/libvirt_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/converter/arch/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/converter/arch/amd64.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/amd64.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/arm64.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/arm64.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/arm64.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/arm64.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/converter.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/converter_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/converter_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/converter_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/converter_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/ppc64le.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/ppc64le.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/ppc64le.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/ppc64le.go diff --git a/pkg/virt-launcher/virtwrap/converter/arch/s390x.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/s390x.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/arch/s390x.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/s390x.go diff --git a/pkg/virt-launcher/virtwrap/converter/converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/converter.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go diff --git a/pkg/virt-launcher/virtwrap/converter/converter_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/converter_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/converter_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/downwardmetrics.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/downwardmetrics.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/downwardmetrics.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/downwardmetrics.go diff --git a/pkg/virt-launcher/virtwrap/converter/generated_mock_converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/generated_mock_converter.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/generated_mock_converter.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/generated_mock_converter.go diff --git a/pkg/virt-launcher/virtwrap/converter/network.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/network.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go diff --git a/pkg/virt-launcher/virtwrap/converter/pci-placement.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/pci-placement.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/pci-placement.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/pci-placement.go diff --git a/pkg/virt-launcher/virtwrap/converter/testdata/domain_arm64.xml.tmpl b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_arm64.xml.tmpl similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/testdata/domain_arm64.xml.tmpl rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_arm64.xml.tmpl diff --git a/pkg/virt-launcher/virtwrap/converter/testdata/domain_ppc64le.xml.tmpl b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_ppc64le.xml.tmpl similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/testdata/domain_ppc64le.xml.tmpl rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_ppc64le.xml.tmpl diff --git a/pkg/virt-launcher/virtwrap/converter/testdata/domain_s390x.xml.tmpl b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_s390x.xml.tmpl similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/testdata/domain_s390x.xml.tmpl rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_s390x.xml.tmpl diff --git a/pkg/virt-launcher/virtwrap/converter/testdata/domain_x86_64.xml.tmpl b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_x86_64.xml.tmpl similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/testdata/domain_x86_64.xml.tmpl rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_x86_64.xml.tmpl diff --git a/pkg/virt-launcher/virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/testdata/domain_x86_64_root.xml.tmpl diff --git a/pkg/virt-launcher/virtwrap/converter/vcpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/vcpu/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/converter/vcpu/numa_placement_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/vcpu/numa_placement_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/vcpu/vcpu.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/vcpu/vcpu.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go diff --git a/pkg/virt-launcher/virtwrap/converter/vcpu/vcpu_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/vcpu/vcpu_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/vcpu/vcpu_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/vcpu/vcpu_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu_test.go diff --git a/pkg/virt-launcher/virtwrap/converter/virtiofs.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/virtiofs.go similarity index 100% rename from pkg/virt-launcher/virtwrap/converter/virtiofs.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/converter/virtiofs.go diff --git a/pkg/virt-launcher/virtwrap/device/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/device/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/device/device_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/device_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/device_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/device_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/addresspool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/addresspool.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/addresspool_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/addresspool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/addresspool.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/addresspool_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/generic_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/generic_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/generic_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/generic_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/hostdev.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/generic/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/generic/hostdev_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/addresspool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/addresspool.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/addresspool_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/gpu_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/gpu_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/gpu_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/gpu_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/hostdev.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/gpu/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/gpu/hostdev_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/hostdev.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/hostdev_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/hostdevice_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdevice_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/hostdevice_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdevice_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/hotplug.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/hotplug.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/hotplug_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/hotplug_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/OWNERS b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/OWNERS similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/OWNERS rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/OWNERS diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/hostdev.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/hostdev_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_netstatus.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_netstatus.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/pcipool_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go diff --git a/pkg/virt-launcher/virtwrap/device/hostdevice/sriov/sriov_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/sriov_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/hostdevice/sriov/sriov_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/sriov_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/device/pciaddress.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/pciaddress.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress.go diff --git a/pkg/virt-launcher/virtwrap/device/pciaddress_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/pciaddress_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go diff --git a/pkg/virt-launcher/virtwrap/device/usbaddress.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/usbaddress.go similarity index 100% rename from pkg/virt-launcher/virtwrap/device/usbaddress.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/device/usbaddress.go diff --git a/pkg/virt-launcher/virtwrap/efi/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/efi/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/efi/efi.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi.go similarity index 100% rename from pkg/virt-launcher/virtwrap/efi/efi.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi.go diff --git a/pkg/virt-launcher/virtwrap/efi/efi_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/efi/efi_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/efi/efi_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/efi/efi_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/efi/efi_test.go diff --git a/pkg/virt-launcher/virtwrap/errors/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/errors/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/errors/errors.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/errors.go similarity index 100% rename from pkg/virt-launcher/virtwrap/errors/errors.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/errors/errors.go diff --git a/pkg/virt-launcher/virtwrap/launchsecurity/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/launchsecurity/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/launchsecurity/launchsecurity_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/launchsecurity_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/launchsecurity/launchsecurity_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/launchsecurity_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/launchsecurity/sev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev.go similarity index 100% rename from pkg/virt-launcher/virtwrap/launchsecurity/sev.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev.go diff --git a/pkg/virt-launcher/virtwrap/launchsecurity/sev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/launchsecurity/sev_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go diff --git a/pkg/virt-launcher/virtwrap/libvirtxml/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/libvirtxml/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/libvirtxml/convert.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/convert.go similarity index 100% rename from pkg/virt-launcher/virtwrap/libvirtxml/convert.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/convert.go diff --git a/pkg/virt-launcher/virtwrap/libvirtxml/libvirtxml_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/libvirtxml_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/libvirtxml/libvirtxml_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/libvirtxml_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/libvirtxml/libvirtxml_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/libvirtxml_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/libvirtxml/libvirtxml_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/libvirtxml_test.go diff --git a/pkg/virt-launcher/virtwrap/live-migration-source.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go similarity index 100% rename from pkg/virt-launcher/virtwrap/live-migration-source.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go diff --git a/pkg/virt-launcher/virtwrap/live-migration-source_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/live-migration-source_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source_test.go diff --git a/pkg/virt-launcher/virtwrap/live-migration-target.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go similarity index 100% rename from pkg/virt-launcher/virtwrap/live-migration-target.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go diff --git a/pkg/virt-launcher/virtwrap/manager_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/manager_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go diff --git a/pkg/virt-launcher/virtwrap/nichotplug.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go similarity index 100% rename from pkg/virt-launcher/virtwrap/nichotplug.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go diff --git a/pkg/virt-launcher/virtwrap/nichotplug_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/nichotplug_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go diff --git a/pkg/virt-launcher/virtwrap/statsconv/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/statsconv/converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter.go similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/converter.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter.go diff --git a/pkg/virt-launcher/virtwrap/statsconv/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/converter_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go diff --git a/pkg/virt-launcher/virtwrap/statsconv/generated_mock_converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/generated_mock_converter.go similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/generated_mock_converter.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/generated_mock_converter.go diff --git a/pkg/virt-launcher/virtwrap/statsconv/stats_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/stats_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/stats_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/stats_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/statsconv/util/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/util/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/statsconv/util/domstats_utils.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/domstats_utils.go similarity index 100% rename from pkg/virt-launcher/virtwrap/statsconv/util/domstats_utils.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/domstats_utils.go diff --git a/pkg/virt-launcher/virtwrap/testdata/migration_domain.xml b/pkg/virt-launcher-libvirt-qemu/virtwrap/testdata/migration_domain.xml similarity index 100% rename from pkg/virt-launcher/virtwrap/testdata/migration_domain.xml rename to pkg/virt-launcher-libvirt-qemu/virtwrap/testdata/migration_domain.xml diff --git a/pkg/virt-launcher/virtwrap/testing/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/testing/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/testing/libvirt.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go similarity index 100% rename from pkg/virt-launcher/virtwrap/testing/libvirt.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go diff --git a/pkg/virt-launcher/virtwrap/util/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel similarity index 100% rename from pkg/virt-launcher/virtwrap/util/BUILD.bazel rename to pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel diff --git a/pkg/virt-launcher/virtwrap/util/cpu_utils.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/cpu_utils.go similarity index 100% rename from pkg/virt-launcher/virtwrap/util/cpu_utils.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/util/cpu_utils.go diff --git a/pkg/virt-launcher/virtwrap/util/libvirt_helper.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go similarity index 100% rename from pkg/virt-launcher/virtwrap/util/libvirt_helper.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go diff --git a/pkg/virt-launcher/virtwrap/util/libvirt_helper_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/util/libvirt_helper_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go diff --git a/pkg/virt-launcher/virtwrap/util/util_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/util_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/util/util_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/util/util_suite_test.go diff --git a/pkg/virt-launcher/virtwrap/virtwrap_suite_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/virtwrap_suite_test.go similarity index 100% rename from pkg/virt-launcher/virtwrap/virtwrap_suite_test.go rename to pkg/virt-launcher-libvirt-qemu/virtwrap/virtwrap_suite_test.go From 306b1b2c2923615e840062d6ec3f6204665524a3 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 11:45:12 -0700 Subject: [PATCH 2/8] [UNSTABLE] First round of import changes --- .../access-credentials/access_credentials.go | 6 +++--- .../access_credentials_test.go | 12 ++++++------ .../virtwrap/agent-poller/agent_poller.go | 2 +- .../virtwrap/agent-poller/agent_poller_test.go | 2 +- .../virtwrap/agent/exec.go | 2 +- .../virtwrap/cli/libvirt.go | 4 ++-- .../virtwrap/converter/arch/amd64.go | 2 +- .../virtwrap/converter/converter.go | 8 ++++---- .../virtwrap/converter/converter_test.go | 6 +++--- .../virtwrap/converter/network.go | 6 +++--- .../device/hostdevice/addresspool_test.go | 2 +- .../device/hostdevice/generic/addresspool.go | 2 +- .../hostdevice/generic/addresspool_test.go | 4 ++-- .../device/hostdevice/generic/hostdev.go | 2 +- .../device/hostdevice/generic/hostdev_test.go | 2 +- .../device/hostdevice/gpu/addresspool.go | 2 +- .../device/hostdevice/gpu/addresspool_test.go | 4 ++-- .../virtwrap/device/hostdevice/gpu/hostdev.go | 2 +- .../device/hostdevice/gpu/hostdev_test.go | 2 +- .../virtwrap/device/hostdevice/hostdev.go | 2 +- .../virtwrap/device/hostdevice/hostdev_test.go | 2 +- .../virtwrap/device/hostdevice/hotplug_test.go | 2 +- .../virtwrap/device/hostdevice/sriov/hostdev.go | 4 ++-- .../device/hostdevice/sriov/hostdev_test.go | 6 +++--- .../virtwrap/device/hostdevice/sriov/pcipool.go | 2 +- .../hostdevice/sriov/pcipool_netstatus_test.go | 2 +- .../device/hostdevice/sriov/pcipool_test.go | 2 +- .../virtwrap/device/pciaddress_test.go | 2 +- .../virtwrap/launchsecurity/sev_test.go | 2 +- .../virtwrap/live-migration-source.go | 16 ++++++++-------- .../virtwrap/live-migration-target.go | 4 ++-- .../virtwrap/manager_test.go | 10 +++++----- .../virtwrap/nichotplug.go | 6 +++--- .../virtwrap/nichotplug_test.go | 2 +- .../virtwrap/statsconv/converter_test.go | 2 +- .../virtwrap/testing/libvirt.go | 2 +- .../virtwrap/util/libvirt_helper.go | 4 ++-- .../virtwrap/util/libvirt_helper_test.go | 6 +++--- .../metadata/BUILD.bazel | 0 .../metadata/cache.go | 0 .../metadata/kubevirt.go | 0 .../metadata/metadata_suite_test.go | 0 .../metadata/metadata_test.go | 2 +- .../metadata/safedata.go | 0 44 files changed, 76 insertions(+), 76 deletions(-) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/BUILD.bazel (100%) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/cache.go (100%) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/kubevirt.go (100%) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/metadata_suite_test.go (100%) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/metadata_test.go (98%) rename pkg/{virt-launcher-libvirt-qemu => virt-launcher}/metadata/safedata.go (100%) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go index d683797b4194..8d010b140248 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials.go @@ -34,11 +34,11 @@ import ( "kubevirt.io/client-go/log" "kubevirt.io/kubevirt/pkg/config" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) type openReturn struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go index 3505abacd5e6..dad7bdfb7db9 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go @@ -39,13 +39,13 @@ import ( v1 "kubevirt.io/api/core/v1" cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/metadata" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) var _ = Describe("AccessCredentials", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go index 12f42e3b3f34..e5f4455c29c3 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller.go @@ -28,8 +28,8 @@ import ( "kubevirt.io/client-go/log" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" ) // AgentCommand is a command executable on guest agent diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go index cc37aca091d7..8caddf17abcc 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/agent_poller_test.go @@ -28,8 +28,8 @@ import ( "libvirt.org/go/libvirt" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" ) var _ = Describe("Qemu agent poller", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go index e9303165ade5..47fb92323614 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/exec.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" ) // GuestExec sends the provided command and args to the guest agent for execution and returns an error on an unsucessful exit code diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go index f0e9de84ec64..dbe761dac5fe 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/libvirt.go @@ -34,10 +34,10 @@ import ( "kubevirt.io/client-go/log" virtwait "kubevirt.io/kubevirt/pkg/apimachinery/wait" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/statsconv" ) const ConnectionTimeout = 15 * time.Second diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go index fd9d546704be..1fd0e3fc7b12 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/amd64.go @@ -22,8 +22,8 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/kubevirt/pkg/pointer" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" ) // Ensure that there is a compile error should the struct not implement the archConverter interface anymore. diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go index 280e21c43c32..34b6f4293cc3 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go @@ -60,11 +60,11 @@ import ( "kubevirt.io/kubevirt/pkg/util" "kubevirt.io/kubevirt/pkg/virt-controller/services" "kubevirt.io/kubevirt/pkg/virt-controller/watch/topology" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/launchsecurity" ) const ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go index 0332c6c085c9..6ceec6947c65 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go @@ -57,10 +57,10 @@ import ( "kubevirt.io/kubevirt/pkg/testutils" "kubevirt.io/kubevirt/pkg/util/hardware" "kubevirt.io/kubevirt/pkg/virt-controller/services" + archconverter "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + sev "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - archconverter "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - sev "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/launchsecurity" ) var ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go index 53f95e9f99f8..9eb7bdc801d7 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go @@ -26,10 +26,10 @@ import ( "kubevirt.io/client-go/log" netvmispec "kubevirt.io/kubevirt/pkg/network/vmispec" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" ) func CreateDomainInterfaces(vmi *v1.VirtualMachineInstance, c *ConverterContext) ([]api.Interface, error) { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go index ba4cb33d8d15..03bfb5cb4985 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/addresspool_test.go @@ -26,7 +26,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" ) type envData struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go index d67d41cd7ac3..bb3e37178ce7 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool.go @@ -22,7 +22,7 @@ package generic import ( v1 "kubevirt.io/api/core/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" ) // NewPCIAddressPool creates a PCI address pool based on the provided list of host-devices and diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go index bd4f7f561b51..33e048883a26 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/addresspool_test.go @@ -28,8 +28,8 @@ import ( v1 "kubevirt.io/api/core/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/generic" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic" ) type envData struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go index 34f27d3b344e..d60b3b6d34bc 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev.go @@ -24,8 +24,8 @@ import ( v1 "kubevirt.io/api/core/v1" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" ) const ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go index fe895ac1faf4..bd6d43e0b84f 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/hostdev_test.go @@ -27,8 +27,8 @@ import ( v1 "kubevirt.io/api/core/v1" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/generic" ) var _ = Describe("Generic HostDevice", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go index a5f9aec84699..96d471316576 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool.go @@ -22,7 +22,7 @@ package gpu import ( v1 "kubevirt.io/api/core/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" ) // NewPCIAddressPool creates a PCI address pool based on the provided list of host-devices and diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go index cd40d786c24c..98f0e210a261 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/addresspool_test.go @@ -28,8 +28,8 @@ import ( v1 "kubevirt.io/api/core/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/gpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu" ) type envData struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go index f9af48725f44..a58fb4047676 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev.go @@ -24,8 +24,8 @@ import ( v1 "kubevirt.io/api/core/v1" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" ) const ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go index 5217ea4cc3de..28c4152231db 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/hostdev_test.go @@ -27,8 +27,8 @@ import ( v1 "kubevirt.io/api/core/v1" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/gpu" ) var _ = Describe("GPU HostDevice", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go index 4e4028175226..259a835a7dce 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev.go @@ -26,8 +26,8 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/client-go/log" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" ) const failedCreateHostDeviceFmt = "failed to create hostdevice for %s: %v" diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go index a47cdf36e523..8b742f67da48 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hostdev_test.go @@ -28,8 +28,8 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/kubevirt/pkg/pointer" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" ) type createHostDevices func([]hostdevice.HostDeviceMetaData, hostdevice.AddressPooler) ([]api.HostDevice, error) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go index a168e22bf3e6..c9b983b34052 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/hotplug_test.go @@ -28,8 +28,8 @@ import ( "libvirt.org/go/libvirt" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" ) var _ = Describe("Hot(un)Plug HostDevice", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go index ce1f8e556f93..b6fe5bd7c675 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev.go @@ -34,9 +34,9 @@ import ( "kubevirt.io/kubevirt/pkg/network/deviceinfo" "kubevirt.io/kubevirt/pkg/network/downwardapi" "kubevirt.io/kubevirt/pkg/network/vmispec" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" ) func CreateHostDevices(vmi *v1.VirtualMachineInstance) ([]api.HostDevice, error) { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go index 55a994dcf72c..6b25b0ba6b1e 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/hostdev_test.go @@ -24,8 +24,8 @@ import ( "time" "kubevirt.io/kubevirt/pkg/network/vmispec" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -35,8 +35,8 @@ import ( v1 "kubevirt.io/api/core/v1" netsriov "kubevirt.io/kubevirt/pkg/network/deviceinfo" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov" ) const ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go index 412bd83c49c6..31ec3879aa2d 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool.go @@ -26,7 +26,7 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/client-go/log" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" ) type PCIAddressPool struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go index e0c6bd28b754..bb272a72da62 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_netstatus_test.go @@ -26,7 +26,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - sriovhostdev "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov" + sriovhostdev "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov" ) var _ = Describe("SRIOV PCI address pool with network-pci-map", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go index d144e6a687f7..e724f40b49fc 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/pcipool_test.go @@ -28,7 +28,7 @@ import ( v1 "kubevirt.io/api/core/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov" ) type networkData struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go index 12c1c8fe33c9..de51434d8fa7 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/pciaddress_test.go @@ -23,8 +23,8 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" ) var _ = Describe("PCI Address", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go index 5b0c0066230b..1614a1447aeb 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/sev_test.go @@ -26,7 +26,7 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/kubevirt/pkg/pointer" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/launchsecurity" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity" ) var _ = Describe("LaunchSecurity: AMD Secure Encrypted Virtualization (SEV)", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go index 254c31dc39ee..b6e068872b15 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go @@ -47,15 +47,15 @@ import ( hotplugdisk "kubevirt.io/kubevirt/pkg/hotplug-disk" storagetypes "kubevirt.io/kubevirt/pkg/storage/types" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov" - domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors" - convxml "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/libvirtxml" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov" + domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors" + convxml "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/statsconv" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) const liveMigrationFailed = "Live migration failed." diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go index 1e92e000e953..2df2ef4054ae 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-target.go @@ -36,9 +36,9 @@ import ( "kubevirt.io/kubevirt/pkg/util" "kubevirt.io/kubevirt/pkg/util/net/ip" migrationproxy "kubevirt.io/kubevirt/pkg/virt-handler/migration-proxy" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" ) func (l *LibvirtDomainManager) finalizeMigrationTarget(vmi *v1.VirtualMachineInstance, options *cmdv1.VirtualMachineOptions) error { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go index 49d5cfe4e363..c522614ce720 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go @@ -58,16 +58,16 @@ import ( "kubevirt.io/kubevirt/pkg/util/net/ip" virtconfig "kubevirt.io/kubevirt/pkg/virt-config" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/efi" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" - agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent-poller" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/efi" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" ) var ( diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go index 0a4e68843588..af9a7e0bc3ab 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug.go @@ -33,10 +33,10 @@ import ( virtnetlink "kubevirt.io/kubevirt/pkg/network/link" netvmispec "kubevirt.io/kubevirt/pkg/network/vmispec" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) type vmConfigurator interface { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go index 6baf1612ab2e..24bb0ef9c618 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go @@ -36,9 +36,9 @@ import ( "kubevirt.io/kubevirt/pkg/network/namescheme" "kubevirt.io/kubevirt/pkg/network/vmispec" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" ) const defaultNet = "default" diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go index 0e31c0316a59..8c63fb18a4e3 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/converter_test.go @@ -32,8 +32,8 @@ import ( "k8s.io/apimachinery/pkg/api/equality" "libvirt.org/go/libvirt" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/statsconv/util" ) var _ = Describe("StatsConverter", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go index 87f8280341e0..114d5c7bd2bd 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/libvirt.go @@ -28,7 +28,7 @@ import ( "go.uber.org/mock/gomock" "libvirt.org/go/libvirt" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" ) type callStack struct { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go index 21332cdbef44..c5744a24d520 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper.go @@ -23,15 +23,15 @@ import ( "k8s.io/apimachinery/pkg/types" "libvirt.org/go/libvirt" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" v1 "kubevirt.io/api/core/v1" "kubevirt.io/client-go/log" "kubevirt.io/kubevirt/pkg/hooks" "kubevirt.io/kubevirt/pkg/util" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" ) const QEMUSeaBiosDebugPipe = converter.QEMUSeaBiosDebugPipe diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go index 8bda7b44a4f3..fea08a5280aa 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/libvirt_helper_test.go @@ -24,10 +24,10 @@ import ( "kubevirt.io/kubevirt/pkg/hooks" "kubevirt.io/kubevirt/pkg/pointer" "kubevirt.io/kubevirt/pkg/virt-controller/services" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" ) const ( diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/BUILD.bazel b/pkg/virt-launcher/metadata/BUILD.bazel similarity index 100% rename from pkg/virt-launcher-libvirt-qemu/metadata/BUILD.bazel rename to pkg/virt-launcher/metadata/BUILD.bazel diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/cache.go b/pkg/virt-launcher/metadata/cache.go similarity index 100% rename from pkg/virt-launcher-libvirt-qemu/metadata/cache.go rename to pkg/virt-launcher/metadata/cache.go diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/kubevirt.go b/pkg/virt-launcher/metadata/kubevirt.go similarity index 100% rename from pkg/virt-launcher-libvirt-qemu/metadata/kubevirt.go rename to pkg/virt-launcher/metadata/kubevirt.go diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/metadata_suite_test.go b/pkg/virt-launcher/metadata/metadata_suite_test.go similarity index 100% rename from pkg/virt-launcher-libvirt-qemu/metadata/metadata_suite_test.go rename to pkg/virt-launcher/metadata/metadata_suite_test.go diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/metadata_test.go b/pkg/virt-launcher/metadata/metadata_test.go similarity index 98% rename from pkg/virt-launcher-libvirt-qemu/metadata/metadata_test.go rename to pkg/virt-launcher/metadata/metadata_test.go index 4e7c9abed1ae..95944855520a 100644 --- a/pkg/virt-launcher-libvirt-qemu/metadata/metadata_test.go +++ b/pkg/virt-launcher/metadata/metadata_test.go @@ -25,7 +25,7 @@ import ( "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/metadata" ) var _ = Describe("Metadata", func() { diff --git a/pkg/virt-launcher-libvirt-qemu/metadata/safedata.go b/pkg/virt-launcher/metadata/safedata.go similarity index 100% rename from pkg/virt-launcher-libvirt-qemu/metadata/safedata.go rename to pkg/virt-launcher/metadata/safedata.go From 41d3bddf709bc764fcab210a2b6b8bbc67cb9fb1 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 12:14:49 -0700 Subject: [PATCH 3/8] [UNSTABLE] Only notify-client remains to be import-fixed --- pkg/virt-launcher-libvirt-qemu/BUILD.bazel | 2 +- .../virtwrap/BUILD.bazel | 33 +- .../access_credentials_test.go | 2 +- .../virtwrap/manager.go | 2511 +++++++++++++++++ .../virtwrap/manager_test.go | 11 +- .../virtwrap/nichotplug_test.go | 2 +- pkg/virt-launcher/virtwrap/BUILD.bazel | 34 + .../virtwrap/cmd-server/server.go | 4 +- .../virtwrap/cmd-server/server_test.go | 2 +- pkg/virt-launcher/virtwrap/manager.go | 2473 ---------------- 10 files changed, 2574 insertions(+), 2500 deletions(-) create mode 100644 pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go create mode 100644 pkg/virt-launcher/virtwrap/BUILD.bazel diff --git a/pkg/virt-launcher-libvirt-qemu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/BUILD.bazel index 7aaede931528..ead7e9feb54e 100644 --- a/pkg/virt-launcher-libvirt-qemu/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["monitor.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu", visibility = ["//visibility:public"], deps = [ "//pkg/ephemeral-disk-utils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel index 471a34631385..397ae50ce297 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel @@ -10,7 +10,7 @@ go_library( "manager.go", "nichotplug.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap", visibility = ["//visibility:public"], deps = [ "//pkg/cloud-init:go_default_library", @@ -47,24 +47,25 @@ go_library( "//pkg/virt-handler/cmd-client:go_default_library", "//pkg/virt-handler/migration-proxy:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/access-credentials:go_default_library", - "//pkg/virt-launcher/virtwrap/agent:go_default_library", - "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", + "//pkg/virt-launcher/virtwrap:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice/generic:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice/gpu:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice/sriov:go_default_library", - "//pkg/virt-launcher/virtwrap/efi:go_default_library", - "//pkg/virt-launcher/virtwrap/errors:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/efi:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", "//pkg/virt-launcher/virtwrap/libvirtxml:go_default_library", "//pkg/virt-launcher/virtwrap/stats:go_default_library", - "//pkg/virt-launcher/virtwrap/statsconv:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//tools/cache:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go index dad7bdfb7db9..65bb692fc231 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/access_credentials_test.go @@ -39,12 +39,12 @@ import ( v1 "kubevirt.io/api/core/v1" cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" - "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/metadata" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" + "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go new file mode 100644 index 000000000000..5cd0045d8996 --- /dev/null +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go @@ -0,0 +1,2511 @@ +/* + * This file is part of the KubeVirt project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright The KubeVirt Authors. + * + */ + +package virtwrap + +//go:generate mockgen -source $GOFILE -package=$GOPACKAGE -destination=generated_mock_$GOFILE + +/* + ATTENTION: Rerun code generators when interface signatures are modified. +*/ + +import ( + "context" + "crypto/sha256" + "encoding/xml" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" + "syscall" + "time" + + "libvirt.org/go/libvirt" + + k8sv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + + v1 "kubevirt.io/api/core/v1" + "kubevirt.io/client-go/log" + + cloudinit "kubevirt.io/kubevirt/pkg/cloud-init" + "kubevirt.io/kubevirt/pkg/config" + containerdisk "kubevirt.io/kubevirt/pkg/container-disk" + "kubevirt.io/kubevirt/pkg/controller" + "kubevirt.io/kubevirt/pkg/downwardmetrics" + "kubevirt.io/kubevirt/pkg/emptydisk" + ephemeraldisk "kubevirt.io/kubevirt/pkg/ephemeral-disk" + cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" + "kubevirt.io/kubevirt/pkg/hooks" + "kubevirt.io/kubevirt/pkg/ignition" + "kubevirt.io/kubevirt/pkg/liveupdate/memory" + "kubevirt.io/kubevirt/pkg/network/cache" + netsriov "kubevirt.io/kubevirt/pkg/network/deviceinfo" + netsetup "kubevirt.io/kubevirt/pkg/network/setup" + netvmispec "kubevirt.io/kubevirt/pkg/network/vmispec" + osdisk "kubevirt.io/kubevirt/pkg/os/disk" + "kubevirt.io/kubevirt/pkg/pointer" + "kubevirt.io/kubevirt/pkg/safepath" + storagetypes "kubevirt.io/kubevirt/pkg/storage/types" + "kubevirt.io/kubevirt/pkg/tpm" + "kubevirt.io/kubevirt/pkg/unsafepath" + kutil "kubevirt.io/kubevirt/pkg/util" + "kubevirt.io/kubevirt/pkg/util/hardware" + hw_utils "kubevirt.io/kubevirt/pkg/util/hardware" + "kubevirt.io/kubevirt/pkg/virt-controller/services" + cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + accesscredentials "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" + agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/efi" + domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" + "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" + virtcache "kubevirt.io/kubevirt/tools/cache" +) + +const ( + failedSyncGuestTime = "failed to sync guest time" + failedGetDomain = "Getting the domain failed." + failedGetDomainState = "Getting the domain state failed." + failedDomainMemoryDump = "Domain memory dump failed" + affectDeviceLiveAndConfigLibvirtFlags = libvirt.DOMAIN_DEVICE_MODIFY_LIVE | libvirt.DOMAIN_DEVICE_MODIFY_CONFIG + affectDomainLiveAndConfigLibvirtFlags = libvirt.DOMAIN_AFFECT_LIVE | libvirt.DOMAIN_AFFECT_CONFIG + affectDomainVCPULiveAndConfigLibvirtFlags = libvirt.DOMAIN_VCPU_LIVE | libvirt.DOMAIN_VCPU_CONFIG +) + +const maxConcurrentHotplugHostDevices = 1 +const maxConcurrentMemoryDumps = 1 + +type contextStore struct { + ctx context.Context + cancel context.CancelFunc +} + +type LibvirtDomainManager struct { + virConn cli.Connection + + // Anytime a get and a set is done on the domain, this lock must be held. + domainModifyLock sync.Mutex + // mutex to control access to the guest time context + setGuestTimeLock sync.Mutex + + credManager *accesscredentials.AccessCredentialManager + + hotplugHostDevicesInProgress chan struct{} + memoryDumpInProgress chan struct{} + + virtShareDir string + ephemeralDiskDir string + paused pausedVMIs + agentData *agentpoller.AsyncAgentStore + cloudInitDataStore *cloudinit.CloudInitData + setGuestTimeContextPtr *contextStore + efiEnvironment *efi.EFIEnvironment + ovmfPath string + ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface + directIOChecker converter.DirectIOChecker + disksInfo map[string]*osdisk.DiskInfo + cancelSafetyUnfreezeChan chan struct{} + migrateInfoStats *stats.DomainJobInfo + diskMemoryLimitBytes int64 + + metadataCache *metadata.Cache + domainStatsCache *virtcache.TimeDefinedCache[*stats.DomainStats] + domainDirtyRateStatsCache *virtcache.TimeDefinedCache[*stats.DomainStatsDirtyRate] + + cpuSetGetter func() ([]int, error) + imageVolumeFeatureGateEnabled bool +} + +type pausedVMIs struct { + paused map[types.UID]bool +} + +func (s pausedVMIs) add(uid types.UID) { + // implicitly locked by domainModifyLock + if _, ok := s.paused[uid]; !ok { + s.paused[uid] = true + } +} + +func (s pausedVMIs) remove(uid types.UID) { + // implicitly locked by domainModifyLock + if _, ok := s.paused[uid]; ok { + delete(s.paused, uid) + } +} + +func (s pausedVMIs) contains(uid types.UID) bool { + _, ok := s.paused[uid] + return ok +} + +func NewLibvirtDomainManager(connection cli.Connection, virtShareDir, ephemeralDiskDir string, agentStore *agentpoller.AsyncAgentStore, + ovmfPath string, ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface, metadataCache *metadata.Cache, + stopChan chan struct{}, diskMemoryLimitBytes int64, cpuSetGetter func() ([]int, error), imageVolumeEnabled bool) (virtwrap.DomainManager, error) { + directIOChecker := converter.NewDirectIOChecker() + return newLibvirtDomainManager(connection, virtShareDir, ephemeralDiskDir, agentStore, ovmfPath, ephemeralDiskCreator, directIOChecker, metadataCache, stopChan, diskMemoryLimitBytes, cpuSetGetter, imageVolumeEnabled) +} + +func newLibvirtDomainManager(connection cli.Connection, virtShareDir, ephemeralDiskDir string, agentStore *agentpoller.AsyncAgentStore, ovmfPath string, + ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface, directIOChecker converter.DirectIOChecker, metadataCache *metadata.Cache, + stopChan chan struct{}, diskMemoryLimitBytes int64, cpuSetGetter func() ([]int, error), imageVolumeEnabled bool) (virtwrap.DomainManager, error) { + manager := LibvirtDomainManager{ + diskMemoryLimitBytes: diskMemoryLimitBytes, + virConn: connection, + virtShareDir: virtShareDir, + ephemeralDiskDir: ephemeralDiskDir, + paused: pausedVMIs{ + paused: make(map[types.UID]bool, 0), + }, + agentData: agentStore, + efiEnvironment: efi.DetectEFIEnvironment(runtime.GOARCH, ovmfPath), + ephemeralDiskCreator: ephemeralDiskCreator, + directIOChecker: directIOChecker, + disksInfo: map[string]*osdisk.DiskInfo{}, + cancelSafetyUnfreezeChan: make(chan struct{}), + migrateInfoStats: &stats.DomainJobInfo{}, + metadataCache: metadataCache, + cpuSetGetter: cpuSetGetter, + imageVolumeFeatureGateEnabled: imageVolumeEnabled, + } + + manager.hotplugHostDevicesInProgress = make(chan struct{}, maxConcurrentHotplugHostDevices) + manager.memoryDumpInProgress = make(chan struct{}, maxConcurrentMemoryDumps) + manager.credManager = accesscredentials.NewManager(connection, &manager.domainModifyLock, metadataCache) + + reCalcDomainStats := func() (*stats.DomainStats, error) { + list, err := manager.getDomainStats() + if err != nil { + return nil, err + } + + if len(list) == 0 { + return nil, nil + } + + return list[0], nil + } + + var err error + manager.domainStatsCache, err = virtcache.NewTimeDefinedCache(3250*time.Millisecond, true, reCalcDomainStats) + if err != nil { + return nil, err + } + + if stopChan != nil { + err := manager.domainStatsCache.KeepValueUpdated(stopChan) + if err != nil { + return nil, fmt.Errorf("failed to keep domain stats updated: %w", err) + } + } + + return &manager, nil +} + +func getDomainSpec(dom cli.VirDomain) (*api.DomainSpec, error) { + var newSpec api.DomainSpec + xmlstr, err := dom.GetXMLDesc(0) + if err != nil { + return &newSpec, err + } + err = xml.Unmarshal([]byte(xmlstr), &newSpec) + if err != nil { + return &newSpec, err + } + + return &newSpec, nil +} + +func getAllDomainDevices(dom cli.VirDomain) (api.Devices, error) { + domSpec, err := getDomainSpec(dom) + if err != nil { + return domSpec.Devices, err + } + return domSpec.Devices, nil +} + +func getAllDomainDisks(dom cli.VirDomain) ([]api.Disk, error) { + devices, err := getAllDomainDevices(dom) + if err != nil { + return nil, err + } + + return devices.Disks, nil +} + +func (l *LibvirtDomainManager) UpdateGuestMemory(vmi *v1.VirtualMachineInstance) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + const errMsgPrefix = "failed to update Guest Memory" + + domainName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domainName) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + defer dom.Free() + + memoryDevice, err := memory.BuildMemoryDevice(vmi) + if err != nil { + return err + } + + spec, err := getDomainSpec(dom) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + if spec.Devices.Memory != nil { + spec.Devices.Memory.Target.Requested = memoryDevice.Target.Requested + + memoryDeviceXML, err := xml.Marshal(spec.Devices.Memory) + if err != nil { + log.Log.Reason(err).Error("marshalling target virtio-mem failed") + return err + } + + err = dom.UpdateDeviceFlags(strings.ToLower(string(memoryDeviceXML)), libvirt.DOMAIN_DEVICE_MODIFY_LIVE) + if err != nil { + log.Log.Reason(err).Error("updating virtio-mem device") + return err + } + } else { + memoryDeviceXML, err := xml.Marshal(memoryDevice) + if err != nil { + log.Log.Reason(err).Error("marshalling target virtio-mem failed") + return err + } + + err = dom.AttachDeviceFlags(strings.ToLower(string(memoryDeviceXML)), affectDeviceLiveAndConfigLibvirtFlags) + if err != nil { + log.Log.Reason(err).Error("attaching virtio-mem device") + return err + } + } + + log.Log.V(2).Infof("hotplugging guest memory to %v", vmi.Spec.Domain.Memory.Guest.Value()) + return nil +} + +func (l *LibvirtDomainManager) setGuestTime(vmi *v1.VirtualMachineInstance) error { + // Try to set VM time to the current value. This is typically useful + // when clock wasn't running on the VM for some time (e.g. during + // suspension or migration), especially if the time delay exceeds NTP + // tolerance. + // It is not guaranteed that the time is actually set (it depends on guest + // environment, especially QEMU agent presence) or that the set time is + // very precise (NTP in the guest should take care of it if needed). + + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + log.Log.Object(vmi).Reason(err).Error(failedSyncGuestTime) + return err + } + + go func() { + defer dom.Free() + + // Syncing the guest time is a best-effort. Therefore + // don't flood the logs + var latestErr error + defer func() { + if latestErr != nil { + log.Log.Object(vmi).Warning(latestErr.Error()) + } + }() + + ctx := l.getGuestTimeContext() + timeout := time.After(60 * time.Second) + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + for { + select { + case <-timeout: + log.Log.Object(vmi).Error(failedSyncGuestTime) + return + case <-ctx.Done(): + return + case <-ticker.C: + currTime := time.Now() + secs := currTime.Unix() + nsecs := uint(currTime.Nanosecond()) + err := dom.SetTime(secs, nsecs, 0) + if err != nil { + libvirtError, ok := err.(libvirt.Error) + if !ok { + log.Log.Object(vmi).Reason(err).Warning(failedSyncGuestTime) + return + } + + switch libvirtError.Code { + case libvirt.ERR_AGENT_UNRESPONSIVE: + const unresponsive = "failed to set time: QEMU agent unresponsive" + latestErr = fmt.Errorf("%s, %s", unresponsive, err) + log.Log.Object(vmi).Reason(err).V(9).Info(unresponsive) + case libvirt.ERR_OPERATION_UNSUPPORTED: + // no need to retry as this opertaion is not supported + log.Log.Object(vmi).Reason(err).Warning("failed to set time: not supported") + return + case libvirt.ERR_ARGUMENT_UNSUPPORTED: + // no need to retry as the agent is not configured + log.Log.Object(vmi).Reason(err).Warning("failed to set time: agent not configured") + return + default: + latestErr = fmt.Errorf("%s, %s", failedSyncGuestTime, err) + log.Log.Object(vmi).Reason(err).V(9).Info(failedSyncGuestTime) + } + } else { + latestErr = nil + log.Log.Object(vmi).Info("guest VM time sync finished successfully") + return + } + } + } + }() + + return nil +} + +func (l *LibvirtDomainManager) getGuestTimeContext() context.Context { + l.setGuestTimeLock.Lock() + defer l.setGuestTimeLock.Unlock() + + // cancel the already running setGuestTime go-routine if such exist + if l.setGuestTimeContextPtr != nil { + l.setGuestTimeContextPtr.cancel() + } + // create a new context and store it + ctx, cancel := context.WithCancel(context.Background()) + l.setGuestTimeContextPtr = &contextStore{ctx: ctx, cancel: cancel} + return ctx +} + +// PrepareMigrationTarget the target pod environment before the migration is initiated +func (l *LibvirtDomainManager) PrepareMigrationTarget( + vmi *v1.VirtualMachineInstance, + allowEmulation bool, + options *cmdv1.VirtualMachineOptions, +) error { + return l.prepareMigrationTarget(vmi, allowEmulation, options) +} + +// FinalizeVirtualMachineMigration finalized the migration after the migration has completed and vmi is running on target pod. +func (l *LibvirtDomainManager) FinalizeVirtualMachineMigration(vmi *v1.VirtualMachineInstance, options *cmdv1.VirtualMachineOptions) error { + return l.finalizeMigrationTarget(vmi, options) +} + +// UpdateVCPUs plugs or unplugs vCPUs on a running domain +func (l *LibvirtDomainManager) UpdateVCPUs(vmi *v1.VirtualMachineInstance, options *cmdv1.VirtualMachineOptions) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + const errMsgPrefix = "failed to update vCPUs" + + domainName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domainName) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + defer dom.Free() + var topology *cmdv1.Topology + + logger := log.Log.Object(vmi) + + vcpuTopology := vcpu.GetCPUTopology(vmi) + vcpuCount := vcpu.CalculateRequestedVCPUs(vcpuTopology) + // hot plug/unplug vCPUs + if err := dom.SetVcpusFlags(uint(vcpuCount), + affectDomainVCPULiveAndConfigLibvirtFlags); err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + // Adjust guest vcpu config. Currently will handle vCPUs to pCPUs pinning + if vmi.IsCPUDedicated() { + useIOThreads := false + if options != nil && options.Topology != nil { + topology = options.Topology + } + + podCPUSet, err := l.cpuSetGetter() + if err != nil { + logger.Reason(err).Error("failed to read pod cpuset.") + return fmt.Errorf("failed to read pod cpuset: %v", err) + } + + domain, err := util.NewDomain(dom) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + spec, err := getDomainSpec(dom) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + domain.Spec = *spec + + if domain.Spec.CPUTune != nil && len(domain.Spec.CPUTune.IOThreadPin) > 0 { + useIOThreads = true + } + + err = vcpu.AdjustDomainForTopologyAndCPUSet(domain, vmi, topology, podCPUSet, useIOThreads) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + for _, vcpupin := range domain.Spec.CPUTune.VCPUPin { + vcpu := vcpupin.VCPU + cpuSet := vcpupin.CPUSet + pcpu, err := strconv.Atoi(cpuSet) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + cpuMap := make([]bool, int(pcpu)+1) + cpuMap[pcpu] = true + err = dom.PinVcpuFlags(uint(vcpu), cpuMap, affectDomainLiveAndConfigLibvirtFlags) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + } + if domain.Spec.CPUTune.EmulatorPin != nil { + isolCpus, _ := hw_utils.ParseCPUSetLine(domain.Spec.CPUTune.EmulatorPin.CPUSet, 100) + cpuMap := make([]bool, maxSlice(isolCpus)+1) + for _, isolCpu := range isolCpus { + cpuMap[isolCpu] = true + } + err = dom.PinEmulator(cpuMap, affectDomainLiveAndConfigLibvirtFlags) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + } + + } + return nil +} + +func maxSlice(slice []int) int { + var max = slice[0] + for _, value := range slice { + if max < value { + max = value + } + } + return max +} + +// HotplugHostDevices attach host-devices to running domain, currently only SRIOV host-devices are supported. +// This operation runs in the background, only one hotplug operation can occur at a time. +func (l *LibvirtDomainManager) HotplugHostDevices(vmi *v1.VirtualMachineInstance) error { + select { + case l.hotplugHostDevicesInProgress <- struct{}{}: + default: + return fmt.Errorf("hot-plug host-devices is in progress") + } + + go func() { + defer func() { <-l.hotplugHostDevicesInProgress }() + + if err := l.hotPlugHostDevices(vmi); err != nil { + log.Log.Object(vmi).Error(err.Error()) + } + }() + return nil +} + +func (l *LibvirtDomainManager) hotPlugHostDevices(vmi *v1.VirtualMachineInstance) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + const errMsgPrefix = "failed to hot-plug host-devices" + + domainName := api.VMINamespaceKeyFunc(vmi) + domain, err := l.virConn.LookupDomainByName(domainName) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + defer domain.Free() + + domainSpec, err := util.GetDomainSpecWithFlags(domain, 0) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + sriovHostDevices, err := sriov.GetHostDevicesToAttach(vmi, domainSpec) + if err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, err) + } + + if err := hostdevice.AttachHostDevices(domain, sriovHostDevices); err != nil { + return fmt.Errorf("%s: %v", errMsgPrefix, hostdevice.AttachHostDevices(domain, sriovHostDevices)) + } + + return nil +} + +func (l *LibvirtDomainManager) Exec(domainName, command string, args []string, timeoutSeconds int32) (string, error) { + return agent.GuestExec(l.virConn, domainName, command, args, timeoutSeconds) +} + +func (l *LibvirtDomainManager) GuestPing(domainName string) error { + pingCmd := `{"execute":"guest-ping"}` + _, err := l.virConn.QemuAgentCommand(pingCmd, domainName) + return err +} + +func getVMIEphemeralDisksTotalSize(ephemeralDiskDir string) *resource.Quantity { + totalSize := int64(0) + err := filepath.Walk(ephemeralDiskDir, func(path string, f os.FileInfo, err error) error { + if err != nil { + return err + } + if !f.IsDir() { + totalSize += f.Size() + } + return nil + }) + if err != nil { + log.Log.Reason(err).Warning("failed to get VMI ephemeral disks size") + return resource.NewScaledQuantity(0, 0) + } + + return resource.NewScaledQuantity(totalSize, 0) +} + +func getVMIMigrationDataSize(vmi *v1.VirtualMachineInstance, ephemeralDiskDir string) int64 { + var memory resource.Quantity + + // Take memory from the requested memory + if v, ok := vmi.Spec.Domain.Resources.Requests[k8sv1.ResourceMemory]; ok { + memory = v + } + // In case that guest memory is explicitly set, override it + if vmi.Spec.Domain.Memory != nil && vmi.Spec.Domain.Memory.Guest != nil { + memory = *vmi.Spec.Domain.Memory.Guest + } + + // get total data Size + if vmi.Status.MigrationMethod == v1.BlockMigration { + disksSize := getVMIEphemeralDisksTotalSize(ephemeralDiskDir) + memory.Add(*disksSize) + } + memory.Add(*(storagetypes.GetTotalSizeMigratedVolumes(vmi))) + return memory.ScaledValue(resource.Giga) +} + +func (l *LibvirtDomainManager) CancelVMIMigration(vmi *v1.VirtualMachineInstance) error { + return l.cancelMigration(vmi) +} + +func (l *LibvirtDomainManager) MigrateVMI(vmi *v1.VirtualMachineInstance, options *cmdclient.MigrationOptions) error { + return l.startMigration(vmi, options) +} + +func (l *LibvirtDomainManager) generateSomeCloudInitISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain, size int64) error { + var devicesMetadata []cloudinit.DeviceData + // this is the point where we need to build the devices metadata if it was requested. + // This metadata maps the user provided tag to the hypervisor assigned device address. + if domPtr != nil { + data, err := l.buildDevicesMetadata(vmi, *domPtr) + if err != nil { + return err + } + devicesMetadata = data + } + // build condif drive iso file, that includes devices metadata if available + // get stored cloud init data + var cloudInitDataStore *cloudinit.CloudInitData + cloudInitDataStore = l.cloudInitDataStore + + if cloudInitDataStore != nil { + // add devices metedata + if devicesMetadata != nil { + cloudInitDataStore.DevicesData = &devicesMetadata + } + var err error + if size != 0 { + err = cloudinit.GenerateEmptyIso(vmi.Name, vmi.Namespace, cloudInitDataStore, size) + } else { + // ClusterInstancetype will take precedence over a namespaced Instancetype + // for setting instance_type in the metadata + instancetype := vmi.Annotations[v1.ClusterInstancetypeAnnotation] + if instancetype == "" { + instancetype = vmi.Annotations[v1.InstancetypeAnnotation] + } + + err = cloudinit.GenerateLocalData(vmi, instancetype, cloudInitDataStore) + } + if err != nil { + return fmt.Errorf("generating local cloud-init data failed: %v", err) + } + } + return nil +} + +func (l *LibvirtDomainManager) generateCloudInitISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain) error { + return l.generateSomeCloudInitISO(vmi, domPtr, 0) +} + +func (l *LibvirtDomainManager) generateCloudInitEmptyISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain) error { + if l.cloudInitDataStore == nil { + return nil + } + for _, vs := range vmi.Status.VolumeStatus { + if vs.Name == l.cloudInitDataStore.VolumeName { + return l.generateSomeCloudInitISO(vmi, domPtr, vs.Size) + } + } + return fmt.Errorf("failed to find the status of volume %s", l.cloudInitDataStore.VolumeName) +} + +// All local environment setup that needs to occur before VirtualMachineInstance starts +// can be done in this function. This includes things like... +// +// - storage prep +// - network prep +// - cloud-init +// - sysprep +// +// The Domain.Spec can be alterned in this function and any changes +// made to the domain will get set in libvirt after this function exits. +func (l *LibvirtDomainManager) preStartHook(vmi *v1.VirtualMachineInstance, domain *api.Domain, generateEmptyIsos bool, options *cmdv1.VirtualMachineOptions) (*api.Domain, error) { + logger := log.Log.Object(vmi) + + logger.Info("Executing PreStartHook on VMI pod environment") + + // generate cloud-init data + cloudInitData, err := cloudinit.ReadCloudInitVolumeDataSource(vmi, config.SecretSourceDir) + if err != nil { + return domain, fmt.Errorf("ReadCloudInitVolumeDataSource failed: %v", err) + } + + // Pass cloud-init data to PreCloudInitIso hook + logger.Info("Starting PreCloudInitIso hook") + hooksManager := hooks.GetManager() + cloudInitData, err = hooksManager.PreCloudInitIso(vmi, cloudInitData) + if err != nil { + return domain, fmt.Errorf("PreCloudInitIso hook failed: %v", err) + } + + if cloudInitData != nil { + // need to prepare the local path for cloud-init in advance for proper + // detection of the disk driver cache mode + if err := cloudinit.PrepareLocalPath(vmi.Name, vmi.Namespace); err != nil { + return domain, fmt.Errorf("PrepareLocalPath failed: %v", err) + } + // store the generated cloud init metadata. + // cloud init ISO will be generated after the domain definition + l.cloudInitDataStore = cloudInitData + } + + // generate ignition data + ignitionData := ignition.GetIgnitionSource(vmi) + if ignitionData != "" { + + err := ignition.GenerateIgnitionLocalData(vmi, vmi.Namespace) + if err != nil { + return domain, err + } + } + + nonAbsentIfaces := netvmispec.FilterInterfacesSpec(vmi.Spec.Domain.Devices.Interfaces, func(iface v1.Interface) bool { + return iface.State != v1.InterfaceStateAbsent + }) + nonAbsentNets := netvmispec.FilterNetworksByInterfaces(vmi.Spec.Networks, nonAbsentIfaces) + var interfaceDomainAttachments map[string]string + if options != nil { + interfaceDomainAttachments = options.GetInterfaceDomainAttachment() + } + err = netsetup.NewVMNetworkConfigurator(vmi, cache.CacheCreator{}, netsetup.WithDomainAttachments(interfaceDomainAttachments)).SetupPodNetworkPhase2(domain, nonAbsentNets) + if err != nil { + return domain, fmt.Errorf("preparing the pod network failed: %v", err) + } + + // Create ephemeral disk for container disks + err = containerdisk.CreateEphemeralImages(vmi, l.ephemeralDiskCreator, l.disksInfo) + if err != nil { + return domain, fmt.Errorf("preparing ephemeral container disk images failed: %v", err) + } + // Create images for volumes that are marked ephemeral. + err = l.ephemeralDiskCreator.CreateEphemeralImages(vmi, domain) + if err != nil { + return domain, fmt.Errorf("preparing ephemeral images failed: %v", err) + } + // create empty disks if they exist + if err := emptydisk.NewEmptyDiskCreator().CreateTemporaryDisks(vmi); err != nil { + return domain, fmt.Errorf("creating empty disks failed: %v", err) + } + // create ConfigMap disks if they exists + if err := config.CreateConfigMapDisks(vmi, generateEmptyIsos); err != nil { + return domain, fmt.Errorf("creating config map disks failed: %v", err) + } + // create Secret disks if they exists + if err := config.CreateSecretDisks(vmi, generateEmptyIsos); err != nil { + return domain, fmt.Errorf("creating secret disks failed: %v", err) + } + + // create Sysprep disks if they exists + if err := config.CreateSysprepDisks(vmi, generateEmptyIsos); err != nil { + return domain, fmt.Errorf("creating sysprep disks failed: %v", err) + } + + // create DownwardAPI disks if they exists + if err := config.CreateDownwardAPIDisks(vmi, generateEmptyIsos); err != nil { + return domain, fmt.Errorf("creating DownwardAPI disks failed: %v", err) + } + // create ServiceAccount disk if exists + if err := config.CreateServiceAccountDisk(vmi, generateEmptyIsos); err != nil { + return domain, fmt.Errorf("creating service account disk failed: %v", err) + } + // create downwardMetric disk if exists + if err := downwardmetrics.CreateDownwardMetricDisk(vmi); err != nil { + return domain, fmt.Errorf("failed to craete downwardMetric disk: %v", err) + } + + // set drivers cache mode + for i := range domain.Spec.Devices.Disks { + err := converter.SetDriverCacheMode(&domain.Spec.Devices.Disks[i], l.directIOChecker) + if err != nil { + return domain, err + } + converter.SetOptimalIOMode(&domain.Spec.Devices.Disks[i]) + } + + if err := l.credManager.HandleQemuAgentAccessCredentials(vmi); err != nil { + return domain, fmt.Errorf("Starting qemu agent access credential propagation failed: %v", err) + } + + // expand disk image files if they're too small + expandDiskImagesOffline(vmi, domain) + + return domain, err +} + +func expandDiskImagesOffline(vmi *v1.VirtualMachineInstance, domain *api.Domain) { + logger := log.Log.Object(vmi) + for _, disk := range domain.Spec.Devices.Disks { + if shouldExpandOffline(disk) { + possibleGuestSize, ok := possibleGuestSize(disk) + if !ok { + logger.Errorf("Failed to get possible guest size from disk") + break + } + err := expandDiskImageOffline(getSourceFile(disk), possibleGuestSize) + if err != nil { + logger.Reason(err).Errorf("failed to expand disk image %v at boot", disk) + } + } + } +} + +func expandDiskImageOffline(imagePath string, size int64) error { + log.Log.Infof("pre-start expansion of image %s to size %d", imagePath, size) + var preallocateFlag string + if converter.IsPreAllocated(imagePath) { + preallocateFlag = "--preallocation=falloc" + } else { + preallocateFlag = "--preallocation=off" + } + size = kutil.AlignImageSizeTo1MiB(size, log.Log.With("image", imagePath)) + if size == 0 { + return fmt.Errorf("%s must be at least 1MiB", imagePath) + } + cmd := exec.Command("/usr/bin/qemu-img", "resize", preallocateFlag, imagePath, strconv.FormatInt(size, 10)) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("expanding image failed with error: %v, output: %s", err, out) + } + return nil +} + +func possibleGuestSize(disk api.Disk) (int64, bool) { + if disk.Capacity == nil { + log.DefaultLogger().Error("No disk capacity") + return 0, false + } + if disk.FilesystemOverhead == nil { + log.DefaultLogger().Errorf("No filesystem overhead found for disk %v", disk) + return 0, false + } + + filesystemOverhead, err := strconv.ParseFloat(string(*disk.FilesystemOverhead), 64) + if err != nil { + log.DefaultLogger().Reason(err).Error("Failed to parse filesystem overhead as float") + return 0, false + } + if filesystemOverhead < 0 || filesystemOverhead > 1 { + log.DefaultLogger().Errorf("Invalid filesystem overhead %f (must be between 0 and 1)", filesystemOverhead) + return 0, false + } + + preferredSize := *disk.Capacity + if isBlock := disk.Source.Dev != ""; !isBlock { + usableSize, err := getUsableDiskSize(getSourceFile(disk)) + if err != nil { + log.DefaultLogger().Reason(err).Error("Failed to get total usable space, using disk capacity instead") + usableSize = preferredSize + } + preferredSize = min(usableSize, preferredSize) + } + + size := int64((1 - filesystemOverhead) * float64(preferredSize)) + size = kutil.AlignImageSizeTo1MiB(size, log.DefaultLogger()) + if size == 0 { + return 0, false + } + return size, true +} + +func getUsableDiskSize(path string) (int64, error) { + var statfs syscall.Statfs_t + err := syscall.Statfs(path, &statfs) + if err != nil { + return int64(-1), err + } + + availableSize := int64(statfs.Bavail) * int64(statfs.Bsize) + diskInfo, err := osdisk.GetDiskInfo(path) + if err != nil { + return int64(-1), err + } + usableSize := diskInfo.ActualSize + availableSize + + return usableSize, nil +} + +func shouldExpandOffline(disk api.Disk) bool { + if !disk.ExpandDisksEnabled { + return false + } + if disk.Source.Dev != "" { + // Block devices don't need to be expanded + return false + } + diskInfo, err := osdisk.GetDiskInfo(getSourceFile(disk)) + if err != nil { + log.DefaultLogger().Reason(err).Warning("Failed to get image info") + return false + } + possibleGuestSize, ok := possibleGuestSize(disk) + if !ok || possibleGuestSize <= diskInfo.VirtualSize { + return false + } + return true +} + +func (l *LibvirtDomainManager) generateConverterContext(vmi *v1.VirtualMachineInstance, allowEmulation bool, options *cmdv1.VirtualMachineOptions, isMigrationTarget bool) (*converter.ConverterContext, error) { + + logger := log.Log.Object(vmi) + + podCPUSet, err := l.cpuSetGetter() + if err != nil { + logger.Reason(err).Error("failed to read pod cpuset.") + return nil, fmt.Errorf("failed to read pod cpuset: %v", err) + } + + hotplugVolumes := make(map[string]v1.VolumeStatus) + permanentVolumes := make(map[string]v1.VolumeStatus) + for _, status := range vmi.Status.VolumeStatus { + if status.HotplugVolume != nil { + hotplugVolumes[status.Name] = status + } else { + permanentVolumes[status.Name] = status + } + } + + // Check if PVC volumes are block volumes + isBlockPVCMap := make(map[string]bool) + isBlockDVMap := make(map[string]bool) + for diskIndex, volume := range vmi.Spec.Volumes { + if volume.VolumeSource.PersistentVolumeClaim != nil || volume.VolumeSource.Ephemeral != nil { + isBlockPVC := false + if _, ok := hotplugVolumes[volume.Name]; ok { + isBlockPVC = isHotplugBlockDeviceVolume(volume.Name) + } else { + isBlockPVC, _ = isBlockDeviceVolume(volume.Name) + } + isBlockPVCMap[volume.Name] = isBlockPVC + } else if volume.VolumeSource.DataVolume != nil { + isBlockDV := false + if _, ok := hotplugVolumes[volume.Name]; ok { + isBlockDV = isHotplugBlockDeviceVolume(volume.Name) + } else { + isBlockDV, _ = isBlockDeviceVolume(volume.Name) + } + isBlockDVMap[volume.Name] = isBlockDV + } + + _, existInCache := l.disksInfo[volume.Name] + if volume.ContainerDisk != nil && !existInCache { + info, err := osdisk.GetDiskInfoWithValidation(containerdisk.GetDiskTargetPathFromLauncherView(diskIndex), l.diskMemoryLimitBytes) + if err != nil { + return nil, fmt.Errorf("failed to get container disk info: %v", err) + } + if err := osdisk.VerifyImage(info); err != nil { + return nil, fmt.Errorf("invalid image in containerDisk %v: %v", volume.Name, err) + } + l.disksInfo[volume.Name] = info + } + } + + var efiConf *converter.EFIConfiguration + if vmi.IsBootloaderEFI() { + secureBoot := vmi.Spec.Domain.Firmware.Bootloader.EFI.SecureBoot == nil || *vmi.Spec.Domain.Firmware.Bootloader.EFI.SecureBoot + sev := kutil.IsSEVVMI(vmi) + + if !l.efiEnvironment.Bootable(secureBoot, sev) { + log.Log.Errorf("EFI OVMF roms missing for booting in EFI mode with SecureBoot=%v, SEV=%v", secureBoot, sev) + return nil, fmt.Errorf("EFI OVMF roms missing for booting in EFI mode with SecureBoot=%v, SEV=%v", secureBoot, sev) + } + + efiConf = &converter.EFIConfiguration{ + EFICode: l.efiEnvironment.EFICode(secureBoot, sev), + EFIVars: l.efiEnvironment.EFIVars(secureBoot, sev), + SecureLoader: secureBoot, + } + } + + // Map the VirtualMachineInstance to the Domain + c := &converter.ConverterContext{ + Architecture: arch.NewConverter(runtime.GOARCH), + VirtualMachine: vmi, + AllowEmulation: allowEmulation, + CPUSet: podCPUSet, + IsBlockPVC: isBlockPVCMap, + IsBlockDV: isBlockDVMap, + EFIConfiguration: efiConf, + UseVirtioTransitional: vmi.Spec.Domain.Devices.UseVirtioTransitional != nil && *vmi.Spec.Domain.Devices.UseVirtioTransitional, + PermanentVolumes: permanentVolumes, + EphemeraldiskCreator: l.ephemeralDiskCreator, + UseLaunchSecurity: kutil.IsSEVVMI(vmi), + FreePageReporting: isFreePageReportingEnabled(false, vmi), + SerialConsoleLog: isSerialConsoleLogEnabled(false, vmi), + } + + if options != nil { + c.ExpandDisksEnabled = options.ExpandDisksEnabled + if options.VirtualMachineSMBios != nil { + c.SMBios = options.VirtualMachineSMBios + } + if options.Topology != nil { + c.Topology = options.Topology + } + c.MemBalloonStatsPeriod = uint(options.MemBalloonStatsPeriod) + // Add preallocated and thick-provisioned volumes for which we need to avoid the discard=unmap option + c.VolumesDiscardIgnore = options.PreallocatedVolumes + + if options.GetClusterConfig() != nil { + c.ExpandDisksEnabled = options.GetClusterConfig().GetExpandDisksEnabled() + c.FreePageReporting = isFreePageReportingEnabled(options.GetClusterConfig().GetFreePageReportingDisabled(), vmi) + c.BochsForEFIGuests = options.GetClusterConfig().GetBochsDisplayForEFIGuests() + c.SerialConsoleLog = isSerialConsoleLogEnabled(options.GetClusterConfig().GetSerialConsoleLogDisabled(), vmi) + } + + c.DomainAttachmentByInterfaceName = options.GetInterfaceDomainAttachment() + } + c.DisksInfo = l.disksInfo + + if !isMigrationTarget { + sriovDevices, err := sriov.CreateHostDevices(vmi) + if err != nil { + return nil, err + } + + c.HotplugVolumes = hotplugVolumes + c.SRIOVDevices = sriovDevices + + genericHostDevices, err := generic.CreateHostDevices(vmi.Spec.Domain.Devices.HostDevices) + if err != nil { + return nil, err + } + c.GenericHostDevices = genericHostDevices + + gpuHostDevices, err := gpu.CreateHostDevices(vmi.Spec.Domain.Devices.GPUs) + if err != nil { + return nil, err + } + c.GPUHostDevices = gpuHostDevices + } + + return c, nil +} + +func isFreePageReportingEnabled(clusterFreePageReportingDisabled bool, vmi *v1.VirtualMachineInstance) bool { + if clusterFreePageReportingDisabled || + (vmi.Spec.Domain.Devices.AutoattachMemBalloon != nil && *vmi.Spec.Domain.Devices.AutoattachMemBalloon == false) || + vmi.IsHighPerformanceVMI() || + vmi.GetAnnotations()[v1.FreePageReportingDisabledAnnotation] == "true" { + return false + } + + return true +} + +func isSerialConsoleLogEnabled(clusterSerialConsoleLogDisabled bool, vmi *v1.VirtualMachineInstance) bool { + return (vmi.Spec.Domain.Devices.LogSerialConsole != nil && *vmi.Spec.Domain.Devices.LogSerialConsole) || (vmi.Spec.Domain.Devices.LogSerialConsole == nil && !clusterSerialConsoleLogDisabled) +} + +func (l *LibvirtDomainManager) SyncVMI(vmi *v1.VirtualMachineInstance, allowEmulation bool, options *cmdv1.VirtualMachineOptions) (*api.DomainSpec, error) { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + logger := log.Log.Object(vmi) + + domain := &api.Domain{} + + if l.imageVolumeFeatureGateEnabled { + err := l.linkImageVolumeFilePaths(vmi) + if err != nil { + logger.Reason(err).Error("failed link ImageVolumeFilePaths") + return nil, err + } + } + + c, err := l.generateConverterContext(vmi, allowEmulation, options, false) + if err != nil { + logger.Reason(err).Error("failed to generate libvirt domain from VMI spec") + return nil, err + } + + if err := converter.Convert_v1_VirtualMachineInstance_To_api_Domain(vmi, domain, c); err != nil { + logger.Error("Conversion failed.") + return nil, err + } + + // Set defaults which are not coming from the cluster + api.NewDefaulter(c.Architecture.GetArchitecture()).SetObjectDefaults_Domain(domain) + + dom, err := l.lookupOrCreateVirDomain(domain, vmi, options) + if err != nil { + return nil, err + } + defer dom.Free() + domState, _, err := dom.GetState() + if err != nil { + logger.Reason(err).Error(failedGetDomainState) + return nil, err + } + + // TODO Suspend, Pause, ..., for now we only support reaching the running state + // TODO for migration and error detection we also need the state change reason + // TODO blocked state + switch { + case cli.IsDown(domState) && !vmi.IsRunning() && !vmi.IsFinal(): + if err := l.startDomain(vmi, dom); err != nil { + return nil, err + } + case cli.IsPaused(domState) && !l.paused.contains(vmi.UID): + // TODO: if state change reason indicates a system error, we could try something smarter + if err := dom.Resume(); err != nil { + logger.Reason(err).Error("unpausing the VirtualMachineInstance failed.") + return nil, err + } + logger.Info("Domain unpaused.") + } + + oldSpec, err := getDomainSpec(dom) + if err != nil { + logger.Reason(err).Error("Parsing domain XML failed.") + return nil, err + } + + if err := l.syncDiskHotplug(domain, oldSpec, dom, vmi); err != nil { + return nil, err + } + + if err := l.syncNetwork(domain, oldSpec, dom, vmi, options); err != nil { + return nil, err + } + + // TODO: check if VirtualMachineInstance Spec and Domain Spec are equal or if we have to sync + return oldSpec, nil +} + +func (l *LibvirtDomainManager) syncDiskHotplug( + domain *api.Domain, + spec *api.DomainSpec, + dom cli.VirDomain, + vmi *v1.VirtualMachineInstance, +) error { + logger := log.Log.Object(vmi) + + // Look up all the disks to detach + for _, detachDisk := range getDetachedDisks(spec.Devices.Disks, domain.Spec.Devices.Disks) { + logger.V(1).Infof("Detaching disk %s, target %s", detachDisk.Alias.GetName(), detachDisk.Target.Device) + detachBytes, err := xml.Marshal(detachDisk) + if err != nil { + logger.Reason(err).Error("marshalling detached disk failed") + return err + } + err = dom.DetachDeviceFlags(strings.ToLower(string(detachBytes)), affectDeviceLiveAndConfigLibvirtFlags) + if err != nil { + logger.Reason(err).Error("detaching device") + return err + } + } + // Look up all the disks to attach + for _, attachDisk := range getAttachedDisks(spec.Devices.Disks, domain.Spec.Devices.Disks) { + allowAttach, err := checkIfDiskReadyToUse(getSourceFile(attachDisk)) + if err != nil { + return err + } + if !allowAttach { + continue + } + logger.V(1).Infof("Attaching disk %s, target %s", attachDisk.Alias.GetName(), attachDisk.Target.Device) + // set drivers cache mode + err = converter.SetDriverCacheMode(&attachDisk, l.directIOChecker) + if err != nil { + return err + } + err = converter.SetOptimalIOMode(&attachDisk) + if err != nil { + return err + } + + attachBytes, err := xml.Marshal(attachDisk) + if err != nil { + logger.Reason(err).Error("marshalling attached disk failed") + return err + } + err = dom.AttachDeviceFlags(strings.ToLower(string(attachBytes)), affectDeviceLiveAndConfigLibvirtFlags) + if err != nil { + logger.Reason(err).Error("attaching device") + return err + } + } + + // Resize and notify the VM about changed disks + for _, disk := range domain.Spec.Devices.Disks { + if shouldExpandOnline(dom, disk) { + possibleGuestSize, ok := possibleGuestSize(disk) + if !ok { + logger.Warningf("Failed to get possible guest size from disk %v", disk) + break + } + err := dom.BlockResize(getSourceFile(disk), uint64(possibleGuestSize), libvirt.DOMAIN_BLOCK_RESIZE_BYTES) + if err != nil { + logger.Reason(err).Errorf("libvirt failed to expand disk image %v", disk) + } + } + } + + return nil +} + +func (l *LibvirtDomainManager) syncNetwork( + domain *api.Domain, + oldSpec *api.DomainSpec, + dom cli.VirDomain, + vmi *v1.VirtualMachineInstance, + options *cmdv1.VirtualMachineOptions, +) error { + if !vmi.IsRunning() { + return nil + } + var domainAttachments map[string]string + if options != nil { + domainAttachments = options.GetInterfaceDomainAttachment() + } + + networkConfigurator := netsetup.NewVMNetworkConfigurator(vmi, cache.CacheCreator{}, netsetup.WithDomainAttachments(domainAttachments)) + networkInterfaceManager := newVirtIOInterfaceManager(dom, networkConfigurator) + if err := networkInterfaceManager.hotplugVirtioInterface(vmi, &api.Domain{Spec: *oldSpec}, domain); err != nil { + return err + } + if err := networkInterfaceManager.hotUnplugVirtioInterface(vmi, &api.Domain{Spec: *oldSpec}); err != nil { + return err + } + if err := networkInterfaceManager.updateDomainLinkState(&api.Domain{Spec: *oldSpec}, domain); err != nil { + return err + } + + return nil +} + +func (l *LibvirtDomainManager) startDomain( + vmi *v1.VirtualMachineInstance, + dom cli.VirDomain, +) error { + logger := log.Log.Object(vmi) + if err := l.generateCloudInitISO(vmi, &dom); err != nil { + return err + } + + createFlags := getDomainCreateFlags(vmi) + if err := dom.CreateWithFlags(createFlags); err != nil { + logger.Reason(err). + Errorf("Failed to start VirtualMachineInstance with flags %v.", createFlags) + return err + } + + logger.Info("Domain started.") + if vmi.ShouldStartPaused() { + l.paused.add(vmi.UID) + } + return nil +} + +func (l *LibvirtDomainManager) lookupOrCreateVirDomain( + domain *api.Domain, + vmi *v1.VirtualMachineInstance, + options *cmdv1.VirtualMachineOptions, +) (cli.VirDomain, error) { + logger := log.Log.Object(vmi) + + dom, err := l.virConn.LookupDomainByName(domain.Spec.Name) + if err == nil { + return dom, nil + } + + if !domainerrors.IsNotFound(err) { + logger.Reason(err).Error(failedGetDomain) + return nil, err + } + + // We need the domain but it does not exist, so create it + if _, err = l.preStartHook(vmi, domain, false, options); err != nil { + logger.Reason(err).Error("pre start setup for VirtualMachineInstance failed.") + return nil, err + } + + setDomainFn := func(v *v1.VirtualMachineInstance, s *api.DomainSpec) (cli.VirDomain, error) { + return l.setDomainSpecWithHooks(v, s) + } + + if dom, err = withNetworkIfacesResources(vmi, &domain.Spec, setDomainFn); err != nil { + return nil, err + } + + l.metadataCache.UID.Set(vmi.UID) + l.metadataCache.GracePeriod.Set( + api.GracePeriodMetadata{DeletionGracePeriodSeconds: converter.GracePeriodSeconds(vmi)}, + ) + logger.Info("Domain defined.") + return dom, err +} + +func getSourceFile(disk api.Disk) string { + file := disk.Source.File + if disk.Source.File == "" { + file = disk.Source.Dev + } + return file +} + +var checkIfDiskReadyToUse = checkIfDiskReadyToUseFunc + +func checkIfDiskReadyToUseFunc(filename string) (bool, error) { + info, err := os.Stat(filename) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return false, nil + } + log.DefaultLogger().V(1).Infof("stat error: %v", err) + return false, err + } + if (info.Mode() & os.ModeDevice) != 0 { + file, err := os.OpenFile(filename, os.O_RDONLY, 0600) + if err != nil { + log.DefaultLogger().V(1).Infof("Unable to open file: %v", err) + return false, nil + } + if err := file.Close(); err != nil { + return false, fmt.Errorf("Unable to close file: %s", file.Name()) + } + return true, nil + } + // Before attempting to attach, ensure we can open the file + file, err := os.OpenFile(filename, os.O_RDWR, 0600) + if err != nil { + return false, nil + } + if err := file.Close(); err != nil { + return false, fmt.Errorf("Unable to close file: %s", file.Name()) + } + return true, nil +} + +func isHotplugDisk(disk api.Disk) bool { + return strings.HasPrefix(getSourceFile(disk), v1.HotplugDiskDir) +} + +func getDetachedDisks(oldDisks, newDisks []api.Disk) []api.Disk { + newDiskMap := make(map[string]api.Disk) + for _, disk := range newDisks { + file := getSourceFile(disk) + if file != "" { + newDiskMap[file] = disk + } + } + res := make([]api.Disk, 0) + for _, oldDisk := range oldDisks { + if !isHotplugDisk(oldDisk) { + continue + } + if _, ok := newDiskMap[getSourceFile(oldDisk)]; !ok { + // This disk got detached, add it to the list + res = append(res, oldDisk) + } + } + return res +} + +func getAttachedDisks(oldDisks, newDisks []api.Disk) []api.Disk { + oldDiskMap := make(map[string]api.Disk) + for _, disk := range oldDisks { + file := getSourceFile(disk) + if file != "" { + oldDiskMap[file] = disk + } + } + res := make([]api.Disk, 0) + for _, newDisk := range newDisks { + if !isHotplugDisk(newDisk) { + continue + } + if _, ok := oldDiskMap[getSourceFile(newDisk)]; !ok { + // This disk got attached, add it to the list + res = append(res, newDisk) + } + } + return res +} + +var isHotplugBlockDeviceVolume = isHotplugBlockDeviceVolumeFunc + +func isHotplugBlockDeviceVolumeFunc(volumeName string) bool { + path := converter.GetHotplugBlockDeviceVolumePath(volumeName) + fileInfo, err := os.Stat(path) + if err == nil { + if (fileInfo.Mode() & os.ModeDevice) != 0 { + return true + } + return false + } + return false +} + +var isBlockDeviceVolume = isBlockDeviceVolumeFunc + +func isBlockDeviceVolumeFunc(volumeName string) (bool, error) { + path := converter.GetBlockDeviceVolumePath(volumeName) + fileInfo, err := os.Stat(path) + if err == nil { + if (fileInfo.Mode() & os.ModeDevice) != 0 { + return true, nil + } + return false, fmt.Errorf("found %v, but it's not a block device", path) + } + if errors.Is(err, os.ErrNotExist) { + // cross check: is it a filesystem volume + path = converter.GetFilesystemVolumePath(volumeName) + fileInfo, err := os.Stat(path) + if err == nil { + if fileInfo.Mode().IsRegular() { + return false, nil + } + return false, fmt.Errorf("found %v, but it's not a regular file", path) + } + if errors.Is(err, os.ErrNotExist) { + return false, fmt.Errorf("neither found block device nor regular file for volume %v", volumeName) + } + } + return false, fmt.Errorf("error checking for block device: %v", err) +} + +func shouldExpandOnline(dom cli.VirDomain, disk api.Disk) bool { + if !disk.ExpandDisksEnabled { + log.DefaultLogger().V(3).Infof("Not expanding disks, ExpandDisks featuregate disabled") + return false + } + blockInfo, err := dom.GetBlockInfo(getSourceFile(disk), 0) + if err != nil { + log.DefaultLogger().Reason(err).Error("Failed to get block info") + return false + } + guestSize := blockInfo.Capacity + possibleGuestSize, ok := possibleGuestSize(disk) + if !ok || possibleGuestSize <= int64(guestSize) { + return false + } + return true +} + +func (l *LibvirtDomainManager) getDomainSpec(dom cli.VirDomain) (*api.DomainSpec, error) { + domainSpec, err := util.GetDomainSpecWithRuntimeInfo(dom) + if err != nil { + // Return without runtime info only for cases we know for sure it's not supposed to be there + if domainerrors.IsNotFound(err) || domainerrors.IsInvalidOperation(err) { + state, _, err := dom.GetState() + if err != nil { + return nil, err + } + return util.GetDomainSpec(state, dom) + } + } + + return domainSpec, err +} + +func removePreviousMemoryDump(dir string) { + files, err := os.ReadDir(dir) + if err != nil { + log.Log.Reason(err).Errorf("failed to remove older memory dumps") + return + } + for _, file := range files { + if strings.Contains(file.Name(), "memory.dump") { + err = os.Remove(filepath.Join(dir, file.Name())) + if err != nil { + log.Log.Reason(err).Errorf("failed to remove older memory dumps") + } + } + } +} + +func (l *LibvirtDomainManager) MemoryDump(vmi *v1.VirtualMachineInstance, dumpPath string) error { + select { + case l.memoryDumpInProgress <- struct{}{}: + default: + log.Log.Object(vmi).Infof("memory-dump is in progress") + return nil + } + + go func() { + defer func() { <-l.memoryDumpInProgress }() + if err := l.memoryDump(vmi, dumpPath); err != nil { + log.Log.Object(vmi).Reason(err).Error(failedDomainMemoryDump) + } + }() + return nil +} + +func (l *LibvirtDomainManager) memoryDump(vmi *v1.VirtualMachineInstance, dumpPath string) error { + logger := log.Log.Object(vmi) + + if l.shouldSkipMemoryDump(dumpPath) { + return nil + } + l.initializeMemoryDumpMetadata(dumpPath) + + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if dom == nil || err != nil { + return err + } + defer dom.Free() + // keep trying to do memory dump even if remove previous one failed + removePreviousMemoryDump(filepath.Dir(dumpPath)) + + logger.Infof("Starting memory dump") + failed := false + reason := "" + err = dom.CoreDumpWithFormat(dumpPath, libvirt.DOMAIN_CORE_DUMP_FORMAT_RAW, libvirt.DUMP_MEMORY_ONLY) + if err != nil { + failed = true + reason = fmt.Sprintf("%s: %s", failedDomainMemoryDump, err) + } else { + logger.Infof("Completed memory dump successfully") + } + + l.setMemoryDumpResult(failed, reason) + return err +} + +func (l *LibvirtDomainManager) shouldSkipMemoryDump(dumpPath string) bool { + memoryDumpMetadata, _ := l.metadataCache.MemoryDump.Load() + if memoryDumpMetadata.FileName == filepath.Base(dumpPath) { + // memory dump still in progress or have just completed + // no need to trigger another one + return true + } + return false +} + +func (l *LibvirtDomainManager) initializeMemoryDumpMetadata(dumpPath string) { + l.metadataCache.MemoryDump.WithSafeBlock(func(memoryDumpMetadata *api.MemoryDumpMetadata, initialized bool) { + now := metav1.Now() + *memoryDumpMetadata = api.MemoryDumpMetadata{ + FileName: filepath.Base(dumpPath), + StartTimestamp: &now, + } + }) + log.Log.V(4).Infof("initialize memory dump metadata: %s", l.metadataCache.MemoryDump.String()) +} + +func (l *LibvirtDomainManager) setMemoryDumpResult(failed bool, reason string) { + l.metadataCache.MemoryDump.WithSafeBlock(func(memoryDumpMetadata *api.MemoryDumpMetadata, initialized bool) { + if !initialized { + // nothing to report if memory dump metadata is empty + return + } + + now := metav1.Now() + memoryDumpMetadata.Completed = true + memoryDumpMetadata.EndTimestamp = &now + memoryDumpMetadata.Failed = failed + memoryDumpMetadata.FailureReason = reason + }) + log.Log.V(4).Infof("set memory dump results in metadata: %s", l.metadataCache.MemoryDump.String()) + return +} + +func (l *LibvirtDomainManager) PauseVMI(vmi *v1.VirtualMachineInstance) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + logger := log.Log.Object(vmi) + + domName := util.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + // If the VirtualMachineInstance does not exist, we are done + if domainerrors.IsNotFound(err) { + return fmt.Errorf("Domain not found.") + } else { + logger.Reason(err).Error("Getting the domain failed during pause.") + return err + } + } + defer dom.Free() + + domState, _, err := dom.GetState() + if err != nil { + logger.Reason(err).Error(failedGetDomainState) + return err + } + + if domState == libvirt.DOMAIN_RUNNING { + err = dom.Suspend() + if err != nil { + logger.Reason(err).Error("Signalling suspension failed.") + return err + } + logger.Infof("Signaled pause for %s", vmi.GetObjectMeta().GetName()) + l.paused.add(vmi.UID) + } else { + logger.Infof("Domain is not running for %s", vmi.GetObjectMeta().GetName()) + } + + return nil +} + +func (l *LibvirtDomainManager) UnpauseVMI(vmi *v1.VirtualMachineInstance) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + logger := log.Log.Object(vmi) + + domName := util.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + // If the VirtualMachineInstance does not exist, we are done + if domainerrors.IsNotFound(err) { + return fmt.Errorf("Domain not found.") + } else { + logger.Reason(err).Error("Getting the domain failed during unpause.") + return err + } + } + defer dom.Free() + + domState, _, err := dom.GetState() + if err != nil { + logger.Reason(err).Error(failedGetDomainState) + return err + } + + if domState == libvirt.DOMAIN_PAUSED { + err = dom.Resume() + if err != nil { + logger.Reason(err).Error("Signalling unpause failed.") + return err + } + logger.Infof("Signaled unpause for %s", vmi.GetObjectMeta().GetName()) + l.paused.remove(vmi.UID) + // Try to set guest time after this commands execution. + // This operation is not disruptive. + if err := l.setGuestTime(vmi); err != nil { + return err + } + + } else { + logger.Infof("Domain is not paused for %s", vmi.GetObjectMeta().GetName()) + } + + return nil +} + +func (l *LibvirtDomainManager) migrationInProgress() bool { + migrationMetadata, exists := l.metadataCache.Migration.Load() + return exists && migrationMetadata.StartTimestamp != nil && migrationMetadata.EndTimestamp == nil +} + +func (l *LibvirtDomainManager) scheduleSafetyVMIUnfreeze(vmi *v1.VirtualMachineInstance, unfreezeTimeout time.Duration) { + select { + case <-time.After(unfreezeTimeout): + log.Log.Warningf("Unfreeze was not called for vmi %s for more then %v, initiating unfreeze", + vmi.Name, unfreezeTimeout) + l.UnfreezeVMI(vmi) + case <-l.cancelSafetyUnfreezeChan: + log.Log.V(3).Infof("Canceling schedualed Unfreeze for vmi %s", vmi.Name) + // aborted + } +} + +func (l *LibvirtDomainManager) cancelSafetyUnfreeze() { + select { + case l.cancelSafetyUnfreezeChan <- struct{}{}: + default: + } +} + +func (l *LibvirtDomainManager) getParsedFSStatus(domainName string) (string, error) { + cmdResult, err := l.virConn.QemuAgentCommand(`{"execute":"`+string(agentpoller.GetFSFreezeStatus)+`"}`, domainName) + if err != nil { + return "", err + } + fsfreezeStatus, err := agentpoller.ParseFSFreezeStatus(cmdResult) + if err != nil { + return "", err + } + + return fsfreezeStatus.Status, nil +} + +func (l *LibvirtDomainManager) FreezeVMI(vmi *v1.VirtualMachineInstance, unfreezeTimeoutSeconds int32) error { + if l.migrationInProgress() { + return fmt.Errorf("Failed to freeze VMI, VMI is currently during migration") + } + domainName := api.VMINamespaceKeyFunc(vmi) + safetyUnfreezeTimeout := time.Duration(unfreezeTimeoutSeconds) * time.Second + + fsfreezeStatus, err := l.getParsedFSStatus(domainName) + if err != nil { + log.Log.Errorf("Failed to get fs status before freeze vmi %s, %s", vmi.Name, err.Error()) + return err + } + + // idempotent - prevent failure in case fs is already frozen + if fsfreezeStatus == api.FSFrozen { + return nil + } + + // The fsfreeze doesn't apply to the TPM, so we can at least do a fsync to the state + // directory to ensure data integrity. This explicit sync ensures that pending + // writes to the swtpm backing files are flushed to disk. + if tpm.HasPersistentDevice(&vmi.Spec) { + cmd := exec.Command("/usr/bin/sync", services.PathForSwtpm(vmi)) + out, err := cmd.CombinedOutput() + if err != nil { + log.Log.Errorf("fsync error to TPM state directory: %s, output: %s", err.Error(), out) + return err + } + } + + domain, err := l.virConn.LookupDomainByName(domainName) + if err != nil { + log.Log.Errorf("Domain lookup failed: %v", err) + return err + } + defer domain.Free() + + if err := domain.FSFreeze(nil, 0); err != nil { + log.Log.Errorf("Failed to freeze vmi, %s", err.Error()) + return err + } + + l.cancelSafetyUnfreeze() + if safetyUnfreezeTimeout != 0 { + go l.scheduleSafetyVMIUnfreeze(vmi, safetyUnfreezeTimeout) + } + return nil +} + +func (l *LibvirtDomainManager) UnfreezeVMI(vmi *v1.VirtualMachineInstance) error { + l.cancelSafetyUnfreeze() + domainName := api.VMINamespaceKeyFunc(vmi) + fsfreezeStatus, err := l.getParsedFSStatus(domainName) + if err == nil { + // prevent initating fs thaw to prevent rerunning the thaw hook + if fsfreezeStatus == api.FSThawed { + return nil + } + } + + domain, err := l.virConn.LookupDomainByName(domainName) + if err != nil { + log.Log.Errorf("Domain lookup failed: %v", err) + return err + } + defer domain.Free() + + if err := domain.FSThaw(nil, 0); err != nil { + log.Log.Errorf("Failed to unfreeze vmi, %s", err.Error()) + return err + } + return nil +} + +func (l *LibvirtDomainManager) ResetVMI(vmi *v1.VirtualMachineInstance) error { + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + log.Log.Object(vmi).Reason(err).Error("Getting the domain for reset failed.") + return err + } + + defer dom.Free() + if err = dom.Reset(0); err != nil { + log.Log.Object(vmi).Reason(err).Error("Resetting the domain failed.") + return err + } + + return nil +} + +func (l *LibvirtDomainManager) SoftRebootVMI(vmi *v1.VirtualMachineInstance) error { + domainRebootFlagValues := libvirt.DOMAIN_REBOOT_GUEST_AGENT + condManager := controller.NewVirtualMachineInstanceConditionManager() + if !condManager.HasConditionWithStatus(vmi, v1.VirtualMachineInstanceAgentConnected, k8sv1.ConditionTrue) { + if features := vmi.Spec.Domain.Features; features != nil && features.ACPI.Enabled != nil && !(*features.ACPI.Enabled) { + err := fmt.Errorf("VMI neither have the agent connected nor the ACPI feature enabled") + log.Log.Object(vmi).Reason(err).Error("Setting the domain reboot flag failed.") + return err + } + domainRebootFlagValues = libvirt.DOMAIN_REBOOT_ACPI_POWER_BTN + } + + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + log.Log.Object(vmi).Reason(err).Error("Getting the domain for soft reboot failed.") + return err + } + + defer dom.Free() + if err = dom.Reboot(domainRebootFlagValues); err != nil { + libvirtError, ok := err.(libvirt.Error) + if !ok || libvirtError.Code != libvirt.ERR_AGENT_UNRESPONSIVE { + log.Log.Object(vmi).Reason(err).Error("Soft rebooting the domain failed.") + return err + } + } + + return nil +} + +func (l *LibvirtDomainManager) MarkGracefulShutdownVMI() { + l.metadataCache.GracePeriod.WithSafeBlock(func(gracePeriodMetadata *api.GracePeriodMetadata, _ bool) { + gracePeriodMetadata.MarkedForGracefulShutdown = pointer.P(true) + }) + log.Log.V(4).Infof("Marked for graceful shutdown in metadata: %s", l.metadataCache.GracePeriod.String()) +} + +func (l *LibvirtDomainManager) SignalShutdownVMI(vmi *v1.VirtualMachineInstance) error { + l.domainModifyLock.Lock() + defer l.domainModifyLock.Unlock() + + domName := util.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + // If the VirtualMachineInstance does not exist, we are done + if domainerrors.IsNotFound(err) { + return nil + } else { + log.Log.Object(vmi).Reason(err).Error("Getting the domain failed during graceful shutdown.") + return err + } + } + defer dom.Free() + + domState, _, err := dom.GetState() + if err != nil { + log.Log.Object(vmi).Reason(err).Error(failedGetDomainState) + return err + } + + if domState == libvirt.DOMAIN_RUNNING || domState == libvirt.DOMAIN_PAUSED { + err = dom.ShutdownFlags(libvirt.DOMAIN_SHUTDOWN_DEFAULT) + if err != nil { + log.Log.Object(vmi).Reason(err).Error("Signalling graceful shutdown failed.") + return err + } + log.Log.Object(vmi).Infof("Signaled graceful shutdown for %s", vmi.GetObjectMeta().GetName()) + + l.metadataCache.GracePeriod.WithSafeBlock(func(gracePeriodMetadata *api.GracePeriodMetadata, _ bool) { + if gracePeriodMetadata.DeletionTimestamp == nil { + now := metav1.Now() + gracePeriodMetadata.DeletionTimestamp = &now + } + }) + log.Log.V(4).Infof("Graceful period set in metadata: %s", l.metadataCache.GracePeriod.String()) + } + + return nil +} + +func (l *LibvirtDomainManager) KillVMI(vmi *v1.VirtualMachineInstance) error { + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + // If the VirtualMachineInstance does not exist, we are done + if domainerrors.IsNotFound(err) { + return nil + } else { + log.Log.Object(vmi).Reason(err).Error(failedGetDomain) + return err + } + } + defer dom.Free() + // TODO: Graceful shutdown + domState, _, err := dom.GetState() + if err != nil { + if domainerrors.IsNotFound(err) { + return nil + } + log.Log.Object(vmi).Reason(err).Error(failedGetDomainState) + return err + } + + if domState == libvirt.DOMAIN_RUNNING || domState == libvirt.DOMAIN_PAUSED || domState == libvirt.DOMAIN_SHUTDOWN { + err = dom.DestroyFlags(libvirt.DOMAIN_DESTROY_GRACEFUL) + if err != nil { + if domainerrors.IsNotFound(err) { + return nil + } + log.Log.Object(vmi).Reason(err).Error("Destroying the domain state failed.") + return err + } + log.Log.Object(vmi).Info("Domain stopped.") + return nil + } + + log.Log.Object(vmi).Info("Domain not running, paused or shut down, nothing to do.") + return nil +} + +func (l *LibvirtDomainManager) DeleteVMI(vmi *v1.VirtualMachineInstance) error { + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + // If the domain does not exist, we are done + if domainerrors.IsNotFound(err) { + return nil + } else { + log.Log.Object(vmi).Reason(err).Error(failedGetDomain) + return err + } + } + defer dom.Free() + + err = dom.UndefineFlags(libvirt.DOMAIN_UNDEFINE_KEEP_NVRAM) + if err != nil { + log.Log.Object(vmi).Reason(err).Error("Undefining the domain failed.") + return err + } + log.Log.Object(vmi).Info("Domain undefined.") + return nil +} + +func (l *LibvirtDomainManager) ListAllDomains() ([]*api.Domain, error) { + + doms, err := l.virConn.ListAllDomains(libvirt.CONNECT_LIST_DOMAINS_ACTIVE | libvirt.CONNECT_LIST_DOMAINS_INACTIVE) + if err != nil { + return nil, err + } + // Free memory allocated for domains + defer func() { + for i := range doms { + err := doms[i].Free() + if err != nil { + log.Log.Reason(err).Warning("Error freeing a domain") + } + } + }() + + var list []*api.Domain + for _, dom := range doms { + domain, err := util.NewDomain(dom) + if err != nil { + if domainerrors.IsNotFound(err) { + continue + } + return list, err + } + spec, err := l.getDomainSpec(dom) + if err != nil { + if domainerrors.IsNotFound(err) { + continue + } + return list, err + } + spec.Metadata.KubeVirt = metadata.LoadKubevirtMetadata(l.metadataCache) + domain.Spec = *spec + status, reason, err := dom.GetState() + if err != nil { + if domainerrors.IsNotFound(err) { + continue + } + return list, err + } + domain.SetState(util.ConvState(status), util.ConvReason(status, reason)) + list = append(list, domain) + } + + return list, nil +} + +func (l *LibvirtDomainManager) setDomainSpecWithHooks(vmi *v1.VirtualMachineInstance, origSpec *api.DomainSpec) (cli.VirDomain, error) { + return util.SetDomainSpecStrWithHooks(l.virConn, vmi, origSpec) +} + +func (l *LibvirtDomainManager) GetQemuVersion() (string, error) { + return l.virConn.GetQemuVersion() +} + +func (l *LibvirtDomainManager) GetDomainStats() (*stats.DomainStats, error) { + return l.domainStatsCache.Get() +} + +func (l *LibvirtDomainManager) GetDomainDirtyRateStats(calculationDuration time.Duration) (*stats.DomainStatsDirtyRate, error) { + const minCalculationDuration = time.Second + + if calculationDuration < minCalculationDuration { + calculationDuration = minCalculationDuration + } + + generateRecalcFunc := func(calculationDuration time.Duration) func() (*stats.DomainStatsDirtyRate, error) { + return func() (*stats.DomainStatsDirtyRate, error) { + list, err := l.getDomainDirtyRateStats(calculationDuration) + if err != nil { + return nil, err + } + + if len(list) == 0 { + return nil, nil + } + + return list[0], nil + } + } + + if l.domainDirtyRateStatsCache == nil { + var err error + l.domainDirtyRateStatsCache, err = virtcache.NewTimeDefinedCache(3*time.Second, true, generateRecalcFunc(calculationDuration)) + if err != nil { + return nil, fmt.Errorf("failed to create domain dirty rate stats cache: %v", err) + } + } + + // If there's a cached dirty rate stat and the minRefreshDuration hadn't passed, the + // cache will not be refreshed and the recalc will kick in only during re-calculation. + l.domainDirtyRateStatsCache.SetReCalcFunc(generateRecalcFunc(calculationDuration)) + + dirtyRateStats, err := l.domainDirtyRateStatsCache.Get() + if err != nil { + return nil, fmt.Errorf("failed to get domain dirty rate stats: %v", err) + } + + return dirtyRateStats, nil +} + +func (l *LibvirtDomainManager) getDomainStats() ([]*stats.DomainStats, error) { + statsTypes := libvirt.DOMAIN_STATS_BALLOON | libvirt.DOMAIN_STATS_CPU_TOTAL | libvirt.DOMAIN_STATS_VCPU | libvirt.DOMAIN_STATS_INTERFACE | libvirt.DOMAIN_STATS_BLOCK | libvirt.DOMAIN_STATS_DIRTYRATE + flags := libvirt.CONNECT_GET_ALL_DOMAINS_STATS_RUNNING | libvirt.CONNECT_GET_ALL_DOMAINS_STATS_PAUSED + + return l.virConn.GetDomainStats(statsTypes, l.migrateInfoStats, flags) +} + +func (l *LibvirtDomainManager) getDomainDirtyRateStats(calculationDuration time.Duration) ([]*stats.DomainStatsDirtyRate, error) { + return l.virConn.GetDomainDirtyRate(calculationDuration, libvirt.DOMAIN_DIRTYRATE_MODE_PAGE_SAMPLING) +} + +func formatPCIAddressStr(address *api.Address) string { + return fmt.Sprintf("%s:%s:%s.%s", address.Domain[2:], address.Bus[2:], address.Slot[2:], address.Function[2:]) +} + +func addToDeviceMetadata(metadataType cloudinit.DeviceMetadataType, address *api.Address, mac string, tag string, devicesMetadata []cloudinit.DeviceData, numa *uint32, numaAlignedCPUs []uint32) []cloudinit.DeviceData { + pciAddrStr := formatPCIAddressStr(address) + deviceData := cloudinit.DeviceData{ + Type: metadataType, + Bus: address.Type, + Address: pciAddrStr, + MAC: mac, + Tags: []string{tag}, + } + if numa != nil { + deviceData.NumaNode = *numa + } + if len(numaAlignedCPUs) > 0 { + deviceData.AlignedCPUs = numaAlignedCPUs + } + devicesMetadata = append(devicesMetadata, deviceData) + return devicesMetadata +} + +func getDeviceNUMACPUAffinity(dev api.HostDevice, vmi *v1.VirtualMachineInstance, domainSpec *api.DomainSpec) (numaNodePtr *uint32, cpuList []uint32) { + if dev.Source.Address != nil { + pciAddress := formatPCIAddressStr(dev.Source.Address) + if vmi.Spec.Domain.CPU.NUMA != nil && vmi.Spec.Domain.CPU.NUMA.GuestMappingPassthrough != nil { + if numa, err := hardware.GetDeviceNumaNode(pciAddress); err == nil { + numaNodePtr = numa + return + } + } else if vmi.IsCPUDedicated() { + if vCPUList, err := hardware.LookupDeviceVCPUAffinity(pciAddress, domainSpec); err == nil { + cpuList = vCPUList + return + } + } + } + return +} + +func (l *LibvirtDomainManager) buildDevicesMetadata(vmi *v1.VirtualMachineInstance, dom cli.VirDomain) ([]cloudinit.DeviceData, error) { + taggedInterfaces := make(map[string]v1.Interface) + taggedHostDevices := make(map[string]v1.HostDevice) + taggedGPUs := make(map[string]v1.GPU) + var devicesMetadata []cloudinit.DeviceData + + // Get all tagged interfaces for lookup + for _, vif := range vmi.Spec.Domain.Devices.Interfaces { + if vif.Tag != "" { + taggedInterfaces[vif.Name] = vif + } + } + + // Get all tagged host devices for lookup + for _, dev := range vmi.Spec.Domain.Devices.HostDevices { + if dev.Tag != "" { + taggedHostDevices[dev.Name] = dev + } + } + + // Get all tagged gpus for lookup + for _, dev := range vmi.Spec.Domain.Devices.GPUs { + if dev.Tag != "" { + taggedGPUs[dev.Name] = dev + } + } + + domainSpec, err := getDomainSpec(dom) + if err != nil { + return nil, err + } + devices := domainSpec.Devices + interfaces := devices.Interfaces + for _, nic := range interfaces { + if data, exist := taggedInterfaces[nic.Alias.GetName()]; exist { + var mac string + if nic.MAC != nil { + mac = nic.MAC.MAC + } + // currently network Interfaces do not contain host devices thus have no NUMA alignment. + deviceAlignedCPUs := []uint32{} + devicesMetadata = addToDeviceMetadata(cloudinit.NICMetadataType, + nic.Address, + mac, + data.Tag, + devicesMetadata, + nil, + deviceAlignedCPUs, + ) + } + } + + hostDevices := devices.HostDevices + for _, dev := range hostDevices { + devAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), netsriov.SRIOVAliasPrefix) + hostDevAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), generic.AliasPrefix) + gpuDevAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), gpu.AliasPrefix) + if data, exist := taggedInterfaces[devAliasNoPrefix]; exist { + deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) + devicesMetadata = addToDeviceMetadata(cloudinit.NICMetadataType, + dev.Address, + "", + data.Tag, + devicesMetadata, + deviceNumaNode, + deviceAlignedCPUs, + ) + } + if data, exist := taggedHostDevices[hostDevAliasNoPrefix]; exist { + deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) + devicesMetadata = addToDeviceMetadata(cloudinit.HostDevMetadataType, + dev.Address, + "", + data.Tag, + devicesMetadata, + deviceNumaNode, + deviceAlignedCPUs, + ) + } + if data, exist := taggedHostDevices[gpuDevAliasNoPrefix]; exist { + deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) + devicesMetadata = addToDeviceMetadata(cloudinit.HostDevMetadataType, + dev.Address, + "", + data.Tag, + devicesMetadata, + deviceNumaNode, + deviceAlignedCPUs, + ) + } + } + return devicesMetadata, nil +} + +// GetGuestInfo queries the agent store and return the aggregated data from Guest agent +func (l *LibvirtDomainManager) GetGuestInfo() v1.VirtualMachineInstanceGuestAgentInfo { + sysInfo := l.agentData.GetSysInfo() + fsInfo := l.agentData.GetFS(10) + userInfo := l.agentData.GetUsers(10) + var fsFreezestatus api.FSFreeze + if status := l.agentData.GetFSFreezeStatus(); status != nil { + fsFreezestatus = *status + } + + gaInfo := l.agentData.GetGA() + + guestInfo := v1.VirtualMachineInstanceGuestAgentInfo{ + GAVersion: gaInfo.Version, + SupportedCommands: gaInfo.SupportedCommands, + Hostname: sysInfo.Hostname, + FSFreezeStatus: fsFreezestatus.Status, + OS: v1.VirtualMachineInstanceGuestOSInfo{ + Name: sysInfo.OSInfo.Name, + KernelRelease: sysInfo.OSInfo.KernelRelease, + Version: sysInfo.OSInfo.Version, + PrettyName: sysInfo.OSInfo.PrettyName, + VersionID: sysInfo.OSInfo.VersionId, + KernelVersion: sysInfo.OSInfo.KernelVersion, + Machine: sysInfo.OSInfo.Machine, + ID: sysInfo.OSInfo.Id, + }, + Timezone: fmt.Sprintf("%s, %d", sysInfo.Timezone.Zone, sysInfo.Timezone.Offset), + } + + for _, user := range userInfo { + guestInfo.UserList = append(guestInfo.UserList, v1.VirtualMachineInstanceGuestOSUser{ + UserName: user.Name, + Domain: user.Domain, + LoginTime: user.LoginTime, + }) + } + + for _, fs := range fsInfo { + guestInfo.FSInfo.Filesystems = append(guestInfo.FSInfo.Filesystems, v1.VirtualMachineInstanceFileSystem{ + DiskName: fs.Name, + MountPoint: fs.Mountpoint, + FileSystemType: fs.Type, + UsedBytes: fs.UsedBytes, + TotalBytes: fs.TotalBytes, + Disk: l.parseFSDisks(fs.Disk), + }) + } + + return guestInfo +} + +// InterfacesStatus returns the interfaces Guest Agent reported +func (l *LibvirtDomainManager) InterfacesStatus() []api.InterfaceStatus { + return l.agentData.GetInterfaceStatus() +} + +// GetGuestOSInfo returns the Guest OS version and architecture +func (l *LibvirtDomainManager) GetGuestOSInfo() *api.GuestOSInfo { + return l.agentData.GetGuestOSInfo() +} + +// GetUsers return the full list of users on the guest machine +func (l *LibvirtDomainManager) GetUsers() []v1.VirtualMachineInstanceGuestOSUser { + userInfo := l.agentData.GetUsers(-1) + userList := []v1.VirtualMachineInstanceGuestOSUser{} + + for _, user := range userInfo { + userList = append(userList, v1.VirtualMachineInstanceGuestOSUser{ + UserName: user.Name, + Domain: user.Domain, + LoginTime: user.LoginTime, + }) + } + + return userList +} + +// GetFilesystems return the full list of filesystems on the guest machine +func (l *LibvirtDomainManager) GetFilesystems() []v1.VirtualMachineInstanceFileSystem { + fsInfo := l.agentData.GetFS(-1) + fsList := []v1.VirtualMachineInstanceFileSystem{} + + for _, fs := range fsInfo { + fsList = append(fsList, v1.VirtualMachineInstanceFileSystem{ + DiskName: fs.Name, + MountPoint: fs.Mountpoint, + FileSystemType: fs.Type, + UsedBytes: fs.UsedBytes, + TotalBytes: fs.TotalBytes, + Disk: l.parseFSDisks(fs.Disk), + }) + } + + return fsList +} + +func (l *LibvirtDomainManager) GetSEVInfo() (*v1.SEVPlatformInfo, error) { + sevNodeParameters, err := l.virConn.GetSEVInfo() + if err != nil { + log.Log.Reason(err).Error("Getting SEV platform info failed") + return nil, err + } + + return &v1.SEVPlatformInfo{ + PDH: sevNodeParameters.PDH, + CertChain: sevNodeParameters.CertChain, + }, nil +} + +func (l *LibvirtDomainManager) GetLaunchMeasurement(vmi *v1.VirtualMachineInstance) (*v1.SEVMeasurementInfo, error) { + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + log.Log.Object(vmi).Reason(err).Error(failedGetDomain) + return nil, err + } + defer dom.Free() + + const flags = uint32(0) + domainLaunchSecurityParameters, err := dom.GetLaunchSecurityInfo(flags) + if err != nil { + log.Log.Object(vmi).Reason(err).Error("Getting launch security info failed") + return nil, err + } + + sevMeasurementInfo := v1.SEVMeasurementInfo{} + if domainLaunchSecurityParameters.SEVMeasurementSet { + sevMeasurementInfo.Measurement = domainLaunchSecurityParameters.SEVMeasurement + } + if domainLaunchSecurityParameters.SEVAPIMajorSet { + sevMeasurementInfo.APIMajor = domainLaunchSecurityParameters.SEVAPIMajor + } + if domainLaunchSecurityParameters.SEVAPIMinorSet { + sevMeasurementInfo.APIMinor = domainLaunchSecurityParameters.SEVAPIMinor + } + if domainLaunchSecurityParameters.SEVBuildIDSet { + sevMeasurementInfo.BuildID = domainLaunchSecurityParameters.SEVBuildID + } + if domainLaunchSecurityParameters.SEVPolicySet { + sevMeasurementInfo.Policy = domainLaunchSecurityParameters.SEVPolicy + } + + loader := l.efiEnvironment.EFICode(false, true) // no secureBoot, with sev + f, err := os.Open(loader) + if err != nil { + log.Log.Object(vmi).Reason(err).Errorf("Error opening loader binary %s", loader) + return nil, err + } + defer f.Close() + + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + log.Log.Object(vmi).Reason(err).Errorf("Error reading loader binary %s", loader) + return nil, err + } + + sevMeasurementInfo.LoaderSHA = fmt.Sprintf("%x", h.Sum(nil)) + + return &sevMeasurementInfo, nil +} + +func (l *LibvirtDomainManager) InjectLaunchSecret(vmi *v1.VirtualMachineInstance, sevSecretOptions *v1.SEVSecretOptions) error { + if sevSecretOptions.Header == "" { + return fmt.Errorf("Header is required") + } else if sevSecretOptions.Secret == "" { + return fmt.Errorf("Secret is required") + } + + domName := api.VMINamespaceKeyFunc(vmi) + dom, err := l.virConn.LookupDomainByName(domName) + if err != nil { + log.Log.Object(vmi).Reason(err).Error(failedGetDomain) + return err + } + defer dom.Free() + + domainLaunchSecurityStateParameters := &libvirt.DomainLaunchSecurityStateParameters{ + SEVSecret: sevSecretOptions.Secret, + SEVSecretSet: true, + SEVSecretHeader: sevSecretOptions.Header, + SEVSecretHeaderSet: true, + } + + const flags = uint32(0) + if err := dom.SetLaunchSecurityState(domainLaunchSecurityStateParameters, flags); err != nil { + log.Log.Object(vmi).Reason(err).Error("Setting launch security state failed") + return err + } + + return nil +} + +func (l *LibvirtDomainManager) parseFSDisks(fsDisks []api.FSDisk) []v1.VirtualMachineInstanceFileSystemDisk { + disks := []v1.VirtualMachineInstanceFileSystemDisk{} + for _, fsDisk := range fsDisks { + disks = append(disks, v1.VirtualMachineInstanceFileSystemDisk{ + Serial: fsDisk.Serial, + BusType: fsDisk.BusType, + }) + } + + return disks +} + +// linkImageVolumeFilePaths creates symbolic links for container disk files and kernel boot artifacts +// from the image volume view to the appropriate known paths in the launcher view. +func (l *LibvirtDomainManager) linkImageVolumeFilePaths(vmi *v1.VirtualMachineInstance) error { + for volumeIndex, volume := range vmi.Spec.Volumes { + if volume.ContainerDisk == nil { + continue + } + backingFile := containerdisk.GetDiskTargetPathFromLauncherView(volumeIndex) + fileToSoftLink, err := getDiskTargetPathFromImageVolumeView(volumeIndex, volume.ContainerDisk.Path) + if err != nil { + return fmt.Errorf("failed to find disk file from ImageVolume: %v", err) + } + err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), backingFile) + if err != nil && !os.IsExist(err) { + return fmt.Errorf("error creating symlink for containerDisk: %v", err) + } + } + + if kutil.HasKernelBootContainerImage(vmi) { + kb := vmi.Spec.Domain.Firmware.KernelBoot + + err := os.MkdirAll(containerdisk.GetKernelBootArtifactPathFromLauncherView(""), 0755) + if err != nil { + return fmt.Errorf("error creating dir for KernelPath: %v", err) + } + log.Log.Object(vmi).Infof("kernel boot defined for VMI. Converting to domain XML") + if kb.Container.KernelPath != "" { + kernelPath := containerdisk.GetKernelBootArtifactPathFromLauncherView(kb.Container.KernelPath) + fileToSoftLink, err := getKernelBootArtifactPathFromImageVolumeView(kb.Container.KernelPath) + if err != nil { + return fmt.Errorf("error getting kernel boot artifact path from ImageVolume: %v", err) + } + err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), kernelPath) + if err != nil && !os.IsExist(err) { + return fmt.Errorf("error creating symlink for KernelPath: %v", err) + } + } + + if kb.Container.InitrdPath != "" { + initrdPath := containerdisk.GetKernelBootArtifactPathFromLauncherView(kb.Container.InitrdPath) + fileToSoftLink, err := getKernelBootArtifactPathFromImageVolumeView(kb.Container.InitrdPath) + if err != nil { + return fmt.Errorf("error getting kernel boot artifact path from ImageVolume: %v", err) + } + err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), initrdPath) + if err != nil && !os.IsExist(err) { + return fmt.Errorf("error creating symlink for KernelPath: %v", err) + } + } + } + + return nil +} + +func getDiskTargetPathFromImageVolumeView(volumeIndex int, volumePath string) (*safepath.Path, error) { + if volumePath != "" { + return safepath.JoinAndResolveWithRelativeRoot(kutil.VirtImageVolumeDir, fmt.Sprintf("disk_%d", volumeIndex), volumePath) + } + imageVolumeDir := filepath.Join(kutil.VirtImageVolumeDir, fmt.Sprintf("disk_%d", volumeIndex), osdisk.DiskSourceFallbackPath) + files, err := os.ReadDir(imageVolumeDir) + if err != nil { + return nil, fmt.Errorf("failed to check ImageVolume path %s: %v", imageVolumeDir, err) + } + if len(files) == 0 { + return nil, fmt.Errorf("no file found in folder %s, no disk present", imageVolumeDir) + } else if len(files) > 1 { + return nil, fmt.Errorf("more than one file found in folder %s, only one disk is allowed", imageVolumeDir) + } + return safepath.JoinAndResolveWithRelativeRoot(imageVolumeDir, files[0].Name()) +} + +func getKernelBootArtifactPathFromImageVolumeView(artifact string) (*safepath.Path, error) { + return safepath.JoinAndResolveWithRelativeRoot(kutil.VirtKernelBootVolumeDir, artifact) +} + +// check whether VMI has a certain condition +func vmiHasCondition(vmi *v1.VirtualMachineInstance, cond v1.VirtualMachineInstanceConditionType) bool { + if vmi == nil { + return false + } + + for _, c := range vmi.Status.Conditions { + if c.Type == cond { + return true + } + } + return false +} + +func isDomainPaused(dom cli.VirDomain) (bool, error) { + status, reason, err := dom.GetState() + if err != nil { + return false, err + } + return util.ConvState(status) == api.Paused && + util.ConvReason(status, reason) == api.ReasonPausedUser, nil +} + +func getDomainCreateFlags(vmi *v1.VirtualMachineInstance) libvirt.DomainCreateFlags { + flags := libvirt.DOMAIN_NONE + + if vmi.ShouldStartPaused() { + flags |= libvirt.DOMAIN_START_PAUSED + } + if vmi.IsCPUDedicated() && vmi.Spec.Domain.CPU.IsolateEmulatorThread { + flags |= libvirt.DOMAIN_START_PAUSED + } + return flags +} diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go index c522614ce720..00db85fc96cc 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go @@ -59,14 +59,15 @@ import ( virtconfig "kubevirt.io/kubevirt/pkg/virt-config" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/efi" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" ) @@ -107,7 +108,7 @@ var _ = Describe("Manager", func() { testNamespace := "testnamespace" testDomainName := fmt.Sprintf("%s_%s", testNamespace, testVmName) ephemeralDiskCreatorMock := &fake.MockEphemeralDiskImageCreator{} - newLibvirtDomainManagerDefault := func() (DomainManager, error) { + newLibvirtDomainManagerDefault := func() (virtwrap.DomainManager, error) { return NewLibvirtDomainManager(mockLibvirt.VirtConnection, testVirtShareDir, testEphemeralDiskDir, nil, "/usr/share/OVMF", ephemeralDiskCreatorMock, metadataCache, nil, virtconfig.DefaultDiskVerificationMemoryLimitBytes, fakeCpuSetGetter, false) } @@ -2249,7 +2250,7 @@ var _ = Describe("Manager", func() { }) Context("on call to GetGuestOSInfo", func() { - var libvirtmanager DomainManager + var libvirtmanager virtwrap.DomainManager var agentStore agentpoller.AsyncAgentStore BeforeEach(func() { @@ -2273,7 +2274,7 @@ var _ = Describe("Manager", func() { }) Context("on call to InterfacesStatus", func() { - var libvirtmanager DomainManager + var libvirtmanager virtwrap.DomainManager var agentStore agentpoller.AsyncAgentStore BeforeEach(func() { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go index 24bb0ef9c618..430d7fccee0b 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/nichotplug_test.go @@ -36,9 +36,9 @@ import ( "kubevirt.io/kubevirt/pkg/network/namescheme" "kubevirt.io/kubevirt/pkg/network/vmispec" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" ) const defaultNet = "default" diff --git a/pkg/virt-launcher/virtwrap/BUILD.bazel b/pkg/virt-launcher/virtwrap/BUILD.bazel new file mode 100644 index 000000000000..7aaede931528 --- /dev/null +++ b/pkg/virt-launcher/virtwrap/BUILD.bazel @@ -0,0 +1,34 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["monitor.go"], + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher", + visibility = ["//visibility:public"], + deps = [ + "//pkg/ephemeral-disk-utils:go_default_library", + "//pkg/util:go_default_library", + "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", + "//staging/src/kubevirt.io/client-go/log:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "monitor_test.go", + "virt_launcher_suite_test.go", + ], + args = [ + "--fake-qemu-binary-path", + "$(location //cmd/fake-qemu-process)", + ], + data = ["//cmd/fake-qemu-process"], + embed = [":go_default_library"], + deps = [ + "//staging/src/kubevirt.io/client-go/testutils:go_default_library", + "//vendor/github.com/google/uuid:go_default_library", + "//vendor/github.com/onsi/ginkgo/v2:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", + ], +) diff --git a/pkg/virt-launcher/virtwrap/cmd-server/server.go b/pkg/virt-launcher/virtwrap/cmd-server/server.go index 6b1955a73379..6341ecaa5515 100644 --- a/pkg/virt-launcher/virtwrap/cmd-server/server.go +++ b/pkg/virt-launcher/virtwrap/cmd-server/server.go @@ -36,9 +36,9 @@ import ( cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" grpcutil "kubevirt.io/kubevirt/pkg/util/net/grpc" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" + launcherErrors "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent" - launcherErrors "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors" ) const ( diff --git a/pkg/virt-launcher/virtwrap/cmd-server/server_test.go b/pkg/virt-launcher/virtwrap/cmd-server/server_test.go index 49446f8183d7..748f0642682d 100644 --- a/pkg/virt-launcher/virtwrap/cmd-server/server_test.go +++ b/pkg/virt-launcher/virtwrap/cmd-server/server_test.go @@ -35,8 +35,8 @@ import ( "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/info" cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" ) diff --git a/pkg/virt-launcher/virtwrap/manager.go b/pkg/virt-launcher/virtwrap/manager.go index 6009639637aa..a5d83ad72ff3 100644 --- a/pkg/virt-launcher/virtwrap/manager.go +++ b/pkg/virt-launcher/virtwrap/manager.go @@ -26,96 +26,16 @@ package virtwrap */ import ( - "context" - "crypto/sha256" - "encoding/xml" - "errors" - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" - "syscall" "time" - "libvirt.org/go/libvirt" - - k8sv1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - v1 "kubevirt.io/api/core/v1" - "kubevirt.io/client-go/log" - cloudinit "kubevirt.io/kubevirt/pkg/cloud-init" - "kubevirt.io/kubevirt/pkg/config" - containerdisk "kubevirt.io/kubevirt/pkg/container-disk" - "kubevirt.io/kubevirt/pkg/controller" - "kubevirt.io/kubevirt/pkg/downwardmetrics" - "kubevirt.io/kubevirt/pkg/emptydisk" - ephemeraldisk "kubevirt.io/kubevirt/pkg/ephemeral-disk" cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" - "kubevirt.io/kubevirt/pkg/hooks" - "kubevirt.io/kubevirt/pkg/ignition" - "kubevirt.io/kubevirt/pkg/liveupdate/memory" - "kubevirt.io/kubevirt/pkg/network/cache" - netsriov "kubevirt.io/kubevirt/pkg/network/deviceinfo" - netsetup "kubevirt.io/kubevirt/pkg/network/setup" - netvmispec "kubevirt.io/kubevirt/pkg/network/vmispec" - osdisk "kubevirt.io/kubevirt/pkg/os/disk" - "kubevirt.io/kubevirt/pkg/pointer" - "kubevirt.io/kubevirt/pkg/safepath" - storagetypes "kubevirt.io/kubevirt/pkg/storage/types" - "kubevirt.io/kubevirt/pkg/tpm" - "kubevirt.io/kubevirt/pkg/unsafepath" - kutil "kubevirt.io/kubevirt/pkg/util" - "kubevirt.io/kubevirt/pkg/util/hardware" - hw_utils "kubevirt.io/kubevirt/pkg/util/hardware" - "kubevirt.io/kubevirt/pkg/virt-controller/services" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" - "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" - accesscredentials "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/access-credentials" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent" - agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent-poller" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/generic" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/gpu" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/efi" - domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/stats" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" - virtcache "kubevirt.io/kubevirt/tools/cache" -) - -const ( - failedSyncGuestTime = "failed to sync guest time" - failedGetDomain = "Getting the domain failed." - failedGetDomainState = "Getting the domain state failed." - failedDomainMemoryDump = "Domain memory dump failed" - affectDeviceLiveAndConfigLibvirtFlags = libvirt.DOMAIN_DEVICE_MODIFY_LIVE | libvirt.DOMAIN_DEVICE_MODIFY_CONFIG - affectDomainLiveAndConfigLibvirtFlags = libvirt.DOMAIN_AFFECT_LIVE | libvirt.DOMAIN_AFFECT_CONFIG - affectDomainVCPULiveAndConfigLibvirtFlags = libvirt.DOMAIN_VCPU_LIVE | libvirt.DOMAIN_VCPU_CONFIG ) -const maxConcurrentHotplugHostDevices = 1 -const maxConcurrentMemoryDumps = 1 - -type contextStore struct { - ctx context.Context - cancel context.CancelFunc -} - type DomainManager interface { SyncVMI(*v1.VirtualMachineInstance, bool, *cmdv1.VirtualMachineOptions) (*api.DomainSpec, error) PauseVMI(*v1.VirtualMachineInstance) error @@ -151,2396 +71,3 @@ type DomainManager interface { UpdateGuestMemory(vmi *v1.VirtualMachineInstance) error GetDomainDirtyRateStats(calculationDuration time.Duration) (*stats.DomainStatsDirtyRate, error) } - -type LibvirtDomainManager struct { - virConn cli.Connection - - // Anytime a get and a set is done on the domain, this lock must be held. - domainModifyLock sync.Mutex - // mutex to control access to the guest time context - setGuestTimeLock sync.Mutex - - credManager *accesscredentials.AccessCredentialManager - - hotplugHostDevicesInProgress chan struct{} - memoryDumpInProgress chan struct{} - - virtShareDir string - ephemeralDiskDir string - paused pausedVMIs - agentData *agentpoller.AsyncAgentStore - cloudInitDataStore *cloudinit.CloudInitData - setGuestTimeContextPtr *contextStore - efiEnvironment *efi.EFIEnvironment - ovmfPath string - ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface - directIOChecker converter.DirectIOChecker - disksInfo map[string]*osdisk.DiskInfo - cancelSafetyUnfreezeChan chan struct{} - migrateInfoStats *stats.DomainJobInfo - diskMemoryLimitBytes int64 - - metadataCache *metadata.Cache - domainStatsCache *virtcache.TimeDefinedCache[*stats.DomainStats] - domainDirtyRateStatsCache *virtcache.TimeDefinedCache[*stats.DomainStatsDirtyRate] - - cpuSetGetter func() ([]int, error) - imageVolumeFeatureGateEnabled bool -} - -type pausedVMIs struct { - paused map[types.UID]bool -} - -func (s pausedVMIs) add(uid types.UID) { - // implicitly locked by domainModifyLock - if _, ok := s.paused[uid]; !ok { - s.paused[uid] = true - } -} - -func (s pausedVMIs) remove(uid types.UID) { - // implicitly locked by domainModifyLock - if _, ok := s.paused[uid]; ok { - delete(s.paused, uid) - } -} - -func (s pausedVMIs) contains(uid types.UID) bool { - _, ok := s.paused[uid] - return ok -} - -func NewLibvirtDomainManager(connection cli.Connection, virtShareDir, ephemeralDiskDir string, agentStore *agentpoller.AsyncAgentStore, - ovmfPath string, ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface, metadataCache *metadata.Cache, - stopChan chan struct{}, diskMemoryLimitBytes int64, cpuSetGetter func() ([]int, error), imageVolumeEnabled bool) (DomainManager, error) { - directIOChecker := converter.NewDirectIOChecker() - return newLibvirtDomainManager(connection, virtShareDir, ephemeralDiskDir, agentStore, ovmfPath, ephemeralDiskCreator, directIOChecker, metadataCache, stopChan, diskMemoryLimitBytes, cpuSetGetter, imageVolumeEnabled) -} - -func newLibvirtDomainManager(connection cli.Connection, virtShareDir, ephemeralDiskDir string, agentStore *agentpoller.AsyncAgentStore, ovmfPath string, - ephemeralDiskCreator ephemeraldisk.EphemeralDiskCreatorInterface, directIOChecker converter.DirectIOChecker, metadataCache *metadata.Cache, - stopChan chan struct{}, diskMemoryLimitBytes int64, cpuSetGetter func() ([]int, error), imageVolumeEnabled bool) (DomainManager, error) { - manager := LibvirtDomainManager{ - diskMemoryLimitBytes: diskMemoryLimitBytes, - virConn: connection, - virtShareDir: virtShareDir, - ephemeralDiskDir: ephemeralDiskDir, - paused: pausedVMIs{ - paused: make(map[types.UID]bool, 0), - }, - agentData: agentStore, - efiEnvironment: efi.DetectEFIEnvironment(runtime.GOARCH, ovmfPath), - ephemeralDiskCreator: ephemeralDiskCreator, - directIOChecker: directIOChecker, - disksInfo: map[string]*osdisk.DiskInfo{}, - cancelSafetyUnfreezeChan: make(chan struct{}), - migrateInfoStats: &stats.DomainJobInfo{}, - metadataCache: metadataCache, - cpuSetGetter: cpuSetGetter, - imageVolumeFeatureGateEnabled: imageVolumeEnabled, - } - - manager.hotplugHostDevicesInProgress = make(chan struct{}, maxConcurrentHotplugHostDevices) - manager.memoryDumpInProgress = make(chan struct{}, maxConcurrentMemoryDumps) - manager.credManager = accesscredentials.NewManager(connection, &manager.domainModifyLock, metadataCache) - - reCalcDomainStats := func() (*stats.DomainStats, error) { - list, err := manager.getDomainStats() - if err != nil { - return nil, err - } - - if len(list) == 0 { - return nil, nil - } - - return list[0], nil - } - - var err error - manager.domainStatsCache, err = virtcache.NewTimeDefinedCache(3250*time.Millisecond, true, reCalcDomainStats) - if err != nil { - return nil, err - } - - if stopChan != nil { - err := manager.domainStatsCache.KeepValueUpdated(stopChan) - if err != nil { - return nil, fmt.Errorf("failed to keep domain stats updated: %w", err) - } - } - - return &manager, nil -} - -func getDomainSpec(dom cli.VirDomain) (*api.DomainSpec, error) { - var newSpec api.DomainSpec - xmlstr, err := dom.GetXMLDesc(0) - if err != nil { - return &newSpec, err - } - err = xml.Unmarshal([]byte(xmlstr), &newSpec) - if err != nil { - return &newSpec, err - } - - return &newSpec, nil -} - -func getAllDomainDevices(dom cli.VirDomain) (api.Devices, error) { - domSpec, err := getDomainSpec(dom) - if err != nil { - return domSpec.Devices, err - } - return domSpec.Devices, nil -} - -func getAllDomainDisks(dom cli.VirDomain) ([]api.Disk, error) { - devices, err := getAllDomainDevices(dom) - if err != nil { - return nil, err - } - - return devices.Disks, nil -} - -func (l *LibvirtDomainManager) UpdateGuestMemory(vmi *v1.VirtualMachineInstance) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - const errMsgPrefix = "failed to update Guest Memory" - - domainName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domainName) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - defer dom.Free() - - memoryDevice, err := memory.BuildMemoryDevice(vmi) - if err != nil { - return err - } - - spec, err := getDomainSpec(dom) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - if spec.Devices.Memory != nil { - spec.Devices.Memory.Target.Requested = memoryDevice.Target.Requested - - memoryDeviceXML, err := xml.Marshal(spec.Devices.Memory) - if err != nil { - log.Log.Reason(err).Error("marshalling target virtio-mem failed") - return err - } - - err = dom.UpdateDeviceFlags(strings.ToLower(string(memoryDeviceXML)), libvirt.DOMAIN_DEVICE_MODIFY_LIVE) - if err != nil { - log.Log.Reason(err).Error("updating virtio-mem device") - return err - } - } else { - memoryDeviceXML, err := xml.Marshal(memoryDevice) - if err != nil { - log.Log.Reason(err).Error("marshalling target virtio-mem failed") - return err - } - - err = dom.AttachDeviceFlags(strings.ToLower(string(memoryDeviceXML)), affectDeviceLiveAndConfigLibvirtFlags) - if err != nil { - log.Log.Reason(err).Error("attaching virtio-mem device") - return err - } - } - - log.Log.V(2).Infof("hotplugging guest memory to %v", vmi.Spec.Domain.Memory.Guest.Value()) - return nil -} - -func (l *LibvirtDomainManager) setGuestTime(vmi *v1.VirtualMachineInstance) error { - // Try to set VM time to the current value. This is typically useful - // when clock wasn't running on the VM for some time (e.g. during - // suspension or migration), especially if the time delay exceeds NTP - // tolerance. - // It is not guaranteed that the time is actually set (it depends on guest - // environment, especially QEMU agent presence) or that the set time is - // very precise (NTP in the guest should take care of it if needed). - - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - log.Log.Object(vmi).Reason(err).Error(failedSyncGuestTime) - return err - } - - go func() { - defer dom.Free() - - // Syncing the guest time is a best-effort. Therefore - // don't flood the logs - var latestErr error - defer func() { - if latestErr != nil { - log.Log.Object(vmi).Warning(latestErr.Error()) - } - }() - - ctx := l.getGuestTimeContext() - timeout := time.After(60 * time.Second) - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - for { - select { - case <-timeout: - log.Log.Object(vmi).Error(failedSyncGuestTime) - return - case <-ctx.Done(): - return - case <-ticker.C: - currTime := time.Now() - secs := currTime.Unix() - nsecs := uint(currTime.Nanosecond()) - err := dom.SetTime(secs, nsecs, 0) - if err != nil { - libvirtError, ok := err.(libvirt.Error) - if !ok { - log.Log.Object(vmi).Reason(err).Warning(failedSyncGuestTime) - return - } - - switch libvirtError.Code { - case libvirt.ERR_AGENT_UNRESPONSIVE: - const unresponsive = "failed to set time: QEMU agent unresponsive" - latestErr = fmt.Errorf("%s, %s", unresponsive, err) - log.Log.Object(vmi).Reason(err).V(9).Info(unresponsive) - case libvirt.ERR_OPERATION_UNSUPPORTED: - // no need to retry as this opertaion is not supported - log.Log.Object(vmi).Reason(err).Warning("failed to set time: not supported") - return - case libvirt.ERR_ARGUMENT_UNSUPPORTED: - // no need to retry as the agent is not configured - log.Log.Object(vmi).Reason(err).Warning("failed to set time: agent not configured") - return - default: - latestErr = fmt.Errorf("%s, %s", failedSyncGuestTime, err) - log.Log.Object(vmi).Reason(err).V(9).Info(failedSyncGuestTime) - } - } else { - latestErr = nil - log.Log.Object(vmi).Info("guest VM time sync finished successfully") - return - } - } - } - }() - - return nil -} - -func (l *LibvirtDomainManager) getGuestTimeContext() context.Context { - l.setGuestTimeLock.Lock() - defer l.setGuestTimeLock.Unlock() - - // cancel the already running setGuestTime go-routine if such exist - if l.setGuestTimeContextPtr != nil { - l.setGuestTimeContextPtr.cancel() - } - // create a new context and store it - ctx, cancel := context.WithCancel(context.Background()) - l.setGuestTimeContextPtr = &contextStore{ctx: ctx, cancel: cancel} - return ctx -} - -// PrepareMigrationTarget the target pod environment before the migration is initiated -func (l *LibvirtDomainManager) PrepareMigrationTarget( - vmi *v1.VirtualMachineInstance, - allowEmulation bool, - options *cmdv1.VirtualMachineOptions, -) error { - return l.prepareMigrationTarget(vmi, allowEmulation, options) -} - -// FinalizeVirtualMachineMigration finalized the migration after the migration has completed and vmi is running on target pod. -func (l *LibvirtDomainManager) FinalizeVirtualMachineMigration(vmi *v1.VirtualMachineInstance, options *cmdv1.VirtualMachineOptions) error { - return l.finalizeMigrationTarget(vmi, options) -} - -// UpdateVCPUs plugs or unplugs vCPUs on a running domain -func (l *LibvirtDomainManager) UpdateVCPUs(vmi *v1.VirtualMachineInstance, options *cmdv1.VirtualMachineOptions) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - const errMsgPrefix = "failed to update vCPUs" - - domainName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domainName) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - defer dom.Free() - var topology *cmdv1.Topology - - logger := log.Log.Object(vmi) - - vcpuTopology := vcpu.GetCPUTopology(vmi) - vcpuCount := vcpu.CalculateRequestedVCPUs(vcpuTopology) - // hot plug/unplug vCPUs - if err := dom.SetVcpusFlags(uint(vcpuCount), - affectDomainVCPULiveAndConfigLibvirtFlags); err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - // Adjust guest vcpu config. Currently will handle vCPUs to pCPUs pinning - if vmi.IsCPUDedicated() { - useIOThreads := false - if options != nil && options.Topology != nil { - topology = options.Topology - } - - podCPUSet, err := l.cpuSetGetter() - if err != nil { - logger.Reason(err).Error("failed to read pod cpuset.") - return fmt.Errorf("failed to read pod cpuset: %v", err) - } - - domain, err := util.NewDomain(dom) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - spec, err := getDomainSpec(dom) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - domain.Spec = *spec - - if domain.Spec.CPUTune != nil && len(domain.Spec.CPUTune.IOThreadPin) > 0 { - useIOThreads = true - } - - err = vcpu.AdjustDomainForTopologyAndCPUSet(domain, vmi, topology, podCPUSet, useIOThreads) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - for _, vcpupin := range domain.Spec.CPUTune.VCPUPin { - vcpu := vcpupin.VCPU - cpuSet := vcpupin.CPUSet - pcpu, err := strconv.Atoi(cpuSet) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - cpuMap := make([]bool, int(pcpu)+1) - cpuMap[pcpu] = true - err = dom.PinVcpuFlags(uint(vcpu), cpuMap, affectDomainLiveAndConfigLibvirtFlags) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - } - if domain.Spec.CPUTune.EmulatorPin != nil { - isolCpus, _ := hw_utils.ParseCPUSetLine(domain.Spec.CPUTune.EmulatorPin.CPUSet, 100) - cpuMap := make([]bool, maxSlice(isolCpus)+1) - for _, isolCpu := range isolCpus { - cpuMap[isolCpu] = true - } - err = dom.PinEmulator(cpuMap, affectDomainLiveAndConfigLibvirtFlags) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - } - - } - return nil -} - -func maxSlice(slice []int) int { - var max = slice[0] - for _, value := range slice { - if max < value { - max = value - } - } - return max -} - -// HotplugHostDevices attach host-devices to running domain, currently only SRIOV host-devices are supported. -// This operation runs in the background, only one hotplug operation can occur at a time. -func (l *LibvirtDomainManager) HotplugHostDevices(vmi *v1.VirtualMachineInstance) error { - select { - case l.hotplugHostDevicesInProgress <- struct{}{}: - default: - return fmt.Errorf("hot-plug host-devices is in progress") - } - - go func() { - defer func() { <-l.hotplugHostDevicesInProgress }() - - if err := l.hotPlugHostDevices(vmi); err != nil { - log.Log.Object(vmi).Error(err.Error()) - } - }() - return nil -} - -func (l *LibvirtDomainManager) hotPlugHostDevices(vmi *v1.VirtualMachineInstance) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - const errMsgPrefix = "failed to hot-plug host-devices" - - domainName := api.VMINamespaceKeyFunc(vmi) - domain, err := l.virConn.LookupDomainByName(domainName) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - defer domain.Free() - - domainSpec, err := util.GetDomainSpecWithFlags(domain, 0) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - sriovHostDevices, err := sriov.GetHostDevicesToAttach(vmi, domainSpec) - if err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, err) - } - - if err := hostdevice.AttachHostDevices(domain, sriovHostDevices); err != nil { - return fmt.Errorf("%s: %v", errMsgPrefix, hostdevice.AttachHostDevices(domain, sriovHostDevices)) - } - - return nil -} - -func (l *LibvirtDomainManager) Exec(domainName, command string, args []string, timeoutSeconds int32) (string, error) { - return agent.GuestExec(l.virConn, domainName, command, args, timeoutSeconds) -} - -func (l *LibvirtDomainManager) GuestPing(domainName string) error { - pingCmd := `{"execute":"guest-ping"}` - _, err := l.virConn.QemuAgentCommand(pingCmd, domainName) - return err -} - -func getVMIEphemeralDisksTotalSize(ephemeralDiskDir string) *resource.Quantity { - totalSize := int64(0) - err := filepath.Walk(ephemeralDiskDir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - if !f.IsDir() { - totalSize += f.Size() - } - return nil - }) - if err != nil { - log.Log.Reason(err).Warning("failed to get VMI ephemeral disks size") - return resource.NewScaledQuantity(0, 0) - } - - return resource.NewScaledQuantity(totalSize, 0) -} - -func getVMIMigrationDataSize(vmi *v1.VirtualMachineInstance, ephemeralDiskDir string) int64 { - var memory resource.Quantity - - // Take memory from the requested memory - if v, ok := vmi.Spec.Domain.Resources.Requests[k8sv1.ResourceMemory]; ok { - memory = v - } - // In case that guest memory is explicitly set, override it - if vmi.Spec.Domain.Memory != nil && vmi.Spec.Domain.Memory.Guest != nil { - memory = *vmi.Spec.Domain.Memory.Guest - } - - // get total data Size - if vmi.Status.MigrationMethod == v1.BlockMigration { - disksSize := getVMIEphemeralDisksTotalSize(ephemeralDiskDir) - memory.Add(*disksSize) - } - memory.Add(*(storagetypes.GetTotalSizeMigratedVolumes(vmi))) - return memory.ScaledValue(resource.Giga) -} - -func (l *LibvirtDomainManager) CancelVMIMigration(vmi *v1.VirtualMachineInstance) error { - return l.cancelMigration(vmi) -} - -func (l *LibvirtDomainManager) MigrateVMI(vmi *v1.VirtualMachineInstance, options *cmdclient.MigrationOptions) error { - return l.startMigration(vmi, options) -} - -func (l *LibvirtDomainManager) generateSomeCloudInitISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain, size int64) error { - var devicesMetadata []cloudinit.DeviceData - // this is the point where we need to build the devices metadata if it was requested. - // This metadata maps the user provided tag to the hypervisor assigned device address. - if domPtr != nil { - data, err := l.buildDevicesMetadata(vmi, *domPtr) - if err != nil { - return err - } - devicesMetadata = data - } - // build condif drive iso file, that includes devices metadata if available - // get stored cloud init data - var cloudInitDataStore *cloudinit.CloudInitData - cloudInitDataStore = l.cloudInitDataStore - - if cloudInitDataStore != nil { - // add devices metedata - if devicesMetadata != nil { - cloudInitDataStore.DevicesData = &devicesMetadata - } - var err error - if size != 0 { - err = cloudinit.GenerateEmptyIso(vmi.Name, vmi.Namespace, cloudInitDataStore, size) - } else { - // ClusterInstancetype will take precedence over a namespaced Instancetype - // for setting instance_type in the metadata - instancetype := vmi.Annotations[v1.ClusterInstancetypeAnnotation] - if instancetype == "" { - instancetype = vmi.Annotations[v1.InstancetypeAnnotation] - } - - err = cloudinit.GenerateLocalData(vmi, instancetype, cloudInitDataStore) - } - if err != nil { - return fmt.Errorf("generating local cloud-init data failed: %v", err) - } - } - return nil -} - -func (l *LibvirtDomainManager) generateCloudInitISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain) error { - return l.generateSomeCloudInitISO(vmi, domPtr, 0) -} - -func (l *LibvirtDomainManager) generateCloudInitEmptyISO(vmi *v1.VirtualMachineInstance, domPtr *cli.VirDomain) error { - if l.cloudInitDataStore == nil { - return nil - } - for _, vs := range vmi.Status.VolumeStatus { - if vs.Name == l.cloudInitDataStore.VolumeName { - return l.generateSomeCloudInitISO(vmi, domPtr, vs.Size) - } - } - return fmt.Errorf("failed to find the status of volume %s", l.cloudInitDataStore.VolumeName) -} - -// All local environment setup that needs to occur before VirtualMachineInstance starts -// can be done in this function. This includes things like... -// -// - storage prep -// - network prep -// - cloud-init -// - sysprep -// -// The Domain.Spec can be alterned in this function and any changes -// made to the domain will get set in libvirt after this function exits. -func (l *LibvirtDomainManager) preStartHook(vmi *v1.VirtualMachineInstance, domain *api.Domain, generateEmptyIsos bool, options *cmdv1.VirtualMachineOptions) (*api.Domain, error) { - logger := log.Log.Object(vmi) - - logger.Info("Executing PreStartHook on VMI pod environment") - - // generate cloud-init data - cloudInitData, err := cloudinit.ReadCloudInitVolumeDataSource(vmi, config.SecretSourceDir) - if err != nil { - return domain, fmt.Errorf("ReadCloudInitVolumeDataSource failed: %v", err) - } - - // Pass cloud-init data to PreCloudInitIso hook - logger.Info("Starting PreCloudInitIso hook") - hooksManager := hooks.GetManager() - cloudInitData, err = hooksManager.PreCloudInitIso(vmi, cloudInitData) - if err != nil { - return domain, fmt.Errorf("PreCloudInitIso hook failed: %v", err) - } - - if cloudInitData != nil { - // need to prepare the local path for cloud-init in advance for proper - // detection of the disk driver cache mode - if err := cloudinit.PrepareLocalPath(vmi.Name, vmi.Namespace); err != nil { - return domain, fmt.Errorf("PrepareLocalPath failed: %v", err) - } - // store the generated cloud init metadata. - // cloud init ISO will be generated after the domain definition - l.cloudInitDataStore = cloudInitData - } - - // generate ignition data - ignitionData := ignition.GetIgnitionSource(vmi) - if ignitionData != "" { - - err := ignition.GenerateIgnitionLocalData(vmi, vmi.Namespace) - if err != nil { - return domain, err - } - } - - nonAbsentIfaces := netvmispec.FilterInterfacesSpec(vmi.Spec.Domain.Devices.Interfaces, func(iface v1.Interface) bool { - return iface.State != v1.InterfaceStateAbsent - }) - nonAbsentNets := netvmispec.FilterNetworksByInterfaces(vmi.Spec.Networks, nonAbsentIfaces) - var interfaceDomainAttachments map[string]string - if options != nil { - interfaceDomainAttachments = options.GetInterfaceDomainAttachment() - } - err = netsetup.NewVMNetworkConfigurator(vmi, cache.CacheCreator{}, netsetup.WithDomainAttachments(interfaceDomainAttachments)).SetupPodNetworkPhase2(domain, nonAbsentNets) - if err != nil { - return domain, fmt.Errorf("preparing the pod network failed: %v", err) - } - - // Create ephemeral disk for container disks - err = containerdisk.CreateEphemeralImages(vmi, l.ephemeralDiskCreator, l.disksInfo) - if err != nil { - return domain, fmt.Errorf("preparing ephemeral container disk images failed: %v", err) - } - // Create images for volumes that are marked ephemeral. - err = l.ephemeralDiskCreator.CreateEphemeralImages(vmi, domain) - if err != nil { - return domain, fmt.Errorf("preparing ephemeral images failed: %v", err) - } - // create empty disks if they exist - if err := emptydisk.NewEmptyDiskCreator().CreateTemporaryDisks(vmi); err != nil { - return domain, fmt.Errorf("creating empty disks failed: %v", err) - } - // create ConfigMap disks if they exists - if err := config.CreateConfigMapDisks(vmi, generateEmptyIsos); err != nil { - return domain, fmt.Errorf("creating config map disks failed: %v", err) - } - // create Secret disks if they exists - if err := config.CreateSecretDisks(vmi, generateEmptyIsos); err != nil { - return domain, fmt.Errorf("creating secret disks failed: %v", err) - } - - // create Sysprep disks if they exists - if err := config.CreateSysprepDisks(vmi, generateEmptyIsos); err != nil { - return domain, fmt.Errorf("creating sysprep disks failed: %v", err) - } - - // create DownwardAPI disks if they exists - if err := config.CreateDownwardAPIDisks(vmi, generateEmptyIsos); err != nil { - return domain, fmt.Errorf("creating DownwardAPI disks failed: %v", err) - } - // create ServiceAccount disk if exists - if err := config.CreateServiceAccountDisk(vmi, generateEmptyIsos); err != nil { - return domain, fmt.Errorf("creating service account disk failed: %v", err) - } - // create downwardMetric disk if exists - if err := downwardmetrics.CreateDownwardMetricDisk(vmi); err != nil { - return domain, fmt.Errorf("failed to craete downwardMetric disk: %v", err) - } - - // set drivers cache mode - for i := range domain.Spec.Devices.Disks { - err := converter.SetDriverCacheMode(&domain.Spec.Devices.Disks[i], l.directIOChecker) - if err != nil { - return domain, err - } - converter.SetOptimalIOMode(&domain.Spec.Devices.Disks[i]) - } - - if err := l.credManager.HandleQemuAgentAccessCredentials(vmi); err != nil { - return domain, fmt.Errorf("Starting qemu agent access credential propagation failed: %v", err) - } - - // expand disk image files if they're too small - expandDiskImagesOffline(vmi, domain) - - return domain, err -} - -func expandDiskImagesOffline(vmi *v1.VirtualMachineInstance, domain *api.Domain) { - logger := log.Log.Object(vmi) - for _, disk := range domain.Spec.Devices.Disks { - if shouldExpandOffline(disk) { - possibleGuestSize, ok := possibleGuestSize(disk) - if !ok { - logger.Errorf("Failed to get possible guest size from disk") - break - } - err := expandDiskImageOffline(getSourceFile(disk), possibleGuestSize) - if err != nil { - logger.Reason(err).Errorf("failed to expand disk image %v at boot", disk) - } - } - } -} - -func expandDiskImageOffline(imagePath string, size int64) error { - log.Log.Infof("pre-start expansion of image %s to size %d", imagePath, size) - var preallocateFlag string - if converter.IsPreAllocated(imagePath) { - preallocateFlag = "--preallocation=falloc" - } else { - preallocateFlag = "--preallocation=off" - } - size = kutil.AlignImageSizeTo1MiB(size, log.Log.With("image", imagePath)) - if size == 0 { - return fmt.Errorf("%s must be at least 1MiB", imagePath) - } - cmd := exec.Command("/usr/bin/qemu-img", "resize", preallocateFlag, imagePath, strconv.FormatInt(size, 10)) - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("expanding image failed with error: %v, output: %s", err, out) - } - return nil -} - -func possibleGuestSize(disk api.Disk) (int64, bool) { - if disk.Capacity == nil { - log.DefaultLogger().Error("No disk capacity") - return 0, false - } - if disk.FilesystemOverhead == nil { - log.DefaultLogger().Errorf("No filesystem overhead found for disk %v", disk) - return 0, false - } - - filesystemOverhead, err := strconv.ParseFloat(string(*disk.FilesystemOverhead), 64) - if err != nil { - log.DefaultLogger().Reason(err).Error("Failed to parse filesystem overhead as float") - return 0, false - } - if filesystemOverhead < 0 || filesystemOverhead > 1 { - log.DefaultLogger().Errorf("Invalid filesystem overhead %f (must be between 0 and 1)", filesystemOverhead) - return 0, false - } - - preferredSize := *disk.Capacity - if isBlock := disk.Source.Dev != ""; !isBlock { - usableSize, err := getUsableDiskSize(getSourceFile(disk)) - if err != nil { - log.DefaultLogger().Reason(err).Error("Failed to get total usable space, using disk capacity instead") - usableSize = preferredSize - } - preferredSize = min(usableSize, preferredSize) - } - - size := int64((1 - filesystemOverhead) * float64(preferredSize)) - size = kutil.AlignImageSizeTo1MiB(size, log.DefaultLogger()) - if size == 0 { - return 0, false - } - return size, true -} - -func getUsableDiskSize(path string) (int64, error) { - var statfs syscall.Statfs_t - err := syscall.Statfs(path, &statfs) - if err != nil { - return int64(-1), err - } - - availableSize := int64(statfs.Bavail) * int64(statfs.Bsize) - diskInfo, err := osdisk.GetDiskInfo(path) - if err != nil { - return int64(-1), err - } - usableSize := diskInfo.ActualSize + availableSize - - return usableSize, nil -} - -func shouldExpandOffline(disk api.Disk) bool { - if !disk.ExpandDisksEnabled { - return false - } - if disk.Source.Dev != "" { - // Block devices don't need to be expanded - return false - } - diskInfo, err := osdisk.GetDiskInfo(getSourceFile(disk)) - if err != nil { - log.DefaultLogger().Reason(err).Warning("Failed to get image info") - return false - } - possibleGuestSize, ok := possibleGuestSize(disk) - if !ok || possibleGuestSize <= diskInfo.VirtualSize { - return false - } - return true -} - -func (l *LibvirtDomainManager) generateConverterContext(vmi *v1.VirtualMachineInstance, allowEmulation bool, options *cmdv1.VirtualMachineOptions, isMigrationTarget bool) (*converter.ConverterContext, error) { - - logger := log.Log.Object(vmi) - - podCPUSet, err := l.cpuSetGetter() - if err != nil { - logger.Reason(err).Error("failed to read pod cpuset.") - return nil, fmt.Errorf("failed to read pod cpuset: %v", err) - } - - hotplugVolumes := make(map[string]v1.VolumeStatus) - permanentVolumes := make(map[string]v1.VolumeStatus) - for _, status := range vmi.Status.VolumeStatus { - if status.HotplugVolume != nil { - hotplugVolumes[status.Name] = status - } else { - permanentVolumes[status.Name] = status - } - } - - // Check if PVC volumes are block volumes - isBlockPVCMap := make(map[string]bool) - isBlockDVMap := make(map[string]bool) - for diskIndex, volume := range vmi.Spec.Volumes { - if volume.VolumeSource.PersistentVolumeClaim != nil || volume.VolumeSource.Ephemeral != nil { - isBlockPVC := false - if _, ok := hotplugVolumes[volume.Name]; ok { - isBlockPVC = isHotplugBlockDeviceVolume(volume.Name) - } else { - isBlockPVC, _ = isBlockDeviceVolume(volume.Name) - } - isBlockPVCMap[volume.Name] = isBlockPVC - } else if volume.VolumeSource.DataVolume != nil { - isBlockDV := false - if _, ok := hotplugVolumes[volume.Name]; ok { - isBlockDV = isHotplugBlockDeviceVolume(volume.Name) - } else { - isBlockDV, _ = isBlockDeviceVolume(volume.Name) - } - isBlockDVMap[volume.Name] = isBlockDV - } - - _, existInCache := l.disksInfo[volume.Name] - if volume.ContainerDisk != nil && !existInCache { - info, err := osdisk.GetDiskInfoWithValidation(containerdisk.GetDiskTargetPathFromLauncherView(diskIndex), l.diskMemoryLimitBytes) - if err != nil { - return nil, fmt.Errorf("failed to get container disk info: %v", err) - } - if err := osdisk.VerifyImage(info); err != nil { - return nil, fmt.Errorf("invalid image in containerDisk %v: %v", volume.Name, err) - } - l.disksInfo[volume.Name] = info - } - } - - var efiConf *converter.EFIConfiguration - if vmi.IsBootloaderEFI() { - secureBoot := vmi.Spec.Domain.Firmware.Bootloader.EFI.SecureBoot == nil || *vmi.Spec.Domain.Firmware.Bootloader.EFI.SecureBoot - sev := kutil.IsSEVVMI(vmi) - - if !l.efiEnvironment.Bootable(secureBoot, sev) { - log.Log.Errorf("EFI OVMF roms missing for booting in EFI mode with SecureBoot=%v, SEV=%v", secureBoot, sev) - return nil, fmt.Errorf("EFI OVMF roms missing for booting in EFI mode with SecureBoot=%v, SEV=%v", secureBoot, sev) - } - - efiConf = &converter.EFIConfiguration{ - EFICode: l.efiEnvironment.EFICode(secureBoot, sev), - EFIVars: l.efiEnvironment.EFIVars(secureBoot, sev), - SecureLoader: secureBoot, - } - } - - // Map the VirtualMachineInstance to the Domain - c := &converter.ConverterContext{ - Architecture: arch.NewConverter(runtime.GOARCH), - VirtualMachine: vmi, - AllowEmulation: allowEmulation, - CPUSet: podCPUSet, - IsBlockPVC: isBlockPVCMap, - IsBlockDV: isBlockDVMap, - EFIConfiguration: efiConf, - UseVirtioTransitional: vmi.Spec.Domain.Devices.UseVirtioTransitional != nil && *vmi.Spec.Domain.Devices.UseVirtioTransitional, - PermanentVolumes: permanentVolumes, - EphemeraldiskCreator: l.ephemeralDiskCreator, - UseLaunchSecurity: kutil.IsSEVVMI(vmi), - FreePageReporting: isFreePageReportingEnabled(false, vmi), - SerialConsoleLog: isSerialConsoleLogEnabled(false, vmi), - } - - if options != nil { - c.ExpandDisksEnabled = options.ExpandDisksEnabled - if options.VirtualMachineSMBios != nil { - c.SMBios = options.VirtualMachineSMBios - } - if options.Topology != nil { - c.Topology = options.Topology - } - c.MemBalloonStatsPeriod = uint(options.MemBalloonStatsPeriod) - // Add preallocated and thick-provisioned volumes for which we need to avoid the discard=unmap option - c.VolumesDiscardIgnore = options.PreallocatedVolumes - - if options.GetClusterConfig() != nil { - c.ExpandDisksEnabled = options.GetClusterConfig().GetExpandDisksEnabled() - c.FreePageReporting = isFreePageReportingEnabled(options.GetClusterConfig().GetFreePageReportingDisabled(), vmi) - c.BochsForEFIGuests = options.GetClusterConfig().GetBochsDisplayForEFIGuests() - c.SerialConsoleLog = isSerialConsoleLogEnabled(options.GetClusterConfig().GetSerialConsoleLogDisabled(), vmi) - } - - c.DomainAttachmentByInterfaceName = options.GetInterfaceDomainAttachment() - } - c.DisksInfo = l.disksInfo - - if !isMigrationTarget { - sriovDevices, err := sriov.CreateHostDevices(vmi) - if err != nil { - return nil, err - } - - c.HotplugVolumes = hotplugVolumes - c.SRIOVDevices = sriovDevices - - genericHostDevices, err := generic.CreateHostDevices(vmi.Spec.Domain.Devices.HostDevices) - if err != nil { - return nil, err - } - c.GenericHostDevices = genericHostDevices - - gpuHostDevices, err := gpu.CreateHostDevices(vmi.Spec.Domain.Devices.GPUs) - if err != nil { - return nil, err - } - c.GPUHostDevices = gpuHostDevices - } - - return c, nil -} - -func isFreePageReportingEnabled(clusterFreePageReportingDisabled bool, vmi *v1.VirtualMachineInstance) bool { - if clusterFreePageReportingDisabled || - (vmi.Spec.Domain.Devices.AutoattachMemBalloon != nil && *vmi.Spec.Domain.Devices.AutoattachMemBalloon == false) || - vmi.IsHighPerformanceVMI() || - vmi.GetAnnotations()[v1.FreePageReportingDisabledAnnotation] == "true" { - return false - } - - return true -} - -func isSerialConsoleLogEnabled(clusterSerialConsoleLogDisabled bool, vmi *v1.VirtualMachineInstance) bool { - return (vmi.Spec.Domain.Devices.LogSerialConsole != nil && *vmi.Spec.Domain.Devices.LogSerialConsole) || (vmi.Spec.Domain.Devices.LogSerialConsole == nil && !clusterSerialConsoleLogDisabled) -} - -func (l *LibvirtDomainManager) SyncVMI(vmi *v1.VirtualMachineInstance, allowEmulation bool, options *cmdv1.VirtualMachineOptions) (*api.DomainSpec, error) { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - logger := log.Log.Object(vmi) - - domain := &api.Domain{} - - if l.imageVolumeFeatureGateEnabled { - err := l.linkImageVolumeFilePaths(vmi) - if err != nil { - logger.Reason(err).Error("failed link ImageVolumeFilePaths") - return nil, err - } - } - - c, err := l.generateConverterContext(vmi, allowEmulation, options, false) - if err != nil { - logger.Reason(err).Error("failed to generate libvirt domain from VMI spec") - return nil, err - } - - if err := converter.Convert_v1_VirtualMachineInstance_To_api_Domain(vmi, domain, c); err != nil { - logger.Error("Conversion failed.") - return nil, err - } - - // Set defaults which are not coming from the cluster - api.NewDefaulter(c.Architecture.GetArchitecture()).SetObjectDefaults_Domain(domain) - - dom, err := l.lookupOrCreateVirDomain(domain, vmi, options) - if err != nil { - return nil, err - } - defer dom.Free() - domState, _, err := dom.GetState() - if err != nil { - logger.Reason(err).Error(failedGetDomainState) - return nil, err - } - - // TODO Suspend, Pause, ..., for now we only support reaching the running state - // TODO for migration and error detection we also need the state change reason - // TODO blocked state - switch { - case cli.IsDown(domState) && !vmi.IsRunning() && !vmi.IsFinal(): - if err := l.startDomain(vmi, dom); err != nil { - return nil, err - } - case cli.IsPaused(domState) && !l.paused.contains(vmi.UID): - // TODO: if state change reason indicates a system error, we could try something smarter - if err := dom.Resume(); err != nil { - logger.Reason(err).Error("unpausing the VirtualMachineInstance failed.") - return nil, err - } - logger.Info("Domain unpaused.") - } - - oldSpec, err := getDomainSpec(dom) - if err != nil { - logger.Reason(err).Error("Parsing domain XML failed.") - return nil, err - } - - if err := l.syncDiskHotplug(domain, oldSpec, dom, vmi); err != nil { - return nil, err - } - - if err := l.syncNetwork(domain, oldSpec, dom, vmi, options); err != nil { - return nil, err - } - - // TODO: check if VirtualMachineInstance Spec and Domain Spec are equal or if we have to sync - return oldSpec, nil -} - -func (l *LibvirtDomainManager) syncDiskHotplug( - domain *api.Domain, - spec *api.DomainSpec, - dom cli.VirDomain, - vmi *v1.VirtualMachineInstance, -) error { - logger := log.Log.Object(vmi) - - // Look up all the disks to detach - for _, detachDisk := range getDetachedDisks(spec.Devices.Disks, domain.Spec.Devices.Disks) { - logger.V(1).Infof("Detaching disk %s, target %s", detachDisk.Alias.GetName(), detachDisk.Target.Device) - detachBytes, err := xml.Marshal(detachDisk) - if err != nil { - logger.Reason(err).Error("marshalling detached disk failed") - return err - } - err = dom.DetachDeviceFlags(strings.ToLower(string(detachBytes)), affectDeviceLiveAndConfigLibvirtFlags) - if err != nil { - logger.Reason(err).Error("detaching device") - return err - } - } - // Look up all the disks to attach - for _, attachDisk := range getAttachedDisks(spec.Devices.Disks, domain.Spec.Devices.Disks) { - allowAttach, err := checkIfDiskReadyToUse(getSourceFile(attachDisk)) - if err != nil { - return err - } - if !allowAttach { - continue - } - logger.V(1).Infof("Attaching disk %s, target %s", attachDisk.Alias.GetName(), attachDisk.Target.Device) - // set drivers cache mode - err = converter.SetDriverCacheMode(&attachDisk, l.directIOChecker) - if err != nil { - return err - } - err = converter.SetOptimalIOMode(&attachDisk) - if err != nil { - return err - } - - attachBytes, err := xml.Marshal(attachDisk) - if err != nil { - logger.Reason(err).Error("marshalling attached disk failed") - return err - } - err = dom.AttachDeviceFlags(strings.ToLower(string(attachBytes)), affectDeviceLiveAndConfigLibvirtFlags) - if err != nil { - logger.Reason(err).Error("attaching device") - return err - } - } - - // Resize and notify the VM about changed disks - for _, disk := range domain.Spec.Devices.Disks { - if shouldExpandOnline(dom, disk) { - possibleGuestSize, ok := possibleGuestSize(disk) - if !ok { - logger.Warningf("Failed to get possible guest size from disk %v", disk) - break - } - err := dom.BlockResize(getSourceFile(disk), uint64(possibleGuestSize), libvirt.DOMAIN_BLOCK_RESIZE_BYTES) - if err != nil { - logger.Reason(err).Errorf("libvirt failed to expand disk image %v", disk) - } - } - } - - return nil -} - -func (l *LibvirtDomainManager) syncNetwork( - domain *api.Domain, - oldSpec *api.DomainSpec, - dom cli.VirDomain, - vmi *v1.VirtualMachineInstance, - options *cmdv1.VirtualMachineOptions, -) error { - if !vmi.IsRunning() { - return nil - } - var domainAttachments map[string]string - if options != nil { - domainAttachments = options.GetInterfaceDomainAttachment() - } - - networkConfigurator := netsetup.NewVMNetworkConfigurator(vmi, cache.CacheCreator{}, netsetup.WithDomainAttachments(domainAttachments)) - networkInterfaceManager := newVirtIOInterfaceManager(dom, networkConfigurator) - if err := networkInterfaceManager.hotplugVirtioInterface(vmi, &api.Domain{Spec: *oldSpec}, domain); err != nil { - return err - } - if err := networkInterfaceManager.hotUnplugVirtioInterface(vmi, &api.Domain{Spec: *oldSpec}); err != nil { - return err - } - if err := networkInterfaceManager.updateDomainLinkState(&api.Domain{Spec: *oldSpec}, domain); err != nil { - return err - } - - return nil -} - -func (l *LibvirtDomainManager) startDomain( - vmi *v1.VirtualMachineInstance, - dom cli.VirDomain, -) error { - logger := log.Log.Object(vmi) - if err := l.generateCloudInitISO(vmi, &dom); err != nil { - return err - } - - createFlags := getDomainCreateFlags(vmi) - if err := dom.CreateWithFlags(createFlags); err != nil { - logger.Reason(err). - Errorf("Failed to start VirtualMachineInstance with flags %v.", createFlags) - return err - } - - logger.Info("Domain started.") - if vmi.ShouldStartPaused() { - l.paused.add(vmi.UID) - } - return nil -} - -func (l *LibvirtDomainManager) lookupOrCreateVirDomain( - domain *api.Domain, - vmi *v1.VirtualMachineInstance, - options *cmdv1.VirtualMachineOptions, -) (cli.VirDomain, error) { - logger := log.Log.Object(vmi) - - dom, err := l.virConn.LookupDomainByName(domain.Spec.Name) - if err == nil { - return dom, nil - } - - if !domainerrors.IsNotFound(err) { - logger.Reason(err).Error(failedGetDomain) - return nil, err - } - - // We need the domain but it does not exist, so create it - if _, err = l.preStartHook(vmi, domain, false, options); err != nil { - logger.Reason(err).Error("pre start setup for VirtualMachineInstance failed.") - return nil, err - } - - setDomainFn := func(v *v1.VirtualMachineInstance, s *api.DomainSpec) (cli.VirDomain, error) { - return l.setDomainSpecWithHooks(v, s) - } - - if dom, err = withNetworkIfacesResources(vmi, &domain.Spec, setDomainFn); err != nil { - return nil, err - } - - l.metadataCache.UID.Set(vmi.UID) - l.metadataCache.GracePeriod.Set( - api.GracePeriodMetadata{DeletionGracePeriodSeconds: converter.GracePeriodSeconds(vmi)}, - ) - logger.Info("Domain defined.") - return dom, err -} - -func getSourceFile(disk api.Disk) string { - file := disk.Source.File - if disk.Source.File == "" { - file = disk.Source.Dev - } - return file -} - -var checkIfDiskReadyToUse = checkIfDiskReadyToUseFunc - -func checkIfDiskReadyToUseFunc(filename string) (bool, error) { - info, err := os.Stat(filename) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return false, nil - } - log.DefaultLogger().V(1).Infof("stat error: %v", err) - return false, err - } - if (info.Mode() & os.ModeDevice) != 0 { - file, err := os.OpenFile(filename, os.O_RDONLY, 0600) - if err != nil { - log.DefaultLogger().V(1).Infof("Unable to open file: %v", err) - return false, nil - } - if err := file.Close(); err != nil { - return false, fmt.Errorf("Unable to close file: %s", file.Name()) - } - return true, nil - } - // Before attempting to attach, ensure we can open the file - file, err := os.OpenFile(filename, os.O_RDWR, 0600) - if err != nil { - return false, nil - } - if err := file.Close(); err != nil { - return false, fmt.Errorf("Unable to close file: %s", file.Name()) - } - return true, nil -} - -func isHotplugDisk(disk api.Disk) bool { - return strings.HasPrefix(getSourceFile(disk), v1.HotplugDiskDir) -} - -func getDetachedDisks(oldDisks, newDisks []api.Disk) []api.Disk { - newDiskMap := make(map[string]api.Disk) - for _, disk := range newDisks { - file := getSourceFile(disk) - if file != "" { - newDiskMap[file] = disk - } - } - res := make([]api.Disk, 0) - for _, oldDisk := range oldDisks { - if !isHotplugDisk(oldDisk) { - continue - } - if _, ok := newDiskMap[getSourceFile(oldDisk)]; !ok { - // This disk got detached, add it to the list - res = append(res, oldDisk) - } - } - return res -} - -func getAttachedDisks(oldDisks, newDisks []api.Disk) []api.Disk { - oldDiskMap := make(map[string]api.Disk) - for _, disk := range oldDisks { - file := getSourceFile(disk) - if file != "" { - oldDiskMap[file] = disk - } - } - res := make([]api.Disk, 0) - for _, newDisk := range newDisks { - if !isHotplugDisk(newDisk) { - continue - } - if _, ok := oldDiskMap[getSourceFile(newDisk)]; !ok { - // This disk got attached, add it to the list - res = append(res, newDisk) - } - } - return res -} - -var isHotplugBlockDeviceVolume = isHotplugBlockDeviceVolumeFunc - -func isHotplugBlockDeviceVolumeFunc(volumeName string) bool { - path := converter.GetHotplugBlockDeviceVolumePath(volumeName) - fileInfo, err := os.Stat(path) - if err == nil { - if (fileInfo.Mode() & os.ModeDevice) != 0 { - return true - } - return false - } - return false -} - -var isBlockDeviceVolume = isBlockDeviceVolumeFunc - -func isBlockDeviceVolumeFunc(volumeName string) (bool, error) { - path := converter.GetBlockDeviceVolumePath(volumeName) - fileInfo, err := os.Stat(path) - if err == nil { - if (fileInfo.Mode() & os.ModeDevice) != 0 { - return true, nil - } - return false, fmt.Errorf("found %v, but it's not a block device", path) - } - if errors.Is(err, os.ErrNotExist) { - // cross check: is it a filesystem volume - path = converter.GetFilesystemVolumePath(volumeName) - fileInfo, err := os.Stat(path) - if err == nil { - if fileInfo.Mode().IsRegular() { - return false, nil - } - return false, fmt.Errorf("found %v, but it's not a regular file", path) - } - if errors.Is(err, os.ErrNotExist) { - return false, fmt.Errorf("neither found block device nor regular file for volume %v", volumeName) - } - } - return false, fmt.Errorf("error checking for block device: %v", err) -} - -func shouldExpandOnline(dom cli.VirDomain, disk api.Disk) bool { - if !disk.ExpandDisksEnabled { - log.DefaultLogger().V(3).Infof("Not expanding disks, ExpandDisks featuregate disabled") - return false - } - blockInfo, err := dom.GetBlockInfo(getSourceFile(disk), 0) - if err != nil { - log.DefaultLogger().Reason(err).Error("Failed to get block info") - return false - } - guestSize := blockInfo.Capacity - possibleGuestSize, ok := possibleGuestSize(disk) - if !ok || possibleGuestSize <= int64(guestSize) { - return false - } - return true -} - -func (l *LibvirtDomainManager) getDomainSpec(dom cli.VirDomain) (*api.DomainSpec, error) { - domainSpec, err := util.GetDomainSpecWithRuntimeInfo(dom) - if err != nil { - // Return without runtime info only for cases we know for sure it's not supposed to be there - if domainerrors.IsNotFound(err) || domainerrors.IsInvalidOperation(err) { - state, _, err := dom.GetState() - if err != nil { - return nil, err - } - return util.GetDomainSpec(state, dom) - } - } - - return domainSpec, err -} - -func removePreviousMemoryDump(dir string) { - files, err := os.ReadDir(dir) - if err != nil { - log.Log.Reason(err).Errorf("failed to remove older memory dumps") - return - } - for _, file := range files { - if strings.Contains(file.Name(), "memory.dump") { - err = os.Remove(filepath.Join(dir, file.Name())) - if err != nil { - log.Log.Reason(err).Errorf("failed to remove older memory dumps") - } - } - } -} - -func (l *LibvirtDomainManager) MemoryDump(vmi *v1.VirtualMachineInstance, dumpPath string) error { - select { - case l.memoryDumpInProgress <- struct{}{}: - default: - log.Log.Object(vmi).Infof("memory-dump is in progress") - return nil - } - - go func() { - defer func() { <-l.memoryDumpInProgress }() - if err := l.memoryDump(vmi, dumpPath); err != nil { - log.Log.Object(vmi).Reason(err).Error(failedDomainMemoryDump) - } - }() - return nil -} - -func (l *LibvirtDomainManager) memoryDump(vmi *v1.VirtualMachineInstance, dumpPath string) error { - logger := log.Log.Object(vmi) - - if l.shouldSkipMemoryDump(dumpPath) { - return nil - } - l.initializeMemoryDumpMetadata(dumpPath) - - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if dom == nil || err != nil { - return err - } - defer dom.Free() - // keep trying to do memory dump even if remove previous one failed - removePreviousMemoryDump(filepath.Dir(dumpPath)) - - logger.Infof("Starting memory dump") - failed := false - reason := "" - err = dom.CoreDumpWithFormat(dumpPath, libvirt.DOMAIN_CORE_DUMP_FORMAT_RAW, libvirt.DUMP_MEMORY_ONLY) - if err != nil { - failed = true - reason = fmt.Sprintf("%s: %s", failedDomainMemoryDump, err) - } else { - logger.Infof("Completed memory dump successfully") - } - - l.setMemoryDumpResult(failed, reason) - return err -} - -func (l *LibvirtDomainManager) shouldSkipMemoryDump(dumpPath string) bool { - memoryDumpMetadata, _ := l.metadataCache.MemoryDump.Load() - if memoryDumpMetadata.FileName == filepath.Base(dumpPath) { - // memory dump still in progress or have just completed - // no need to trigger another one - return true - } - return false -} - -func (l *LibvirtDomainManager) initializeMemoryDumpMetadata(dumpPath string) { - l.metadataCache.MemoryDump.WithSafeBlock(func(memoryDumpMetadata *api.MemoryDumpMetadata, initialized bool) { - now := metav1.Now() - *memoryDumpMetadata = api.MemoryDumpMetadata{ - FileName: filepath.Base(dumpPath), - StartTimestamp: &now, - } - }) - log.Log.V(4).Infof("initialize memory dump metadata: %s", l.metadataCache.MemoryDump.String()) -} - -func (l *LibvirtDomainManager) setMemoryDumpResult(failed bool, reason string) { - l.metadataCache.MemoryDump.WithSafeBlock(func(memoryDumpMetadata *api.MemoryDumpMetadata, initialized bool) { - if !initialized { - // nothing to report if memory dump metadata is empty - return - } - - now := metav1.Now() - memoryDumpMetadata.Completed = true - memoryDumpMetadata.EndTimestamp = &now - memoryDumpMetadata.Failed = failed - memoryDumpMetadata.FailureReason = reason - }) - log.Log.V(4).Infof("set memory dump results in metadata: %s", l.metadataCache.MemoryDump.String()) - return -} - -func (l *LibvirtDomainManager) PauseVMI(vmi *v1.VirtualMachineInstance) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - logger := log.Log.Object(vmi) - - domName := util.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - // If the VirtualMachineInstance does not exist, we are done - if domainerrors.IsNotFound(err) { - return fmt.Errorf("Domain not found.") - } else { - logger.Reason(err).Error("Getting the domain failed during pause.") - return err - } - } - defer dom.Free() - - domState, _, err := dom.GetState() - if err != nil { - logger.Reason(err).Error(failedGetDomainState) - return err - } - - if domState == libvirt.DOMAIN_RUNNING { - err = dom.Suspend() - if err != nil { - logger.Reason(err).Error("Signalling suspension failed.") - return err - } - logger.Infof("Signaled pause for %s", vmi.GetObjectMeta().GetName()) - l.paused.add(vmi.UID) - } else { - logger.Infof("Domain is not running for %s", vmi.GetObjectMeta().GetName()) - } - - return nil -} - -func (l *LibvirtDomainManager) UnpauseVMI(vmi *v1.VirtualMachineInstance) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - logger := log.Log.Object(vmi) - - domName := util.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - // If the VirtualMachineInstance does not exist, we are done - if domainerrors.IsNotFound(err) { - return fmt.Errorf("Domain not found.") - } else { - logger.Reason(err).Error("Getting the domain failed during unpause.") - return err - } - } - defer dom.Free() - - domState, _, err := dom.GetState() - if err != nil { - logger.Reason(err).Error(failedGetDomainState) - return err - } - - if domState == libvirt.DOMAIN_PAUSED { - err = dom.Resume() - if err != nil { - logger.Reason(err).Error("Signalling unpause failed.") - return err - } - logger.Infof("Signaled unpause for %s", vmi.GetObjectMeta().GetName()) - l.paused.remove(vmi.UID) - // Try to set guest time after this commands execution. - // This operation is not disruptive. - if err := l.setGuestTime(vmi); err != nil { - return err - } - - } else { - logger.Infof("Domain is not paused for %s", vmi.GetObjectMeta().GetName()) - } - - return nil -} - -func (l *LibvirtDomainManager) migrationInProgress() bool { - migrationMetadata, exists := l.metadataCache.Migration.Load() - return exists && migrationMetadata.StartTimestamp != nil && migrationMetadata.EndTimestamp == nil -} - -func (l *LibvirtDomainManager) scheduleSafetyVMIUnfreeze(vmi *v1.VirtualMachineInstance, unfreezeTimeout time.Duration) { - select { - case <-time.After(unfreezeTimeout): - log.Log.Warningf("Unfreeze was not called for vmi %s for more then %v, initiating unfreeze", - vmi.Name, unfreezeTimeout) - l.UnfreezeVMI(vmi) - case <-l.cancelSafetyUnfreezeChan: - log.Log.V(3).Infof("Canceling schedualed Unfreeze for vmi %s", vmi.Name) - // aborted - } -} - -func (l *LibvirtDomainManager) cancelSafetyUnfreeze() { - select { - case l.cancelSafetyUnfreezeChan <- struct{}{}: - default: - } -} - -func (l *LibvirtDomainManager) getParsedFSStatus(domainName string) (string, error) { - cmdResult, err := l.virConn.QemuAgentCommand(`{"execute":"`+string(agentpoller.GetFSFreezeStatus)+`"}`, domainName) - if err != nil { - return "", err - } - fsfreezeStatus, err := agentpoller.ParseFSFreezeStatus(cmdResult) - if err != nil { - return "", err - } - - return fsfreezeStatus.Status, nil -} - -func (l *LibvirtDomainManager) FreezeVMI(vmi *v1.VirtualMachineInstance, unfreezeTimeoutSeconds int32) error { - if l.migrationInProgress() { - return fmt.Errorf("Failed to freeze VMI, VMI is currently during migration") - } - domainName := api.VMINamespaceKeyFunc(vmi) - safetyUnfreezeTimeout := time.Duration(unfreezeTimeoutSeconds) * time.Second - - fsfreezeStatus, err := l.getParsedFSStatus(domainName) - if err != nil { - log.Log.Errorf("Failed to get fs status before freeze vmi %s, %s", vmi.Name, err.Error()) - return err - } - - // idempotent - prevent failure in case fs is already frozen - if fsfreezeStatus == api.FSFrozen { - return nil - } - - // The fsfreeze doesn't apply to the TPM, so we can at least do a fsync to the state - // directory to ensure data integrity. This explicit sync ensures that pending - // writes to the swtpm backing files are flushed to disk. - if tpm.HasPersistentDevice(&vmi.Spec) { - cmd := exec.Command("/usr/bin/sync", services.PathForSwtpm(vmi)) - out, err := cmd.CombinedOutput() - if err != nil { - log.Log.Errorf("fsync error to TPM state directory: %s, output: %s", err.Error(), out) - return err - } - } - - domain, err := l.virConn.LookupDomainByName(domainName) - if err != nil { - log.Log.Errorf("Domain lookup failed: %v", err) - return err - } - defer domain.Free() - - if err := domain.FSFreeze(nil, 0); err != nil { - log.Log.Errorf("Failed to freeze vmi, %s", err.Error()) - return err - } - - l.cancelSafetyUnfreeze() - if safetyUnfreezeTimeout != 0 { - go l.scheduleSafetyVMIUnfreeze(vmi, safetyUnfreezeTimeout) - } - return nil -} - -func (l *LibvirtDomainManager) UnfreezeVMI(vmi *v1.VirtualMachineInstance) error { - l.cancelSafetyUnfreeze() - domainName := api.VMINamespaceKeyFunc(vmi) - fsfreezeStatus, err := l.getParsedFSStatus(domainName) - if err == nil { - // prevent initating fs thaw to prevent rerunning the thaw hook - if fsfreezeStatus == api.FSThawed { - return nil - } - } - - domain, err := l.virConn.LookupDomainByName(domainName) - if err != nil { - log.Log.Errorf("Domain lookup failed: %v", err) - return err - } - defer domain.Free() - - if err := domain.FSThaw(nil, 0); err != nil { - log.Log.Errorf("Failed to unfreeze vmi, %s", err.Error()) - return err - } - return nil -} - -func (l *LibvirtDomainManager) ResetVMI(vmi *v1.VirtualMachineInstance) error { - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - log.Log.Object(vmi).Reason(err).Error("Getting the domain for reset failed.") - return err - } - - defer dom.Free() - if err = dom.Reset(0); err != nil { - log.Log.Object(vmi).Reason(err).Error("Resetting the domain failed.") - return err - } - - return nil -} - -func (l *LibvirtDomainManager) SoftRebootVMI(vmi *v1.VirtualMachineInstance) error { - domainRebootFlagValues := libvirt.DOMAIN_REBOOT_GUEST_AGENT - condManager := controller.NewVirtualMachineInstanceConditionManager() - if !condManager.HasConditionWithStatus(vmi, v1.VirtualMachineInstanceAgentConnected, k8sv1.ConditionTrue) { - if features := vmi.Spec.Domain.Features; features != nil && features.ACPI.Enabled != nil && !(*features.ACPI.Enabled) { - err := fmt.Errorf("VMI neither have the agent connected nor the ACPI feature enabled") - log.Log.Object(vmi).Reason(err).Error("Setting the domain reboot flag failed.") - return err - } - domainRebootFlagValues = libvirt.DOMAIN_REBOOT_ACPI_POWER_BTN - } - - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - log.Log.Object(vmi).Reason(err).Error("Getting the domain for soft reboot failed.") - return err - } - - defer dom.Free() - if err = dom.Reboot(domainRebootFlagValues); err != nil { - libvirtError, ok := err.(libvirt.Error) - if !ok || libvirtError.Code != libvirt.ERR_AGENT_UNRESPONSIVE { - log.Log.Object(vmi).Reason(err).Error("Soft rebooting the domain failed.") - return err - } - } - - return nil -} - -func (l *LibvirtDomainManager) MarkGracefulShutdownVMI() { - l.metadataCache.GracePeriod.WithSafeBlock(func(gracePeriodMetadata *api.GracePeriodMetadata, _ bool) { - gracePeriodMetadata.MarkedForGracefulShutdown = pointer.P(true) - }) - log.Log.V(4).Infof("Marked for graceful shutdown in metadata: %s", l.metadataCache.GracePeriod.String()) -} - -func (l *LibvirtDomainManager) SignalShutdownVMI(vmi *v1.VirtualMachineInstance) error { - l.domainModifyLock.Lock() - defer l.domainModifyLock.Unlock() - - domName := util.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - // If the VirtualMachineInstance does not exist, we are done - if domainerrors.IsNotFound(err) { - return nil - } else { - log.Log.Object(vmi).Reason(err).Error("Getting the domain failed during graceful shutdown.") - return err - } - } - defer dom.Free() - - domState, _, err := dom.GetState() - if err != nil { - log.Log.Object(vmi).Reason(err).Error(failedGetDomainState) - return err - } - - if domState == libvirt.DOMAIN_RUNNING || domState == libvirt.DOMAIN_PAUSED { - err = dom.ShutdownFlags(libvirt.DOMAIN_SHUTDOWN_DEFAULT) - if err != nil { - log.Log.Object(vmi).Reason(err).Error("Signalling graceful shutdown failed.") - return err - } - log.Log.Object(vmi).Infof("Signaled graceful shutdown for %s", vmi.GetObjectMeta().GetName()) - - l.metadataCache.GracePeriod.WithSafeBlock(func(gracePeriodMetadata *api.GracePeriodMetadata, _ bool) { - if gracePeriodMetadata.DeletionTimestamp == nil { - now := metav1.Now() - gracePeriodMetadata.DeletionTimestamp = &now - } - }) - log.Log.V(4).Infof("Graceful period set in metadata: %s", l.metadataCache.GracePeriod.String()) - } - - return nil -} - -func (l *LibvirtDomainManager) KillVMI(vmi *v1.VirtualMachineInstance) error { - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - // If the VirtualMachineInstance does not exist, we are done - if domainerrors.IsNotFound(err) { - return nil - } else { - log.Log.Object(vmi).Reason(err).Error(failedGetDomain) - return err - } - } - defer dom.Free() - // TODO: Graceful shutdown - domState, _, err := dom.GetState() - if err != nil { - if domainerrors.IsNotFound(err) { - return nil - } - log.Log.Object(vmi).Reason(err).Error(failedGetDomainState) - return err - } - - if domState == libvirt.DOMAIN_RUNNING || domState == libvirt.DOMAIN_PAUSED || domState == libvirt.DOMAIN_SHUTDOWN { - err = dom.DestroyFlags(libvirt.DOMAIN_DESTROY_GRACEFUL) - if err != nil { - if domainerrors.IsNotFound(err) { - return nil - } - log.Log.Object(vmi).Reason(err).Error("Destroying the domain state failed.") - return err - } - log.Log.Object(vmi).Info("Domain stopped.") - return nil - } - - log.Log.Object(vmi).Info("Domain not running, paused or shut down, nothing to do.") - return nil -} - -func (l *LibvirtDomainManager) DeleteVMI(vmi *v1.VirtualMachineInstance) error { - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - // If the domain does not exist, we are done - if domainerrors.IsNotFound(err) { - return nil - } else { - log.Log.Object(vmi).Reason(err).Error(failedGetDomain) - return err - } - } - defer dom.Free() - - err = dom.UndefineFlags(libvirt.DOMAIN_UNDEFINE_KEEP_NVRAM) - if err != nil { - log.Log.Object(vmi).Reason(err).Error("Undefining the domain failed.") - return err - } - log.Log.Object(vmi).Info("Domain undefined.") - return nil -} - -func (l *LibvirtDomainManager) ListAllDomains() ([]*api.Domain, error) { - - doms, err := l.virConn.ListAllDomains(libvirt.CONNECT_LIST_DOMAINS_ACTIVE | libvirt.CONNECT_LIST_DOMAINS_INACTIVE) - if err != nil { - return nil, err - } - // Free memory allocated for domains - defer func() { - for i := range doms { - err := doms[i].Free() - if err != nil { - log.Log.Reason(err).Warning("Error freeing a domain") - } - } - }() - - var list []*api.Domain - for _, dom := range doms { - domain, err := util.NewDomain(dom) - if err != nil { - if domainerrors.IsNotFound(err) { - continue - } - return list, err - } - spec, err := l.getDomainSpec(dom) - if err != nil { - if domainerrors.IsNotFound(err) { - continue - } - return list, err - } - spec.Metadata.KubeVirt = metadata.LoadKubevirtMetadata(l.metadataCache) - domain.Spec = *spec - status, reason, err := dom.GetState() - if err != nil { - if domainerrors.IsNotFound(err) { - continue - } - return list, err - } - domain.SetState(util.ConvState(status), util.ConvReason(status, reason)) - list = append(list, domain) - } - - return list, nil -} - -func (l *LibvirtDomainManager) setDomainSpecWithHooks(vmi *v1.VirtualMachineInstance, origSpec *api.DomainSpec) (cli.VirDomain, error) { - return util.SetDomainSpecStrWithHooks(l.virConn, vmi, origSpec) -} - -func (l *LibvirtDomainManager) GetQemuVersion() (string, error) { - return l.virConn.GetQemuVersion() -} - -func (l *LibvirtDomainManager) GetDomainStats() (*stats.DomainStats, error) { - return l.domainStatsCache.Get() -} - -func (l *LibvirtDomainManager) GetDomainDirtyRateStats(calculationDuration time.Duration) (*stats.DomainStatsDirtyRate, error) { - const minCalculationDuration = time.Second - - if calculationDuration < minCalculationDuration { - calculationDuration = minCalculationDuration - } - - generateRecalcFunc := func(calculationDuration time.Duration) func() (*stats.DomainStatsDirtyRate, error) { - return func() (*stats.DomainStatsDirtyRate, error) { - list, err := l.getDomainDirtyRateStats(calculationDuration) - if err != nil { - return nil, err - } - - if len(list) == 0 { - return nil, nil - } - - return list[0], nil - } - } - - if l.domainDirtyRateStatsCache == nil { - var err error - l.domainDirtyRateStatsCache, err = virtcache.NewTimeDefinedCache(3*time.Second, true, generateRecalcFunc(calculationDuration)) - if err != nil { - return nil, fmt.Errorf("failed to create domain dirty rate stats cache: %v", err) - } - } - - // If there's a cached dirty rate stat and the minRefreshDuration hadn't passed, the - // cache will not be refreshed and the recalc will kick in only during re-calculation. - l.domainDirtyRateStatsCache.SetReCalcFunc(generateRecalcFunc(calculationDuration)) - - dirtyRateStats, err := l.domainDirtyRateStatsCache.Get() - if err != nil { - return nil, fmt.Errorf("failed to get domain dirty rate stats: %v", err) - } - - return dirtyRateStats, nil -} - -func (l *LibvirtDomainManager) getDomainStats() ([]*stats.DomainStats, error) { - statsTypes := libvirt.DOMAIN_STATS_BALLOON | libvirt.DOMAIN_STATS_CPU_TOTAL | libvirt.DOMAIN_STATS_VCPU | libvirt.DOMAIN_STATS_INTERFACE | libvirt.DOMAIN_STATS_BLOCK | libvirt.DOMAIN_STATS_DIRTYRATE - flags := libvirt.CONNECT_GET_ALL_DOMAINS_STATS_RUNNING | libvirt.CONNECT_GET_ALL_DOMAINS_STATS_PAUSED - - return l.virConn.GetDomainStats(statsTypes, l.migrateInfoStats, flags) -} - -func (l *LibvirtDomainManager) getDomainDirtyRateStats(calculationDuration time.Duration) ([]*stats.DomainStatsDirtyRate, error) { - return l.virConn.GetDomainDirtyRate(calculationDuration, libvirt.DOMAIN_DIRTYRATE_MODE_PAGE_SAMPLING) -} - -func formatPCIAddressStr(address *api.Address) string { - return fmt.Sprintf("%s:%s:%s.%s", address.Domain[2:], address.Bus[2:], address.Slot[2:], address.Function[2:]) -} - -func addToDeviceMetadata(metadataType cloudinit.DeviceMetadataType, address *api.Address, mac string, tag string, devicesMetadata []cloudinit.DeviceData, numa *uint32, numaAlignedCPUs []uint32) []cloudinit.DeviceData { - pciAddrStr := formatPCIAddressStr(address) - deviceData := cloudinit.DeviceData{ - Type: metadataType, - Bus: address.Type, - Address: pciAddrStr, - MAC: mac, - Tags: []string{tag}, - } - if numa != nil { - deviceData.NumaNode = *numa - } - if len(numaAlignedCPUs) > 0 { - deviceData.AlignedCPUs = numaAlignedCPUs - } - devicesMetadata = append(devicesMetadata, deviceData) - return devicesMetadata -} - -func getDeviceNUMACPUAffinity(dev api.HostDevice, vmi *v1.VirtualMachineInstance, domainSpec *api.DomainSpec) (numaNodePtr *uint32, cpuList []uint32) { - if dev.Source.Address != nil { - pciAddress := formatPCIAddressStr(dev.Source.Address) - if vmi.Spec.Domain.CPU.NUMA != nil && vmi.Spec.Domain.CPU.NUMA.GuestMappingPassthrough != nil { - if numa, err := hardware.GetDeviceNumaNode(pciAddress); err == nil { - numaNodePtr = numa - return - } - } else if vmi.IsCPUDedicated() { - if vCPUList, err := hardware.LookupDeviceVCPUAffinity(pciAddress, domainSpec); err == nil { - cpuList = vCPUList - return - } - } - } - return -} - -func (l *LibvirtDomainManager) buildDevicesMetadata(vmi *v1.VirtualMachineInstance, dom cli.VirDomain) ([]cloudinit.DeviceData, error) { - taggedInterfaces := make(map[string]v1.Interface) - taggedHostDevices := make(map[string]v1.HostDevice) - taggedGPUs := make(map[string]v1.GPU) - var devicesMetadata []cloudinit.DeviceData - - // Get all tagged interfaces for lookup - for _, vif := range vmi.Spec.Domain.Devices.Interfaces { - if vif.Tag != "" { - taggedInterfaces[vif.Name] = vif - } - } - - // Get all tagged host devices for lookup - for _, dev := range vmi.Spec.Domain.Devices.HostDevices { - if dev.Tag != "" { - taggedHostDevices[dev.Name] = dev - } - } - - // Get all tagged gpus for lookup - for _, dev := range vmi.Spec.Domain.Devices.GPUs { - if dev.Tag != "" { - taggedGPUs[dev.Name] = dev - } - } - - domainSpec, err := getDomainSpec(dom) - if err != nil { - return nil, err - } - devices := domainSpec.Devices - interfaces := devices.Interfaces - for _, nic := range interfaces { - if data, exist := taggedInterfaces[nic.Alias.GetName()]; exist { - var mac string - if nic.MAC != nil { - mac = nic.MAC.MAC - } - // currently network Interfaces do not contain host devices thus have no NUMA alignment. - deviceAlignedCPUs := []uint32{} - devicesMetadata = addToDeviceMetadata(cloudinit.NICMetadataType, - nic.Address, - mac, - data.Tag, - devicesMetadata, - nil, - deviceAlignedCPUs, - ) - } - } - - hostDevices := devices.HostDevices - for _, dev := range hostDevices { - devAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), netsriov.SRIOVAliasPrefix) - hostDevAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), generic.AliasPrefix) - gpuDevAliasNoPrefix := strings.TrimPrefix(dev.Alias.GetName(), gpu.AliasPrefix) - if data, exist := taggedInterfaces[devAliasNoPrefix]; exist { - deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) - devicesMetadata = addToDeviceMetadata(cloudinit.NICMetadataType, - dev.Address, - "", - data.Tag, - devicesMetadata, - deviceNumaNode, - deviceAlignedCPUs, - ) - } - if data, exist := taggedHostDevices[hostDevAliasNoPrefix]; exist { - deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) - devicesMetadata = addToDeviceMetadata(cloudinit.HostDevMetadataType, - dev.Address, - "", - data.Tag, - devicesMetadata, - deviceNumaNode, - deviceAlignedCPUs, - ) - } - if data, exist := taggedHostDevices[gpuDevAliasNoPrefix]; exist { - deviceNumaNode, deviceAlignedCPUs := getDeviceNUMACPUAffinity(dev, vmi, domainSpec) - devicesMetadata = addToDeviceMetadata(cloudinit.HostDevMetadataType, - dev.Address, - "", - data.Tag, - devicesMetadata, - deviceNumaNode, - deviceAlignedCPUs, - ) - } - } - return devicesMetadata, nil -} - -// GetGuestInfo queries the agent store and return the aggregated data from Guest agent -func (l *LibvirtDomainManager) GetGuestInfo() v1.VirtualMachineInstanceGuestAgentInfo { - sysInfo := l.agentData.GetSysInfo() - fsInfo := l.agentData.GetFS(10) - userInfo := l.agentData.GetUsers(10) - var fsFreezestatus api.FSFreeze - if status := l.agentData.GetFSFreezeStatus(); status != nil { - fsFreezestatus = *status - } - - gaInfo := l.agentData.GetGA() - - guestInfo := v1.VirtualMachineInstanceGuestAgentInfo{ - GAVersion: gaInfo.Version, - SupportedCommands: gaInfo.SupportedCommands, - Hostname: sysInfo.Hostname, - FSFreezeStatus: fsFreezestatus.Status, - OS: v1.VirtualMachineInstanceGuestOSInfo{ - Name: sysInfo.OSInfo.Name, - KernelRelease: sysInfo.OSInfo.KernelRelease, - Version: sysInfo.OSInfo.Version, - PrettyName: sysInfo.OSInfo.PrettyName, - VersionID: sysInfo.OSInfo.VersionId, - KernelVersion: sysInfo.OSInfo.KernelVersion, - Machine: sysInfo.OSInfo.Machine, - ID: sysInfo.OSInfo.Id, - }, - Timezone: fmt.Sprintf("%s, %d", sysInfo.Timezone.Zone, sysInfo.Timezone.Offset), - } - - for _, user := range userInfo { - guestInfo.UserList = append(guestInfo.UserList, v1.VirtualMachineInstanceGuestOSUser{ - UserName: user.Name, - Domain: user.Domain, - LoginTime: user.LoginTime, - }) - } - - for _, fs := range fsInfo { - guestInfo.FSInfo.Filesystems = append(guestInfo.FSInfo.Filesystems, v1.VirtualMachineInstanceFileSystem{ - DiskName: fs.Name, - MountPoint: fs.Mountpoint, - FileSystemType: fs.Type, - UsedBytes: fs.UsedBytes, - TotalBytes: fs.TotalBytes, - Disk: l.parseFSDisks(fs.Disk), - }) - } - - return guestInfo -} - -// InterfacesStatus returns the interfaces Guest Agent reported -func (l *LibvirtDomainManager) InterfacesStatus() []api.InterfaceStatus { - return l.agentData.GetInterfaceStatus() -} - -// GetGuestOSInfo returns the Guest OS version and architecture -func (l *LibvirtDomainManager) GetGuestOSInfo() *api.GuestOSInfo { - return l.agentData.GetGuestOSInfo() -} - -// GetUsers return the full list of users on the guest machine -func (l *LibvirtDomainManager) GetUsers() []v1.VirtualMachineInstanceGuestOSUser { - userInfo := l.agentData.GetUsers(-1) - userList := []v1.VirtualMachineInstanceGuestOSUser{} - - for _, user := range userInfo { - userList = append(userList, v1.VirtualMachineInstanceGuestOSUser{ - UserName: user.Name, - Domain: user.Domain, - LoginTime: user.LoginTime, - }) - } - - return userList -} - -// GetFilesystems return the full list of filesystems on the guest machine -func (l *LibvirtDomainManager) GetFilesystems() []v1.VirtualMachineInstanceFileSystem { - fsInfo := l.agentData.GetFS(-1) - fsList := []v1.VirtualMachineInstanceFileSystem{} - - for _, fs := range fsInfo { - fsList = append(fsList, v1.VirtualMachineInstanceFileSystem{ - DiskName: fs.Name, - MountPoint: fs.Mountpoint, - FileSystemType: fs.Type, - UsedBytes: fs.UsedBytes, - TotalBytes: fs.TotalBytes, - Disk: l.parseFSDisks(fs.Disk), - }) - } - - return fsList -} - -func (l *LibvirtDomainManager) GetSEVInfo() (*v1.SEVPlatformInfo, error) { - sevNodeParameters, err := l.virConn.GetSEVInfo() - if err != nil { - log.Log.Reason(err).Error("Getting SEV platform info failed") - return nil, err - } - - return &v1.SEVPlatformInfo{ - PDH: sevNodeParameters.PDH, - CertChain: sevNodeParameters.CertChain, - }, nil -} - -func (l *LibvirtDomainManager) GetLaunchMeasurement(vmi *v1.VirtualMachineInstance) (*v1.SEVMeasurementInfo, error) { - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - log.Log.Object(vmi).Reason(err).Error(failedGetDomain) - return nil, err - } - defer dom.Free() - - const flags = uint32(0) - domainLaunchSecurityParameters, err := dom.GetLaunchSecurityInfo(flags) - if err != nil { - log.Log.Object(vmi).Reason(err).Error("Getting launch security info failed") - return nil, err - } - - sevMeasurementInfo := v1.SEVMeasurementInfo{} - if domainLaunchSecurityParameters.SEVMeasurementSet { - sevMeasurementInfo.Measurement = domainLaunchSecurityParameters.SEVMeasurement - } - if domainLaunchSecurityParameters.SEVAPIMajorSet { - sevMeasurementInfo.APIMajor = domainLaunchSecurityParameters.SEVAPIMajor - } - if domainLaunchSecurityParameters.SEVAPIMinorSet { - sevMeasurementInfo.APIMinor = domainLaunchSecurityParameters.SEVAPIMinor - } - if domainLaunchSecurityParameters.SEVBuildIDSet { - sevMeasurementInfo.BuildID = domainLaunchSecurityParameters.SEVBuildID - } - if domainLaunchSecurityParameters.SEVPolicySet { - sevMeasurementInfo.Policy = domainLaunchSecurityParameters.SEVPolicy - } - - loader := l.efiEnvironment.EFICode(false, true) // no secureBoot, with sev - f, err := os.Open(loader) - if err != nil { - log.Log.Object(vmi).Reason(err).Errorf("Error opening loader binary %s", loader) - return nil, err - } - defer f.Close() - - h := sha256.New() - if _, err := io.Copy(h, f); err != nil { - log.Log.Object(vmi).Reason(err).Errorf("Error reading loader binary %s", loader) - return nil, err - } - - sevMeasurementInfo.LoaderSHA = fmt.Sprintf("%x", h.Sum(nil)) - - return &sevMeasurementInfo, nil -} - -func (l *LibvirtDomainManager) InjectLaunchSecret(vmi *v1.VirtualMachineInstance, sevSecretOptions *v1.SEVSecretOptions) error { - if sevSecretOptions.Header == "" { - return fmt.Errorf("Header is required") - } else if sevSecretOptions.Secret == "" { - return fmt.Errorf("Secret is required") - } - - domName := api.VMINamespaceKeyFunc(vmi) - dom, err := l.virConn.LookupDomainByName(domName) - if err != nil { - log.Log.Object(vmi).Reason(err).Error(failedGetDomain) - return err - } - defer dom.Free() - - domainLaunchSecurityStateParameters := &libvirt.DomainLaunchSecurityStateParameters{ - SEVSecret: sevSecretOptions.Secret, - SEVSecretSet: true, - SEVSecretHeader: sevSecretOptions.Header, - SEVSecretHeaderSet: true, - } - - const flags = uint32(0) - if err := dom.SetLaunchSecurityState(domainLaunchSecurityStateParameters, flags); err != nil { - log.Log.Object(vmi).Reason(err).Error("Setting launch security state failed") - return err - } - - return nil -} - -func (l *LibvirtDomainManager) parseFSDisks(fsDisks []api.FSDisk) []v1.VirtualMachineInstanceFileSystemDisk { - disks := []v1.VirtualMachineInstanceFileSystemDisk{} - for _, fsDisk := range fsDisks { - disks = append(disks, v1.VirtualMachineInstanceFileSystemDisk{ - Serial: fsDisk.Serial, - BusType: fsDisk.BusType, - }) - } - - return disks -} - -// linkImageVolumeFilePaths creates symbolic links for container disk files and kernel boot artifacts -// from the image volume view to the appropriate known paths in the launcher view. -func (l *LibvirtDomainManager) linkImageVolumeFilePaths(vmi *v1.VirtualMachineInstance) error { - for volumeIndex, volume := range vmi.Spec.Volumes { - if volume.ContainerDisk == nil { - continue - } - backingFile := containerdisk.GetDiskTargetPathFromLauncherView(volumeIndex) - fileToSoftLink, err := getDiskTargetPathFromImageVolumeView(volumeIndex, volume.ContainerDisk.Path) - if err != nil { - return fmt.Errorf("failed to find disk file from ImageVolume: %v", err) - } - err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), backingFile) - if err != nil && !os.IsExist(err) { - return fmt.Errorf("error creating symlink for containerDisk: %v", err) - } - } - - if kutil.HasKernelBootContainerImage(vmi) { - kb := vmi.Spec.Domain.Firmware.KernelBoot - - err := os.MkdirAll(containerdisk.GetKernelBootArtifactPathFromLauncherView(""), 0755) - if err != nil { - return fmt.Errorf("error creating dir for KernelPath: %v", err) - } - log.Log.Object(vmi).Infof("kernel boot defined for VMI. Converting to domain XML") - if kb.Container.KernelPath != "" { - kernelPath := containerdisk.GetKernelBootArtifactPathFromLauncherView(kb.Container.KernelPath) - fileToSoftLink, err := getKernelBootArtifactPathFromImageVolumeView(kb.Container.KernelPath) - if err != nil { - return fmt.Errorf("error getting kernel boot artifact path from ImageVolume: %v", err) - } - err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), kernelPath) - if err != nil && !os.IsExist(err) { - return fmt.Errorf("error creating symlink for KernelPath: %v", err) - } - } - - if kb.Container.InitrdPath != "" { - initrdPath := containerdisk.GetKernelBootArtifactPathFromLauncherView(kb.Container.InitrdPath) - fileToSoftLink, err := getKernelBootArtifactPathFromImageVolumeView(kb.Container.InitrdPath) - if err != nil { - return fmt.Errorf("error getting kernel boot artifact path from ImageVolume: %v", err) - } - err = os.Symlink(unsafepath.UnsafeAbsolute(fileToSoftLink.Raw()), initrdPath) - if err != nil && !os.IsExist(err) { - return fmt.Errorf("error creating symlink for KernelPath: %v", err) - } - } - } - - return nil -} - -func getDiskTargetPathFromImageVolumeView(volumeIndex int, volumePath string) (*safepath.Path, error) { - if volumePath != "" { - return safepath.JoinAndResolveWithRelativeRoot(kutil.VirtImageVolumeDir, fmt.Sprintf("disk_%d", volumeIndex), volumePath) - } - imageVolumeDir := filepath.Join(kutil.VirtImageVolumeDir, fmt.Sprintf("disk_%d", volumeIndex), osdisk.DiskSourceFallbackPath) - files, err := os.ReadDir(imageVolumeDir) - if err != nil { - return nil, fmt.Errorf("failed to check ImageVolume path %s: %v", imageVolumeDir, err) - } - if len(files) == 0 { - return nil, fmt.Errorf("no file found in folder %s, no disk present", imageVolumeDir) - } else if len(files) > 1 { - return nil, fmt.Errorf("more than one file found in folder %s, only one disk is allowed", imageVolumeDir) - } - return safepath.JoinAndResolveWithRelativeRoot(imageVolumeDir, files[0].Name()) -} - -func getKernelBootArtifactPathFromImageVolumeView(artifact string) (*safepath.Path, error) { - return safepath.JoinAndResolveWithRelativeRoot(kutil.VirtKernelBootVolumeDir, artifact) -} - -// check whether VMI has a certain condition -func vmiHasCondition(vmi *v1.VirtualMachineInstance, cond v1.VirtualMachineInstanceConditionType) bool { - if vmi == nil { - return false - } - - for _, c := range vmi.Status.Conditions { - if c.Type == cond { - return true - } - } - return false -} - -func isDomainPaused(dom cli.VirDomain) (bool, error) { - status, reason, err := dom.GetState() - if err != nil { - return false, err - } - return util.ConvState(status) == api.Paused && - util.ConvReason(status, reason) == api.ReasonPausedUser, nil -} - -func getDomainCreateFlags(vmi *v1.VirtualMachineInstance) libvirt.DomainCreateFlags { - flags := libvirt.DOMAIN_NONE - - if vmi.ShouldStartPaused() { - flags |= libvirt.DOMAIN_START_PAUSED - } - if vmi.IsCPUDedicated() && vmi.Spec.Domain.CPU.IsolateEmulatorThread { - flags |= libvirt.DOMAIN_START_PAUSED - } - return flags -} From 3448267117aef56859b75c476faae905454ddab8 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 12:37:44 -0700 Subject: [PATCH 4/8] [UNSTABLE] Partition notify-client --- pkg/virt-handler/cache/cache_test.go | 2 +- pkg/virt-handler/vm_test.go | 8 +- .../notify-client/BUILD.bazel | 62 +++ .../notify-client/client.go | 376 ++++++++++++++++++ .../notify-client/client_suite_test.go | 11 + .../notify-client/notify_test.go | 15 +- pkg/virt-launcher/notify-client/client.go | 353 +--------------- 7 files changed, 474 insertions(+), 353 deletions(-) create mode 100644 pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel create mode 100644 pkg/virt-launcher-libvirt-qemu/notify-client/client.go create mode 100644 pkg/virt-launcher-libvirt-qemu/notify-client/client_suite_test.go rename pkg/{virt-launcher => virt-launcher-libvirt-qemu}/notify-client/notify_test.go (96%) diff --git a/pkg/virt-handler/cache/cache_test.go b/pkg/virt-handler/cache/cache_test.go index ff39788e0dee..b3ea5ecaba3b 100644 --- a/pkg/virt-handler/cache/cache_test.go +++ b/pkg/virt-handler/cache/cache_test.go @@ -414,7 +414,7 @@ var _ = Describe("Domain informer", func() { runInformer(wg, stopChan, informer) cache.WaitForCacheSync(stopChan, informer.HasSynced) - client := notifyclient.NewNotifier(shareDir) + client := notifyclient.NewNotifyClient(shareDir) // verify add err := client.SendDomainEvent(watch.Event{Type: watch.Added, Object: domain}) diff --git a/pkg/virt-handler/vm_test.go b/pkg/virt-handler/vm_test.go index b012525cd312..e23ba6447705 100644 --- a/pkg/virt-handler/vm_test.go +++ b/pkg/virt-handler/vm_test.go @@ -3703,7 +3703,7 @@ var _ = Describe("DomainNotifyServerRestarts", func() { var domainPipeStopChan chan struct{} var stoppedPipe bool var eventChan chan watch.Event - var client *notifyclient.Notifier + var client *notifyclient.NotifyClient var recorder *record.FakeRecorder var vmiStore cache.Store @@ -3762,7 +3762,7 @@ var _ = Describe("DomainNotifyServerRestarts", func() { handleDomainNotifyPipe(domainPipeStopChan, listener, shareDir, vmi) time.Sleep(1) - client = notifyclient.NewNotifier(pipeDir) + client = notifyclient.NewNotifyClient(pipeDir) err = client.SendK8sEvent(vmi, eventType, eventReason, eventMessage) Expect(err).ToNot(HaveOccurred()) @@ -3794,7 +3794,7 @@ var _ = Describe("DomainNotifyServerRestarts", func() { Expect(err).ToNot(HaveOccurred()) // Client should fail when pipe is offline - client = notifyclient.NewNotifier(pipeDir) + client = notifyclient.NewNotifyClient(pipeDir) client.SetCustomTimeouts(1*time.Second, 1*time.Second, 3*time.Second) @@ -3834,7 +3834,7 @@ var _ = Describe("DomainNotifyServerRestarts", func() { handleDomainNotifyPipe(domainPipeStopChan, listener, shareDir, vmi) time.Sleep(1) - client = notifyclient.NewNotifier(pipeDir) + client = notifyclient.NewNotifyClient(pipeDir) for i := 1; i < 5; i++ { // close and wait for server to stop diff --git a/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel new file mode 100644 index 000000000000..618d4be73c18 --- /dev/null +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel @@ -0,0 +1,62 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["client.go"], + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client", + visibility = ["//visibility:public"], + deps = [ + "//pkg/apimachinery/wait:go_default_library", + "//pkg/ephemeral-disk-utils:go_default_library", + "//pkg/handler-launcher-com:go_default_library", + "//pkg/handler-launcher-com/notify/info:go_default_library", + "//pkg/handler-launcher-com/notify/v1:go_default_library", + "//pkg/util/net/grpc:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/cli:go_default_library", + "//pkg/virt-launcher/virtwrap/converter:go_default_library", + "//pkg/virt-launcher/virtwrap/errors:go_default_library", + "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//staging/src/kubevirt.io/api/core/v1:go_default_library", + "//staging/src/kubevirt.io/client-go/log:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/tools/reference:go_default_library", + "//vendor/libvirt.org/go/libvirt:go_default_library", + "@org_golang_google_grpc//:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "client_suite_test.go", + "notify_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//pkg/handler-launcher-com/notify/info:go_default_library", + "//pkg/testutils:go_default_library", + "//pkg/virt-handler/notify-server:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/testing:go_default_library", + "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//staging/src/kubevirt.io/api/core/v1:go_default_library", + "//staging/src/kubevirt.io/client-go/api:go_default_library", + "//staging/src/kubevirt.io/client-go/testutils:go_default_library", + "//vendor/github.com/onsi/ginkgo/v2:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", + "//vendor/go.uber.org/mock/gomock:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//vendor/libvirt.org/go/libvirt:go_default_library", + ], +) diff --git a/pkg/virt-launcher-libvirt-qemu/notify-client/client.go b/pkg/virt-launcher-libvirt-qemu/notify-client/client.go new file mode 100644 index 000000000000..0a27db55ef78 --- /dev/null +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/client.go @@ -0,0 +1,376 @@ +package eventsclient + +import ( + "fmt" + "time" + + "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + + "libvirt.org/go/libvirt" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" + + v1 "kubevirt.io/api/core/v1" + "kubevirt.io/client-go/log" + + agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" + domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" + eventsClientCommon "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" +) + +const ( + cantDetermineLibvirtDomainName = "Could not determine name of libvirt domain in event callback." + libvirtEventChannelFull = "Libvirt event channel is full, dropping event." +) + +type libvirtEvent struct { + Domain string + Event *libvirt.DomainEventLifecycle + AgentEvent *libvirt.DomainEventAgentLifecycle +} + +func newWatchEventError(err error) watch.Event { + return watch.Event{Type: watch.Error, Object: &metav1.Status{Status: metav1.StatusFailure, Message: err.Error()}} +} + +type eventCaller struct { + domainStatus api.LifeCycle + domainStatusChangeReason api.StateChangeReason +} + +func (e *eventCaller) printStatus(status *api.DomainStatus) { + v := 2 + if status.Status == e.domainStatus && status.Reason == e.domainStatusChangeReason { + // Status hasn't changed so log only in higher verbosity. + v = 3 + } + log.Log.V(v).Infof("kubevirt domain status: %v(%v) reason: %v(%v)", status.Status, e.domainStatus, status.Reason, e.domainStatusChangeReason) +} + +func (e *eventCaller) updateStatus(status *api.DomainStatus) { + e.domainStatus = status.Status + e.domainStatusChangeReason = status.Reason +} + +func (e *eventCaller) eventCallback(c cli.Connection, domain *api.Domain, libvirtEvent libvirtEvent, client *eventsClientCommon.NotifyClient, events chan watch.Event, + interfaceStatus []api.InterfaceStatus, osInfo *api.GuestOSInfo, vmi *v1.VirtualMachineInstance, fsFreezeStatus *api.FSFreeze, + metadataCache *metadata.Cache) { + + d, err := c.LookupDomainByName(util.DomainFromNamespaceName(domain.ObjectMeta.Namespace, domain.ObjectMeta.Name)) + if err != nil { + if !domainerrors.IsNotFound(err) { + log.Log.Reason(err).Error("Could not fetch the Domain.") + return + } + domain.SetState(api.NoState, api.ReasonNonExistent) + } else { + defer d.Free() + + // No matter which event, try to fetch the domain xml + // and the state. If we get a IsNotFound error, that + // means that the VirtualMachineInstance was removed. + status, reason, err := d.GetState() + if err != nil { + if !domainerrors.IsNotFound(err) { + log.Log.Reason(err).Error("Could not fetch the Domain state.") + return + } + domain.SetState(api.NoState, api.ReasonNonExistent) + } else { + domain.SetState(util.ConvState(status), util.ConvReason(status, reason)) + } + + kubevirtMetadata := metadata.LoadKubevirtMetadata(metadataCache) + spec, err := util.GetDomainSpecWithRuntimeInfo(d) + if err != nil { + // NOTE: Getting domain metadata for a live-migrating VM isn't allowed + if !domainerrors.IsNotFound(err) && !domainerrors.IsInvalidOperation(err) { + log.Log.Reason(err).Error("Could not fetch the Domain specification.") + return + } + } else { + domain.ObjectMeta.UID = kubevirtMetadata.UID + } + + if spec != nil { + spec.Metadata.KubeVirt = kubevirtMetadata + domain.Spec = *spec + } + + e.printStatus(&domain.Status) + e.updateStatus(&domain.Status) + } + + switch domain.Status.Reason { + case api.ReasonNonExistent: + now := metav1.Now() + domain.ObjectMeta.DeletionTimestamp = &now + watchEvent := watch.Event{Type: watch.Modified, Object: domain} + client.SendDomainEvent(watchEvent) + updateEvents(watchEvent, domain, events) + case api.ReasonPausedIOError: + domainDisksWithErrors, err := d.GetDiskErrors(0) + if err != nil { + log.Log.Reason(err).Error("Could not get disks with errors") + } + for _, disk := range domainDisksWithErrors { + volumeName := converter.GetVolumeNameByTarget(domain, disk.Disk) + var reasonError string + switch disk.Error { + case libvirt.DOMAIN_DISK_ERROR_NONE: + continue + case libvirt.DOMAIN_DISK_ERROR_UNSPEC: + reasonError = fmt.Sprintf("VM Paused due to IO error at the volume: %s", volumeName) + case libvirt.DOMAIN_DISK_ERROR_NO_SPACE: + reasonError = fmt.Sprintf("VM Paused due to not enough space on volume: %s", volumeName) + } + err = client.SendK8sEvent(vmi, "Warning", "IOerror", reasonError) + if err != nil { + log.Log.Reason(err).Error(fmt.Sprintf("Could not send k8s event")) + } + event := watch.Event{Type: watch.Modified, Object: domain} + client.SendDomainEvent(event) + updateEvents(event, domain, events) + } + default: + if libvirtEvent.Event != nil { + if libvirtEvent.Event.Event == libvirt.DOMAIN_EVENT_DEFINED && libvirt.DomainEventDefinedDetailType(libvirtEvent.Event.Detail) == libvirt.DOMAIN_EVENT_DEFINED_ADDED { + event := watch.Event{Type: watch.Added, Object: domain} + client.SendDomainEvent(event) + updateEvents(event, domain, events) + } else if libvirtEvent.Event.Event == libvirt.DOMAIN_EVENT_STARTED && libvirt.DomainEventStartedDetailType(libvirtEvent.Event.Detail) == libvirt.DOMAIN_EVENT_STARTED_MIGRATED { + event := watch.Event{Type: watch.Added, Object: domain} + client.SendDomainEvent(event) + updateEvents(event, domain, events) + } + } + if interfaceStatus != nil { + domain.Status.Interfaces = interfaceStatus + } + if osInfo != nil { + domain.Status.OSInfo = *osInfo + } + + if fsFreezeStatus != nil { + domain.Status.FSFreezeStatus = *fsFreezeStatus + } + + err := client.SendDomainEvent(watch.Event{Type: watch.Modified, Object: domain}) + if err != nil { + log.Log.Reason(err).Error("Could not send domain notify event.") + } + } +} + +var updateEvents = updateEventsClosure() + +func updateEventsClosure() func(event watch.Event, domain *api.Domain, events chan watch.Event) { + firstAddEvent := true + firstDeleteEvent := true + + return func(event watch.Event, domain *api.Domain, events chan watch.Event) { + if event.Type == watch.Added && firstAddEvent { + firstAddEvent = false + events <- event + } else if event.Type == watch.Modified && domain.ObjectMeta.DeletionTimestamp != nil && firstDeleteEvent { + firstDeleteEvent = false + events <- event + } + } +} + +func StartLibvirtNotifier( + notifier *eventsClientCommon.NotifyClient, + domainConn cli.Connection, + deleteNotificationSent chan watch.Event, + vmi *v1.VirtualMachineInstance, + domainName string, + agentStore *agentpoller.AsyncAgentStore, + qemuAgentSysInterval time.Duration, + qemuAgentFileInterval time.Duration, + qemuAgentUserInterval time.Duration, + qemuAgentVersionInterval time.Duration, + qemuAgentFSFreezeStatusInterval time.Duration, + metadataCache *metadata.Cache, +) error { + + eventChan := make(chan libvirtEvent, 10) + + reconnectChan := make(chan bool, 10) + + var domainCache *api.Domain + + domainConn.SetReconnectChan(reconnectChan) + + agentPoller := agentpoller.CreatePoller( + domainConn, + vmi.UID, + domainName, + agentStore, + qemuAgentSysInterval, + qemuAgentFileInterval, + qemuAgentUserInterval, + qemuAgentVersionInterval, + qemuAgentFSFreezeStatusInterval, + ) + + // Run the event process logic in a separate go-routine to not block libvirt + go func() { + var interfaceStatuses []api.InterfaceStatus + var guestOsInfo *api.GuestOSInfo + var fsFreezeStatus *api.FSFreeze + var eventCaller eventCaller + + for { + select { + case event := <-eventChan: + metadataCache.ResetNotification() + domainCache = util.NewDomainFromName(event.Domain, vmi.UID) + eventCaller.eventCallback(domainConn, domainCache, event, notifier, deleteNotificationSent, interfaceStatuses, guestOsInfo, vmi, fsFreezeStatus, metadataCache) + log.Log.Infof("Domain name event: %v", domainCache.Spec.Name) + if event.AgentEvent != nil { + if event.AgentEvent.State == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_CONNECTED { + agentPoller.Start() + } else if event.AgentEvent.State == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_DISCONNECTED { + agentPoller.Stop() + } + } + case agentUpdate := <-agentStore.AgentUpdated: + metadataCache.ResetNotification() + interfaceStatuses = agentUpdate.DomainInfo.Interfaces + guestOsInfo = agentUpdate.DomainInfo.OSInfo + fsFreezeStatus = agentUpdate.DomainInfo.FSFreezeStatus + + eventCaller.eventCallback(domainConn, domainCache, libvirtEvent{}, notifier, deleteNotificationSent, + interfaceStatuses, guestOsInfo, vmi, fsFreezeStatus, metadataCache) + case <-reconnectChan: + notifier.SendDomainEvent(newWatchEventError(fmt.Errorf("Libvirt reconnect, domain %s", domainName))) + + case <-metadataCache.Listen(): + // Metadata cache updates should be processed only *after* at least one + // libvirt event arrived (which creates the first domainCache). + if domainCache != nil { + domainCache = util.NewDomainFromName( + util.DomainFromNamespaceName(domainCache.ObjectMeta.Namespace, domainCache.ObjectMeta.Name), + vmi.UID, + ) + eventCaller.eventCallback( + domainConn, + domainCache, + libvirtEvent{}, + notifier, + deleteNotificationSent, + interfaceStatuses, + guestOsInfo, + vmi, + fsFreezeStatus, + metadataCache, + ) + } + } + } + }() + + domainEventLifecycleCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventLifecycle) { + + log.Log.Infof("DomainLifecycle event %s with event id %d reason %d received", event.String(), event.Event, event.Detail) + name, err := d.GetName() + if err != nil { + log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) + } + select { + case eventChan <- libvirtEvent{Event: event, Domain: name}: + default: + log.Log.Infof(libvirtEventChannelFull) + } + } + + domainEventDeviceAddedCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventDeviceAdded) { + log.Log.Infof("Domain Device Added event received") + name, err := d.GetName() + if err != nil { + log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) + } + select { + case eventChan <- libvirtEvent{Domain: name}: + default: + log.Log.Infof(libvirtEventChannelFull) + } + } + + domainEventDeviceRemovedCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventDeviceRemoved) { + log.Log.Infof("Domain Device Removed event received") + name, err := d.GetName() + if err != nil { + log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) + } + + select { + case eventChan <- libvirtEvent{Domain: name}: + default: + log.Log.Infof(libvirtEventChannelFull) + } + } + + domainEventMemoryDeviceSizeChange := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventMemoryDeviceSizeChange) { + log.Log.Infof("Domain Memory Device size-change event received") + name, err := d.GetName() + if err != nil { + log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) + } + + select { + case eventChan <- libvirtEvent{Domain: name}: + default: + log.Log.Infof(libvirtEventChannelFull) + } + } + + err := domainConn.DomainEventLifecycleRegister(domainEventLifecycleCallback) + if err != nil { + log.Log.Reason(err).Errorf("failed to register event callback with libvirt") + return err + } + + err = domainConn.DomainEventDeviceAddedRegister(domainEventDeviceAddedCallback) + if err != nil { + log.Log.Reason(err).Errorf("failed to register device added event callback with libvirt") + return err + } + err = domainConn.DomainEventDeviceRemovedRegister(domainEventDeviceRemovedCallback) + if err != nil { + log.Log.Reason(err).Errorf("failed to register device removed event callback with libvirt") + return err + } + err = domainConn.DomainEventMemoryDeviceSizeChangeRegister(domainEventMemoryDeviceSizeChange) + if err != nil { + log.Log.Reason(err).Errorf("failed to register memory device size change event callback with libvirt") + return err + } + + agentEventLifecycleCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventAgentLifecycle) { + log.Log.Infof("GuestAgentLifecycle event state %d with reason %d received", event.State, event.Reason) + name, err := d.GetName() + if err != nil { + log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) + } + select { + case eventChan <- libvirtEvent{AgentEvent: event, Domain: name}: + default: + log.Log.Infof(libvirtEventChannelFull) + } + } + err = domainConn.AgentEventLifecycleRegister(agentEventLifecycleCallback) + if err != nil { + log.Log.Reason(err).Errorf("failed to register event callback with libvirt") + return err + } + + log.Log.Infof("Registered libvirt event notify callback") + return nil +} diff --git a/pkg/virt-launcher-libvirt-qemu/notify-client/client_suite_test.go b/pkg/virt-launcher-libvirt-qemu/notify-client/client_suite_test.go new file mode 100644 index 000000000000..10cfd4556223 --- /dev/null +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/client_suite_test.go @@ -0,0 +1,11 @@ +package eventsclient + +import ( + "testing" + + "kubevirt.io/client-go/testutils" +) + +func TestClient(t *testing.T) { + testutils.KubeVirtTestSuiteSetup(t) +} diff --git a/pkg/virt-launcher/notify-client/notify_test.go b/pkg/virt-launcher-libvirt-qemu/notify-client/notify_test.go similarity index 96% rename from pkg/virt-launcher/notify-client/notify_test.go rename to pkg/virt-launcher-libvirt-qemu/notify-client/notify_test.go index 53a4a711103c..309ebaf9e549 100644 --- a/pkg/virt-launcher/notify-client/notify_test.go +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/notify_test.go @@ -42,10 +42,11 @@ import ( "kubevirt.io/kubevirt/pkg/handler-launcher-com/notify/info" "kubevirt.io/kubevirt/pkg/testutils" notifyserver "kubevirt.io/kubevirt/pkg/virt-handler/notify-server" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" + notifyCommon "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) var _ = Describe("Notify", func() { @@ -54,7 +55,7 @@ var _ = Describe("Notify", func() { var eventChan chan watch.Event var deleteNotificationSent chan watch.Event - var client *Notifier + var client *notifyCommon.NotifyClient var mockLibvirt *testing.Libvirt var e *eventCaller @@ -76,7 +77,7 @@ var _ = Describe("Notify", func() { notifyserver.RunServer(shareDir, stop, eventChan, nil, nil) }() - client = NewNotifier(shareDir) + client = notifyCommon.NewNotifyClient(shareDir) DeferCleanup( func() { @@ -257,7 +258,7 @@ var _ = Describe("Notify", func() { var stopped bool var eventChan chan watch.Event var deleteNotificationSent chan watch.Event - var client *Notifier + var client *notifyCommon.NotifyClient var recorder *record.FakeRecorder var vmiStore cache.Store var e *eventCaller @@ -282,7 +283,7 @@ var _ = Describe("Notify", func() { time.Sleep(1 * time.Second) - client = NewNotifier(shareDir) + client = notifyCommon.NewNotifyClient(shareDir) }) AfterEach(func() { @@ -363,7 +364,7 @@ var _ = Describe("Notify", func() { infoClient.EXPECT().Info(gomock.Any(), gomock.Any()).Return(&fakeResponse, nil) By("Initializing the notifier") - _, err = negotiateVersion(infoClient) + _, err = notifyCommon.NegotiateVersion(infoClient) Expect(err).To(HaveOccurred(), "Should have returned error about incompatible versions") Expect(err.Error()).To(ContainSubstring("no compatible version found"), "Expected error message to contain 'no compatible version found'") diff --git a/pkg/virt-launcher/notify-client/client.go b/pkg/virt-launcher/notify-client/client.go index edff45ebc6bd..72b28bf294fc 100644 --- a/pkg/virt-launcher/notify-client/client.go +++ b/pkg/virt-launcher/notify-client/client.go @@ -7,8 +7,6 @@ import ( "sync" "time" - "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" - "google.golang.org/grpc" "k8s.io/apimachinery/pkg/runtime" "libvirt.org/go/libvirt" @@ -28,17 +26,7 @@ import ( "kubevirt.io/kubevirt/pkg/handler-launcher-com/notify/info" notifyv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/notify/v1" grpcutil "kubevirt.io/kubevirt/pkg/util/net/grpc" - agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent-poller" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" - domainerrors "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" -) - -const ( - cantDetermineLibvirtDomainName = "Could not determine name of libvirt domain in event callback." - libvirtEventChannelFull = "Libvirt event channel is full, dropping event." ) var ( @@ -47,7 +35,7 @@ var ( supportedNotifyVersions = []uint32{1} ) -type Notifier struct { +type NotifyClient struct { v1client notifyv1.NotifyClient conn *grpc.ClientConn connLock sync.Mutex @@ -65,8 +53,8 @@ type libvirtEvent struct { AgentEvent *libvirt.DomainEventAgentLifecycle } -func NewNotifier(virtShareDir string) *Notifier { - return &Notifier{ +func NewNotifyClient(virtShareDir string) *NotifyClient { + return &NotifyClient{ pipeSocketPath: filepath.Join(virtShareDir, "domain-notify-pipe.sock"), legacySocketPath: filepath.Join(virtShareDir, "domain-notify.sock"), intervalTimeout: defaultIntervalTimeout, @@ -91,7 +79,7 @@ func init() { addToScheme(scheme) } -func negotiateVersion(infoClient info.NotifyInfoClient) (uint32, error) { +func NegotiateVersion(infoClient info.NotifyInfoClient) (uint32, error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() info, err := infoClient.Info(ctx, &info.NotifyInfoRequest{}) @@ -114,14 +102,14 @@ func negotiateVersion(infoClient info.NotifyInfoClient) (uint32, error) { } // used by unit tests -func (n *Notifier) SetCustomTimeouts(interval, send, total time.Duration) { +func (n *NotifyClient) SetCustomTimeouts(interval, send, total time.Duration) { n.intervalTimeout = interval n.sendTimeout = send n.totalTimeout = total } -func (n *Notifier) detectSocketPath() string { +func (n *NotifyClient) detectSocketPath() string { // use the legacy domain socket if it exists. This would // occur if the vmi was started with a hostPath shared mount @@ -135,7 +123,7 @@ func (n *Notifier) detectSocketPath() string { return n.pipeSocketPath } -func (n *Notifier) connect() error { +func (n *NotifyClient) connect() error { if n.conn != nil { // already connected return nil @@ -150,7 +138,7 @@ func (n *Notifier) connect() error { return err } - version, err := negotiateVersion(info.NewNotifyInfoClient(conn)) + version, err := NegotiateVersion(info.NewNotifyInfoClient(conn)) if err != nil { log.Log.Reason(err).Infof("failed to negotiate version") conn.Close() @@ -172,7 +160,7 @@ func (n *Notifier) connect() error { return nil } -func (n *Notifier) SendDomainEvent(event watch.Event) error { +func (n *NotifyClient) SendDomainEvent(event watch.Event) error { var domainJSON []byte var statusJSON []byte @@ -257,324 +245,7 @@ func (e *eventCaller) updateStatus(status *api.DomainStatus) { e.domainStatusChangeReason = status.Reason } -func (e *eventCaller) eventCallback(c cli.Connection, domain *api.Domain, libvirtEvent libvirtEvent, client *Notifier, events chan watch.Event, - interfaceStatus []api.InterfaceStatus, osInfo *api.GuestOSInfo, vmi *v1.VirtualMachineInstance, fsFreezeStatus *api.FSFreeze, - metadataCache *metadata.Cache) { - - d, err := c.LookupDomainByName(util.DomainFromNamespaceName(domain.ObjectMeta.Namespace, domain.ObjectMeta.Name)) - if err != nil { - if !domainerrors.IsNotFound(err) { - log.Log.Reason(err).Error("Could not fetch the Domain.") - return - } - domain.SetState(api.NoState, api.ReasonNonExistent) - } else { - defer d.Free() - - // No matter which event, try to fetch the domain xml - // and the state. If we get a IsNotFound error, that - // means that the VirtualMachineInstance was removed. - status, reason, err := d.GetState() - if err != nil { - if !domainerrors.IsNotFound(err) { - log.Log.Reason(err).Error("Could not fetch the Domain state.") - return - } - domain.SetState(api.NoState, api.ReasonNonExistent) - } else { - domain.SetState(util.ConvState(status), util.ConvReason(status, reason)) - } - - kubevirtMetadata := metadata.LoadKubevirtMetadata(metadataCache) - spec, err := util.GetDomainSpecWithRuntimeInfo(d) - if err != nil { - // NOTE: Getting domain metadata for a live-migrating VM isn't allowed - if !domainerrors.IsNotFound(err) && !domainerrors.IsInvalidOperation(err) { - log.Log.Reason(err).Error("Could not fetch the Domain specification.") - return - } - } else { - domain.ObjectMeta.UID = kubevirtMetadata.UID - } - - if spec != nil { - spec.Metadata.KubeVirt = kubevirtMetadata - domain.Spec = *spec - } - - e.printStatus(&domain.Status) - e.updateStatus(&domain.Status) - } - - switch domain.Status.Reason { - case api.ReasonNonExistent: - now := metav1.Now() - domain.ObjectMeta.DeletionTimestamp = &now - watchEvent := watch.Event{Type: watch.Modified, Object: domain} - client.SendDomainEvent(watchEvent) - updateEvents(watchEvent, domain, events) - case api.ReasonPausedIOError: - domainDisksWithErrors, err := d.GetDiskErrors(0) - if err != nil { - log.Log.Reason(err).Error("Could not get disks with errors") - } - for _, disk := range domainDisksWithErrors { - volumeName := converter.GetVolumeNameByTarget(domain, disk.Disk) - var reasonError string - switch disk.Error { - case libvirt.DOMAIN_DISK_ERROR_NONE: - continue - case libvirt.DOMAIN_DISK_ERROR_UNSPEC: - reasonError = fmt.Sprintf("VM Paused due to IO error at the volume: %s", volumeName) - case libvirt.DOMAIN_DISK_ERROR_NO_SPACE: - reasonError = fmt.Sprintf("VM Paused due to not enough space on volume: %s", volumeName) - } - err = client.SendK8sEvent(vmi, "Warning", "IOerror", reasonError) - if err != nil { - log.Log.Reason(err).Error(fmt.Sprintf("Could not send k8s event")) - } - event := watch.Event{Type: watch.Modified, Object: domain} - client.SendDomainEvent(event) - updateEvents(event, domain, events) - } - default: - if libvirtEvent.Event != nil { - if libvirtEvent.Event.Event == libvirt.DOMAIN_EVENT_DEFINED && libvirt.DomainEventDefinedDetailType(libvirtEvent.Event.Detail) == libvirt.DOMAIN_EVENT_DEFINED_ADDED { - event := watch.Event{Type: watch.Added, Object: domain} - client.SendDomainEvent(event) - updateEvents(event, domain, events) - } else if libvirtEvent.Event.Event == libvirt.DOMAIN_EVENT_STARTED && libvirt.DomainEventStartedDetailType(libvirtEvent.Event.Detail) == libvirt.DOMAIN_EVENT_STARTED_MIGRATED { - event := watch.Event{Type: watch.Added, Object: domain} - client.SendDomainEvent(event) - updateEvents(event, domain, events) - } - } - if interfaceStatus != nil { - domain.Status.Interfaces = interfaceStatus - } - if osInfo != nil { - domain.Status.OSInfo = *osInfo - } - - if fsFreezeStatus != nil { - domain.Status.FSFreezeStatus = *fsFreezeStatus - } - - err := client.SendDomainEvent(watch.Event{Type: watch.Modified, Object: domain}) - if err != nil { - log.Log.Reason(err).Error("Could not send domain notify event.") - } - } -} - -var updateEvents = updateEventsClosure() - -func updateEventsClosure() func(event watch.Event, domain *api.Domain, events chan watch.Event) { - firstAddEvent := true - firstDeleteEvent := true - - return func(event watch.Event, domain *api.Domain, events chan watch.Event) { - if event.Type == watch.Added && firstAddEvent { - firstAddEvent = false - events <- event - } else if event.Type == watch.Modified && domain.ObjectMeta.DeletionTimestamp != nil && firstDeleteEvent { - firstDeleteEvent = false - events <- event - } - } -} - -func (n *Notifier) StartDomainNotifier( - domainConn cli.Connection, - deleteNotificationSent chan watch.Event, - vmi *v1.VirtualMachineInstance, - domainName string, - agentStore *agentpoller.AsyncAgentStore, - qemuAgentSysInterval time.Duration, - qemuAgentFileInterval time.Duration, - qemuAgentUserInterval time.Duration, - qemuAgentVersionInterval time.Duration, - qemuAgentFSFreezeStatusInterval time.Duration, - metadataCache *metadata.Cache, -) error { - - eventChan := make(chan libvirtEvent, 10) - - reconnectChan := make(chan bool, 10) - - var domainCache *api.Domain - - domainConn.SetReconnectChan(reconnectChan) - - agentPoller := agentpoller.CreatePoller( - domainConn, - vmi.UID, - domainName, - agentStore, - qemuAgentSysInterval, - qemuAgentFileInterval, - qemuAgentUserInterval, - qemuAgentVersionInterval, - qemuAgentFSFreezeStatusInterval, - ) - - // Run the event process logic in a separate go-routine to not block libvirt - go func() { - var interfaceStatuses []api.InterfaceStatus - var guestOsInfo *api.GuestOSInfo - var fsFreezeStatus *api.FSFreeze - var eventCaller eventCaller - - for { - select { - case event := <-eventChan: - metadataCache.ResetNotification() - domainCache = util.NewDomainFromName(event.Domain, vmi.UID) - eventCaller.eventCallback(domainConn, domainCache, event, n, deleteNotificationSent, interfaceStatuses, guestOsInfo, vmi, fsFreezeStatus, metadataCache) - log.Log.Infof("Domain name event: %v", domainCache.Spec.Name) - if event.AgentEvent != nil { - if event.AgentEvent.State == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_CONNECTED { - agentPoller.Start() - } else if event.AgentEvent.State == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_DISCONNECTED { - agentPoller.Stop() - } - } - case agentUpdate := <-agentStore.AgentUpdated: - metadataCache.ResetNotification() - interfaceStatuses = agentUpdate.DomainInfo.Interfaces - guestOsInfo = agentUpdate.DomainInfo.OSInfo - fsFreezeStatus = agentUpdate.DomainInfo.FSFreezeStatus - - eventCaller.eventCallback(domainConn, domainCache, libvirtEvent{}, n, deleteNotificationSent, - interfaceStatuses, guestOsInfo, vmi, fsFreezeStatus, metadataCache) - case <-reconnectChan: - n.SendDomainEvent(newWatchEventError(fmt.Errorf("Libvirt reconnect, domain %s", domainName))) - - case <-metadataCache.Listen(): - // Metadata cache updates should be processed only *after* at least one - // libvirt event arrived (which creates the first domainCache). - if domainCache != nil { - domainCache = util.NewDomainFromName( - util.DomainFromNamespaceName(domainCache.ObjectMeta.Namespace, domainCache.ObjectMeta.Name), - vmi.UID, - ) - eventCaller.eventCallback( - domainConn, - domainCache, - libvirtEvent{}, - n, - deleteNotificationSent, - interfaceStatuses, - guestOsInfo, - vmi, - fsFreezeStatus, - metadataCache, - ) - } - } - } - }() - - domainEventLifecycleCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventLifecycle) { - - log.Log.Infof("DomainLifecycle event %s with event id %d reason %d received", event.String(), event.Event, event.Detail) - name, err := d.GetName() - if err != nil { - log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) - } - select { - case eventChan <- libvirtEvent{Event: event, Domain: name}: - default: - log.Log.Infof(libvirtEventChannelFull) - } - } - - domainEventDeviceAddedCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventDeviceAdded) { - log.Log.Infof("Domain Device Added event received") - name, err := d.GetName() - if err != nil { - log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) - } - select { - case eventChan <- libvirtEvent{Domain: name}: - default: - log.Log.Infof(libvirtEventChannelFull) - } - } - - domainEventDeviceRemovedCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventDeviceRemoved) { - log.Log.Infof("Domain Device Removed event received") - name, err := d.GetName() - if err != nil { - log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) - } - - select { - case eventChan <- libvirtEvent{Domain: name}: - default: - log.Log.Infof(libvirtEventChannelFull) - } - } - - domainEventMemoryDeviceSizeChange := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventMemoryDeviceSizeChange) { - log.Log.Infof("Domain Memory Device size-change event received") - name, err := d.GetName() - if err != nil { - log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) - } - - select { - case eventChan <- libvirtEvent{Domain: name}: - default: - log.Log.Infof(libvirtEventChannelFull) - } - } - - err := domainConn.DomainEventLifecycleRegister(domainEventLifecycleCallback) - if err != nil { - log.Log.Reason(err).Errorf("failed to register event callback with libvirt") - return err - } - - err = domainConn.DomainEventDeviceAddedRegister(domainEventDeviceAddedCallback) - if err != nil { - log.Log.Reason(err).Errorf("failed to register device added event callback with libvirt") - return err - } - err = domainConn.DomainEventDeviceRemovedRegister(domainEventDeviceRemovedCallback) - if err != nil { - log.Log.Reason(err).Errorf("failed to register device removed event callback with libvirt") - return err - } - err = domainConn.DomainEventMemoryDeviceSizeChangeRegister(domainEventMemoryDeviceSizeChange) - if err != nil { - log.Log.Reason(err).Errorf("failed to register memory device size change event callback with libvirt") - return err - } - - agentEventLifecycleCallback := func(c *libvirt.Connect, d *libvirt.Domain, event *libvirt.DomainEventAgentLifecycle) { - log.Log.Infof("GuestAgentLifecycle event state %d with reason %d received", event.State, event.Reason) - name, err := d.GetName() - if err != nil { - log.Log.Reason(err).Info(cantDetermineLibvirtDomainName) - } - select { - case eventChan <- libvirtEvent{AgentEvent: event, Domain: name}: - default: - log.Log.Infof(libvirtEventChannelFull) - } - } - err = domainConn.AgentEventLifecycleRegister(agentEventLifecycleCallback) - if err != nil { - log.Log.Reason(err).Errorf("failed to register event callback with libvirt") - return err - } - - log.Log.Infof("Registered libvirt event notify callback") - return nil -} - -func (n *Notifier) SendK8sEvent(vmi *v1.VirtualMachineInstance, severity string, reason string, message string) error { +func (n *NotifyClient) SendK8sEvent(vmi *v1.VirtualMachineInstance, severity string, reason string, message string) error { vmiRef, err := reference.GetReference(scheme, vmi) if err != nil { return err @@ -629,14 +300,14 @@ func (n *Notifier) SendK8sEvent(vmi *v1.VirtualMachineInstance, severity string, return nil } -func (n *Notifier) _close() { +func (n *NotifyClient) _close() { if n.conn != nil { n.conn.Close() n.conn = nil } } -func (n *Notifier) Close() { +func (n *NotifyClient) Close() { n.connLock.Lock() defer n.connLock.Unlock() n._close() From 7306a33acdc4d6a95bd4ebe126dba3607b666a20 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 12:47:07 -0700 Subject: [PATCH 5/8] Update BUILD.bazel files for virt-launcher-libvirt-qemu --- .../notify-client/BUILD.bazel | 16 ++++++++-------- .../virtwrap/BUILD.bazel | 16 ++++++++-------- .../virtwrap/access-credentials/BUILD.bazel | 18 +++++++++--------- .../virtwrap/agent-poller/BUILD.bazel | 6 +++--- .../virtwrap/agent/BUILD.bazel | 4 ++-- .../virtwrap/cli/BUILD.bazel | 6 +++--- .../virtwrap/converter/BUILD.bazel | 16 ++++++++-------- .../virtwrap/converter/arch/BUILD.bazel | 4 ++-- .../virtwrap/converter/vcpu/BUILD.bazel | 2 +- .../virtwrap/device/BUILD.bazel | 2 +- .../virtwrap/device/hostdevice/BUILD.bazel | 4 ++-- .../device/hostdevice/generic/BUILD.bazel | 6 +++--- .../virtwrap/device/hostdevice/gpu/BUILD.bazel | 6 +++--- .../device/hostdevice/sriov/BUILD.bazel | 10 +++++----- .../virtwrap/efi/BUILD.bazel | 2 +- .../virtwrap/errors/BUILD.bazel | 2 +- .../virtwrap/launchsecurity/BUILD.bazel | 2 +- .../virtwrap/libvirtxml/BUILD.bazel | 2 +- .../virtwrap/statsconv/BUILD.bazel | 4 ++-- .../virtwrap/statsconv/util/BUILD.bazel | 2 +- .../virtwrap/testing/BUILD.bazel | 4 ++-- .../virtwrap/util/BUILD.bazel | 12 ++++++------ 22 files changed, 73 insertions(+), 73 deletions(-) diff --git a/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel index 618d4be73c18..6fafc3c3d21e 100644 --- a/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["client.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/notify-client", visibility = ["//visibility:public"], deps = [ "//pkg/apimachinery/wait:go_default_library", @@ -13,12 +13,12 @@ go_library( "//pkg/handler-launcher-com/notify/v1:go_default_library", "//pkg/util/net/grpc:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/errors:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -45,8 +45,8 @@ go_test( "//pkg/virt-handler/notify-server:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel index 397ae50ce297..fc9d5f73288a 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel @@ -62,7 +62,7 @@ go_library( "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/efi:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", - "//pkg/virt-launcher/virtwrap/libvirtxml:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml:go_default_library", "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", @@ -108,15 +108,15 @@ go_test( "//pkg/virt-config:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", - "//pkg/virt-launcher/virtwrap/efi:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/efi:go_default_library", "//pkg/virt-launcher/virtwrap/stats:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel index 7b4c69e6996c..328d086d3f37 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel @@ -3,15 +3,15 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["access_credentials.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/access-credentials", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials", visibility = ["//visibility:public"], deps = [ "//pkg/config:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/agent:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", @@ -29,11 +29,11 @@ go_test( "//pkg/handler-launcher-com/cmd/v1:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel index 9bea0aae1a88..870187b0632f 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel @@ -6,11 +6,11 @@ go_library( "agent_parser.go", "agent_poller.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent-poller", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller", visibility = ["//visibility:public"], deps = [ "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -29,7 +29,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel index b994d06851cf..0e1313cafc61 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "exec.go", "types.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent", visibility = ["//visibility:public"], - deps = ["//pkg/virt-launcher/virtwrap/cli:go_default_library"], + deps = ["//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library"], ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel index d4159bf2296a..8ae6e46bf016 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel @@ -7,14 +7,14 @@ go_library( "generated_mock_libvirt.go", "libvirt.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli", visibility = ["//visibility:public"], deps = [ "//pkg/apimachinery/wait:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/errors:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", "//pkg/virt-launcher/virtwrap/stats:go_default_library", - "//pkg/virt-launcher/virtwrap/statsconv:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/go.uber.org/mock/gomock:go_default_library", "//vendor/libvirt.org/go/libvirt:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel index b1cd403097b0..d6da21c2c958 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel @@ -10,7 +10,7 @@ go_library( "pci-placement.go", "virtiofs.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter", visibility = ["//visibility:public"], deps = [ "//pkg/cloud-init:go_default_library", @@ -32,10 +32,10 @@ go_library( "//pkg/virt-controller/services:go_default_library", "//pkg/virt-controller/watch/topology:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", - "//pkg/virt-launcher/virtwrap/launchsecurity:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity:go_default_library", "//pkg/virtiofs:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", @@ -74,9 +74,9 @@ go_test( "//pkg/util/hardware:go_default_library", "//pkg/virt-controller/services:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", - "//pkg/virt-launcher/virtwrap/launchsecurity:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel index b81881316ad3..63c06a15c2c8 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel @@ -9,12 +9,12 @@ go_library( "ppc64le.go", "s390x.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/arch", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch", visibility = ["//visibility:public"], deps = [ "//pkg/pointer:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", ], diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel index 73882105c8a1..2156fe44168e 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["vcpu.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu", visibility = ["//visibility:public"], deps = [ "//pkg/handler-launcher-com/cmd/v1:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel index da10549df8f7..eab18d759c31 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "pciaddress.go", "usbaddress.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device", visibility = ["//visibility:public"], deps = [ "//pkg/util:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel index 117d2a2a059c..46f75d334b9b 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel @@ -7,12 +7,12 @@ go_library( "hostdev.go", "hotplug.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice", visibility = ["//visibility:public"], deps = [ "//pkg/util:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/libvirt.org/go/libvirt:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel index f757c1c81f50..48dc1771bb31 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel @@ -6,11 +6,11 @@ go_library( "addresspool.go", "hostdev.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/generic", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic", visibility = ["//visibility:public"], deps = [ "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", ], ) @@ -25,7 +25,7 @@ go_test( deps = [ ":go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel index d9c19e744d80..e1515bac5eed 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel @@ -6,11 +6,11 @@ go_library( "addresspool.go", "hostdev.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/gpu", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu", visibility = ["//visibility:public"], deps = [ "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", ], ) @@ -25,7 +25,7 @@ go_test( deps = [ ":go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel index f667254bcfe1..c6d9f8583d36 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel @@ -7,7 +7,7 @@ go_library( "pcipool.go", "pcipool_netstatus.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device/hostdevice/sriov", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov", visibility = ["//visibility:public"], deps = [ "//pkg/apimachinery/wait:go_default_library", @@ -15,8 +15,8 @@ go_library( "//pkg/network/downwardapi:go_default_library", "//pkg/network/vmispec:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", ], @@ -35,8 +35,8 @@ go_test( "//pkg/network/deviceinfo:go_default_library", "//pkg/network/vmispec:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", - "//pkg/virt-launcher/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel index 79a2b17180a7..9cb4364baa19 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/efi/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["efi.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/efi", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/efi", visibility = ["//visibility:public"], ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel index 7b992176747c..c65905ecc0c0 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/errors/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["errors.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/errors", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/errors", visibility = ["//visibility:public"], deps = ["//vendor/libvirt.org/go/libvirt:go_default_library"], ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel index 59430b3e914a..e43f78014565 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["sev.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/launchsecurity", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity", visibility = ["//visibility:public"], deps = ["//staging/src/kubevirt.io/api/core/v1:go_default_library"], ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel index 65d61ecdf1b9..19f7892dfa17 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["convert.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/libvirtxml", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml", visibility = ["//visibility:public"], deps = [ "//pkg/virt-launcher/virtwrap/api:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel index 2d947c34c3be..ad3aec267c54 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "converter.go", "generated_mock_converter.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/statsconv", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv", visibility = ["//visibility:public"], deps = [ "//pkg/virt-launcher/virtwrap/stats:go_default_library", @@ -24,7 +24,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/virt-launcher/virtwrap/stats:go_default_library", - "//pkg/virt-launcher/virtwrap/statsconv/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel index ca9d09b57f6c..213c2df5cde1 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["domstats_utils.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/statsconv/util", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util", visibility = ["//visibility:public"], deps = ["//vendor/libvirt.org/go/libvirt:go_default_library"], ) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel index a80a52d4e0d5..280764e003bc 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/testing/BUILD.bazel @@ -3,10 +3,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["libvirt.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/testing", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing", visibility = ["//visibility:public"], deps = [ - "//pkg/virt-launcher/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", "//vendor/go.uber.org/mock/gomock:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel index 75389162e762..d9890b526b6f 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "cpu_utils.go", "libvirt_helper.go", ], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util", + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util", visibility = ["//visibility:public"], deps = [ "//pkg/hooks:go_default_library", @@ -15,8 +15,8 @@ go_library( "//pkg/virt-controller/services:go_default_library", "//pkg/virt-handler/cgroup:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", @@ -39,9 +39,9 @@ go_test( "//pkg/pointer:go_default_library", "//pkg/virt-controller/services:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", From 1edef41d55bfdb250e0e565f58bdf0cb150ca767 Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 13:07:28 -0700 Subject: [PATCH 6/8] Move common fns from converter out to virt-launcher/util.go --- pkg/liveupdate/memory/memory.go | 7 +- pkg/liveupdate/memory/memory_test.go | 8 +- pkg/network/setup/netconf.go | 4 +- .../virtwrap/converter/converter.go | 18 +-- .../virtwrap/converter/converter_test.go | 11 +- .../virtwrap/converter/network.go | 24 +--- .../converter/vcpu/numa_placement_test.go | 7 +- .../virtwrap/converter/vcpu/vcpu.go | 77 +------------ .../virtwrap/live-migration-source.go | 9 +- .../virtwrap/manager.go | 5 +- .../virtwrap/manager_test.go | 8 +- pkg/virt-launcher/util.go | 105 ++++++++++++++++++ 12 files changed, 152 insertions(+), 131 deletions(-) create mode 100644 pkg/virt-launcher/util.go diff --git a/pkg/liveupdate/memory/memory.go b/pkg/liveupdate/memory/memory.go index 7721f2d8c391..efbad99ba4e3 100644 --- a/pkg/liveupdate/memory/memory.go +++ b/pkg/liveupdate/memory/memory.go @@ -25,7 +25,8 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" + + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "k8s.io/apimachinery/pkg/api/resource" ) @@ -112,14 +113,14 @@ func BuildMemoryDevice(vmi *v1.VirtualMachineInstance) (*api.MemoryDevice, error pluggableMemory := domain.Memory.MaxGuest.DeepCopy() pluggableMemory.Sub(*vmi.Status.Memory.GuestAtBoot) - pluggableMemorySize, err := vcpu.QuantityToByte(pluggableMemory) + pluggableMemorySize, err := virtlauncher.QuantityToByte(pluggableMemory) if err != nil { return nil, err } requestedHotPlugMemory := domain.Memory.Guest.DeepCopy() requestedHotPlugMemory.Sub(*vmi.Status.Memory.GuestAtBoot) - pluggableMemoryRequested, err := vcpu.QuantityToByte(requestedHotPlugMemory) + pluggableMemoryRequested, err := virtlauncher.QuantityToByte(requestedHotPlugMemory) if err != nil { return nil, err } diff --git a/pkg/liveupdate/memory/memory_test.go b/pkg/liveupdate/memory/memory_test.go index 906a3b4f5870..bfa55243c722 100644 --- a/pkg/liveupdate/memory/memory_test.go +++ b/pkg/liveupdate/memory/memory_test.go @@ -28,8 +28,8 @@ import ( "kubevirt.io/kubevirt/pkg/libvmi" "kubevirt.io/kubevirt/pkg/liveupdate/memory" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter/vcpu" ) var _ = Describe("LiveUpdate Memory", func() { @@ -109,10 +109,10 @@ var _ = Describe("LiveUpdate Memory", func() { memoryDevice, err := memory.BuildMemoryDevice(vmi) Expect(err).ToNot(HaveOccurred()) - size, err := vcpu.QuantityToByte(resource.MustParse("192Mi")) + size, err := virtlauncher.QuantityToByte(resource.MustParse("192Mi")) Expect(err).ToNot(HaveOccurred()) - requested, err := vcpu.QuantityToByte(resource.MustParse("64Mi")) + requested, err := virtlauncher.QuantityToByte(resource.MustParse("64Mi")) Expect(err).ToNot(HaveOccurred()) block := api.Memory{Unit: "b", Value: uint64(memory.HotplugBlockAlignmentBytes)} @@ -120,7 +120,7 @@ var _ = Describe("LiveUpdate Memory", func() { hugepages := vmi.Spec.Domain.Memory.Hugepages if hugepages != nil { var err error - block, err = vcpu.QuantityToByte(resource.MustParse(hugepages.PageSize)) + block, err = virtlauncher.QuantityToByte(resource.MustParse(hugepages.PageSize)) Expect(err).ToNot(HaveOccurred()) } Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/network/setup/netconf.go b/pkg/network/setup/netconf.go index 50e24f37d92f..d23e04a04aaa 100644 --- a/pkg/network/setup/netconf.go +++ b/pkg/network/setup/netconf.go @@ -31,7 +31,7 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/kubevirt/pkg/util" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/converter" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/network/cache" netdriver "kubevirt.io/kubevirt/pkg/network/driver" @@ -104,7 +104,7 @@ func (c *NetConf) Setup(vmi *v1.VirtualMachineInstance, networks []v1.Network, l if util.IsNonRootVMI(vmi) { ownerID = util.NonRootUID } - queuesCapacity := int(converter.NetworkQueuesCapacity(vmi)) + queuesCapacity := int(virtlauncher.NetworkQueuesCapacity(vmi)) netpod := netpod.NewNetPod( networks, vmispec.FilterInterfacesByNetworks(vmi.Spec.Domain.Devices.Interfaces, networks), diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go index 34b6f4293cc3..4f8eed2f28dd 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter.go @@ -60,6 +60,7 @@ import ( "kubevirt.io/kubevirt/pkg/util" "kubevirt.io/kubevirt/pkg/virt-controller/services" "kubevirt.io/kubevirt/pkg/virt-controller/watch/topology" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" @@ -71,7 +72,6 @@ const ( deviceTypeNotCompatibleFmt = "device %s is of type lun. Not compatible with a file based disk" defaultIOThread = uint(1) bootMenuTimeoutMS = uint(10000) - multiQueueMaxQueues = uint32(256) QEMUSeaBiosDebugPipe = "/var/run/kubevirt-private/QEMUSeaBiosDebugPipe" ) @@ -1127,14 +1127,14 @@ func setupDomainMemory(vmi *v1.VirtualMachineInstance, domain *api.Domain) error vmi.Spec.Domain.Memory.Guest.Equal(*vmi.Spec.Domain.Memory.MaxGuest) { var err error - domain.Spec.Memory, err = vcpu.QuantityToByte(*vcpu.GetVirtualMemory(vmi)) + domain.Spec.Memory, err = virtlauncher.QuantityToByte(*vcpu.GetVirtualMemory(vmi)) if err != nil { return err } return nil } - maxMemory, err := vcpu.QuantityToByte(*vmi.Spec.Domain.Memory.MaxGuest) + maxMemory, err := virtlauncher.QuantityToByte(*vmi.Spec.Domain.Memory.MaxGuest) if err != nil { return err } @@ -1144,7 +1144,7 @@ func setupDomainMemory(vmi *v1.VirtualMachineInstance, domain *api.Domain) error Value: maxMemory.Value, } - currentMemory, err := vcpu.QuantityToByte(*vmi.Spec.Domain.Memory.Guest) + currentMemory, err := virtlauncher.QuantityToByte(*vmi.Spec.Domain.Memory.Guest) if err != nil { return err } @@ -1404,8 +1404,8 @@ func Convert_v1_VirtualMachineInstance_To_api_Domain(vmi *v1.VirtualMachineInsta // CPU topology will be created everytime, because user can specify // number of cores in vmi.Spec.Domain.Resources.Requests/Limits, not only // in vmi.Spec.Domain.CPU - cpuTopology := vcpu.GetCPUTopology(vmi) - cpuCount := vcpu.CalculateRequestedVCPUs(cpuTopology) + cpuTopology := virtlauncher.GetCPUTopology(vmi) + cpuCount := virtlauncher.CalculateRequestedVCPUs(cpuTopology) domain.Spec.CPU.Topology = cpuTopology domain.Spec.VCPU = &api.VCPU{ @@ -2044,14 +2044,14 @@ func InterpretTransitionalModelType(useVirtioTransitional *bool, archString stri } func domainVCPUTopologyForHotplug(vmi *v1.VirtualMachineInstance, domain *api.Domain) { - cpuTopology := vcpu.GetCPUTopology(vmi) - cpuCount := vcpu.CalculateRequestedVCPUs(cpuTopology) + cpuTopology := virtlauncher.GetCPUTopology(vmi) + cpuCount := virtlauncher.CalculateRequestedVCPUs(cpuTopology) // Always allow to hotplug to minimum of 1 socket minEnabledCpuCount := cpuTopology.Cores * cpuTopology.Threads // Total vCPU count enabledCpuCount := cpuCount cpuTopology.Sockets = vmi.Spec.Domain.CPU.MaxSockets - cpuCount = vcpu.CalculateRequestedVCPUs(cpuTopology) + cpuCount = virtlauncher.CalculateRequestedVCPUs(cpuTopology) VCPUs := &api.VCPUs{} for id := uint32(0); id < cpuCount; id++ { // Enable all requestd vCPUs diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go index 6ceec6947c65..5aa0f72168f5 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/converter_test.go @@ -57,6 +57,7 @@ import ( "kubevirt.io/kubevirt/pkg/testutils" "kubevirt.io/kubevirt/pkg/util/hardware" "kubevirt.io/kubevirt/pkg/virt-controller/services" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" archconverter "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" sev "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity" @@ -1459,7 +1460,7 @@ var _ = Describe("Converter", func() { DescribeTable("should calculate mebibyte from a quantity", func(quantity string, mebibyte int) { mi64, _ := resource.ParseQuantity(quantity) - Expect(vcpu.QuantityToMebiByte(mi64)).To(BeNumerically("==", mebibyte)) + Expect(virtlauncher.QuantityToMebiByte(mi64)).To(BeNumerically("==", mebibyte)) }, Entry("when 0M is given", "0M", 0), Entry("when 0 is given", "0", 0), @@ -1475,13 +1476,13 @@ var _ = Describe("Converter", func() { It("should fail calculating mebibyte if the quantity is less than 0", func() { mi64, _ := resource.ParseQuantity("-2G") - _, err := vcpu.QuantityToMebiByte(mi64) + _, err := virtlauncher.QuantityToMebiByte(mi64) Expect(err).To(HaveOccurred()) }) DescribeTable("should calculate memory in bytes", func(quantity string, bytes int) { m64, _ := resource.ParseQuantity(quantity) - memory, err := vcpu.QuantityToByte(m64) + memory, err := virtlauncher.QuantityToByte(m64) Expect(memory.Value).To(BeNumerically("==", bytes)) Expect(memory.Unit).To(Equal("b")) Expect(err).ToNot(HaveOccurred()) @@ -1497,7 +1498,7 @@ var _ = Describe("Converter", func() { It("should calculate memory in bytes", func() { By("specyfing negative memory size -45Gi") m45gi, _ := resource.ParseQuantity("-45Gi") - _, err := vcpu.QuantityToByte(m45gi) + _, err := virtlauncher.QuantityToByte(m45gi) Expect(err).To(HaveOccurred()) }) @@ -2718,7 +2719,7 @@ var _ = Describe("Converter", func() { Threads: 2, } domain := vmiToDomain(vmi, &ConverterContext{Architecture: archconverter.NewConverter(runtime.GOARCH), AllowEmulation: true}) - expectedNumberQueues := uint(multiQueueMaxQueues) + expectedNumberQueues := uint(virtlauncher.MultiQueueMaxQueues) Expect(*(domain.Spec.Devices.Interfaces[0].Driver.Queues)).To(Equal(expectedNumberQueues), "should be capped to the maximum number of queues on tap devices") }) diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go index 9eb7bdc801d7..cd7fe448c6d8 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/network.go @@ -23,11 +23,10 @@ import ( "fmt" v1 "kubevirt.io/api/core/v1" - "kubevirt.io/client-go/log" netvmispec "kubevirt.io/kubevirt/pkg/network/vmispec" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" ) @@ -129,26 +128,7 @@ func CalculateNetworkQueues(vmi *v1.VirtualMachineInstance, ifaceType string) ui if ifaceType != v1.VirtIO { return 0 } - return NetworkQueuesCapacity(vmi) -} - -func NetworkQueuesCapacity(vmi *v1.VirtualMachineInstance) uint32 { - if !isTrue(vmi.Spec.Domain.Devices.NetworkInterfaceMultiQueue) { - return 0 - } - - cpuTopology := vcpu.GetCPUTopology(vmi) - queueNumber := vcpu.CalculateRequestedVCPUs(cpuTopology) - - if queueNumber > multiQueueMaxQueues { - log.Log.V(3).Infof("Capped the number of queues to be the current maximum of tap device queues: %d", multiQueueMaxQueues) - queueNumber = multiQueueMaxQueues - } - return queueNumber -} - -func isTrue(networkInterfaceMultiQueue *bool) bool { - return (networkInterfaceMultiQueue != nil) && (*networkInterfaceMultiQueue) + return virtlauncher.NetworkQueuesCapacity(vmi) } func translateModel(useVirtioTransitional *bool, bus string, archString string) string { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go index a62a4a599a2b..713b171c33a1 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/numa_placement_test.go @@ -10,6 +10,7 @@ import ( v1 "kubevirt.io/api/core/v1" cmdv1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" ) @@ -37,7 +38,7 @@ var _ = Describe("NumaPlacement", func() { EmulatorPin: nil, }, } - givenSpec.Memory, err = QuantityToByte(resource.MustParse("64Mi")) + givenSpec.Memory, err = virtlauncher.QuantityToByte(resource.MustParse("64Mi")) Expect(err).ToNot(HaveOccurred()) givenTopology = &cmdv1.Topology{ NumaCells: []*cmdv1.Cell{ @@ -131,7 +132,7 @@ var _ = Describe("NumaPlacement", func() { It("should detect if not enough memory is requested", func() { var err error memory := resource.MustParse("2Mi") - givenSpec.Memory, err = QuantityToByte(memory) + givenSpec.Memory, err = virtlauncher.QuantityToByte(memory) Expect(err).ToNot(HaveOccurred()) givenVMI.Spec.Domain.Memory.Guest = &memory Expect(numaMapping(givenVMI, givenSpec, givenTopology)).ToNot(Succeed()) @@ -139,7 +140,7 @@ var _ = Describe("NumaPlacement", func() { It("should detect not divisable hugepages and shuffle the memory", func() { var err error - givenSpec.Memory, err = QuantityToByte(resource.MustParse("66Mi")) + givenSpec.Memory, err = virtlauncher.QuantityToByte(resource.MustParse("66Mi")) Expect(err).ToNot(HaveOccurred()) givenSpec.CPUTune.VCPUPin = append(givenSpec.CPUTune.VCPUPin, api.CPUTuneVCPUPin{ VCPU: 4, CPUSet: "40", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go index 41c3a4a7d557..f665efbc3f9e 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/vcpu.go @@ -15,6 +15,7 @@ import ( v1 "kubevirt.io/kubevirt/pkg/handler-launcher-com/cmd/v1" "kubevirt.io/kubevirt/pkg/util/hardware" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" ) @@ -23,10 +24,6 @@ type VCPUPool interface { FitThread() (thread uint32, err error) } -func CalculateRequestedVCPUs(cpuTopology *api.CPUTopology) uint32 { - return cpuTopology.Cores * cpuTopology.Sockets * cpuTopology.Threads -} - type cell struct { fullCoresList [][]uint32 fragmentedCoresList []uint32 @@ -289,72 +286,6 @@ func (p *cpuPool) fitThread() (thread *uint32) { return nil } -func GetCPUTopology(vmi *v12.VirtualMachineInstance) *api.CPUTopology { - cores := uint32(1) - threads := uint32(1) - sockets := uint32(1) - vmiCPU := vmi.Spec.Domain.CPU - if vmiCPU != nil { - if vmiCPU.Cores != 0 { - cores = vmiCPU.Cores - } - - if vmiCPU.Threads != 0 { - threads = vmiCPU.Threads - } - - if vmiCPU.Sockets != 0 { - sockets = vmiCPU.Sockets - } - } - // A default guest CPU topology is being set in API mutator webhook, if nothing provided by a user. - // However this setting is still required to handle situations when the webhook fails to set a default topology. - if vmiCPU == nil || (vmiCPU.Cores == 0 && vmiCPU.Sockets == 0 && vmiCPU.Threads == 0) { - //if cores, sockets, threads are not set, take value from domain resources request or limits and - //set value into sockets, which have best performance (https://bugzilla.redhat.com/show_bug.cgi?id=1653453) - resources := vmi.Spec.Domain.Resources - if cpuLimit, ok := resources.Limits[k8sv1.ResourceCPU]; ok { - sockets = uint32(cpuLimit.Value()) - } else if cpuRequests, ok := resources.Requests[k8sv1.ResourceCPU]; ok { - sockets = uint32(cpuRequests.Value()) - } - } - - return &api.CPUTopology{ - Sockets: sockets, - Cores: cores, - Threads: threads, - } -} - -func QuantityToByte(quantity resource.Quantity) (api.Memory, error) { - memorySize, isInt := quantity.AsInt64() - if !isInt { - memorySize = quantity.Value() - 1 - } - - if memorySize < 0 { - return api.Memory{Unit: "b"}, fmt.Errorf("Memory size '%s' must be greater than or equal to 0", quantity.String()) - } - return api.Memory{ - Value: uint64(memorySize), - Unit: "b", - }, nil -} - -func QuantityToMebiByte(quantity resource.Quantity) (uint64, error) { - bytes, err := QuantityToByte(quantity) - if err != nil { - return 0, err - } - if bytes.Value == 0 { - return 0, nil - } else if bytes.Value < 1048576 { - return 1, nil - } - return uint64(float64(bytes.Value)/1048576 + 0.5), nil -} - func isNumaPassthrough(vmi *v12.VirtualMachineInstance) bool { return vmi.Spec.Domain.CPU.NUMA != nil && vmi.Spec.Domain.CPU.NUMA.GuestMappingPassthrough != nil } @@ -375,7 +306,7 @@ func appendDomainIOThreadPin(domain *api.Domain, thread uint32, cpuset string) { func FormatDomainIOThreadPin(vmi *v12.VirtualMachineInstance, domain *api.Domain, emulatorThreadsCPUSet string, cpuset []int) error { iothreads := int(domain.Spec.IOThreads.IOThreads) - vcpus := int(CalculateRequestedVCPUs(domain.Spec.CPU.Topology)) + vcpus := int(virtlauncher.CalculateRequestedVCPUs(domain.Spec.CPU.Topology)) switch { case vmi.Spec.Domain.IOThreads != nil && *vmi.Spec.Domain.IOThreads.SupplementalPoolThreadCount > 0: @@ -618,7 +549,7 @@ func numaMapping(vmi *v12.VirtualMachineInstance, domain *api.DomainSpec, topolo } domain.MemoryBacking.Allocation = &api.MemoryAllocation{Mode: api.MemoryAllocationModeImmediate} - memory, err := QuantityToByte(*GetVirtualMemory(vmi)) + memory, err := virtlauncher.QuantityToByte(*GetVirtualMemory(vmi)) memoryBytes := memory.Value if err != nil { return fmt.Errorf("could not convert VMI memory to quantity: %v", err) @@ -682,7 +613,7 @@ func hugePagesInfo(vmi *v12.VirtualMachineInstance, domain *api.DomainSpec) (siz if err != nil { return 0, "", false, fmt.Errorf("could not parse hugepage value %v: %v", vmi.Spec.Domain.Memory.Hugepages.PageSize, err) } - size, err := QuantityToByte(quantity) + size, err := virtlauncher.QuantityToByte(quantity) if err != nil { return 0, "b", false, fmt.Errorf("could not convert page size to MiB %v: %v", vmi.Spec.Domain.Memory.Hugepages.PageSize, err) } diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go index b6e068872b15..d362c2ad8d37 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/live-migration-source.go @@ -47,6 +47,7 @@ import ( hotplugdisk "kubevirt.io/kubevirt/pkg/hotplug-disk" storagetypes "kubevirt.io/kubevirt/pkg/storage/types" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice" @@ -157,14 +158,14 @@ func generateDomainForTargetCPUSetAndTopology(vmi *v1.VirtualMachineInstance, do } domain := api.NewMinimalDomain(vmi.Name) domain.Spec = *domSpec - cpuTopology := vcpu.GetCPUTopology(vmi) - cpuCount := vcpu.CalculateRequestedVCPUs(cpuTopology) + cpuTopology := virtlauncher.GetCPUTopology(vmi) + cpuCount := virtlauncher.CalculateRequestedVCPUs(cpuTopology) // update cpu count to maximum hot plugable CPUs vmiCPU := vmi.Spec.Domain.CPU if vmiCPU != nil && vmiCPU.MaxSockets != 0 { cpuTopology.Sockets = vmiCPU.MaxSockets - cpuCount = vcpu.CalculateRequestedVCPUs(cpuTopology) + cpuCount = virtlauncher.CalculateRequestedVCPUs(cpuTopology) } domain.Spec.CPU.Topology = cpuTopology domain.Spec.VCPU = &api.VCPU{ @@ -743,7 +744,7 @@ func (l *LibvirtDomainManager) asyncMigrationAbort(vmi *v1.VirtualMachineInstanc } func generateMigrationParams(dom cli.VirDomain, vmi *v1.VirtualMachineInstance, options *cmdclient.MigrationOptions, virtShareDir string, domSpec *api.DomainSpec) (*libvirt.DomainMigrateParameters, error) { - bandwidth, err := vcpu.QuantityToMebiByte(options.Bandwidth) + bandwidth, err := virtlauncher.QuantityToMebiByte(options.Bandwidth) if err != nil { return nil, err } diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go index 5cd0045d8996..88376c99432a 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager.go @@ -78,6 +78,7 @@ import ( hw_utils "kubevirt.io/kubevirt/pkg/util/hardware" "kubevirt.io/kubevirt/pkg/virt-controller/services" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" accesscredentials "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" @@ -450,8 +451,8 @@ func (l *LibvirtDomainManager) UpdateVCPUs(vmi *v1.VirtualMachineInstance, optio logger := log.Log.Object(vmi) - vcpuTopology := vcpu.GetCPUTopology(vmi) - vcpuCount := vcpu.CalculateRequestedVCPUs(vcpuTopology) + vcpuTopology := virtlauncher.GetCPUTopology(vmi) + vcpuCount := virtlauncher.CalculateRequestedVCPUs(vcpuTopology) // hot plug/unplug vCPUs if err := dom.SetVcpusFlags(uint(vcpuCount), affectDomainVCPULiveAndConfigLibvirtFlags); err != nil { diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go index 00db85fc96cc..0dd37e09bab3 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/manager_test.go @@ -58,11 +58,11 @@ import ( "kubevirt.io/kubevirt/pkg/util/net/ip" virtconfig "kubevirt.io/kubevirt/pkg/virt-config" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch" - "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/efi" "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/testing" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" @@ -1422,11 +1422,11 @@ var _ = Describe("Manager", func() { It("should update the virtio-mem device if it already exists", func() { mockLibvirt.ConnectionEXPECT().LookupDomainByName(api.VMINamespaceKeyFunc(vmi)).Return(mockLibvirt.VirtDomain, nil) - size, err := vcpu.QuantityToByte(resource.MustParse("128Mi")) + size, err := virtlauncher.QuantityToByte(resource.MustParse("128Mi")) Expect(err).ToNot(HaveOccurred()) - requested, err := vcpu.QuantityToByte(resource.MustParse("64Mi")) + requested, err := virtlauncher.QuantityToByte(resource.MustParse("64Mi")) Expect(err).ToNot(HaveOccurred()) - block, err := vcpu.QuantityToByte(resource.MustParse("2Mi")) + block, err := virtlauncher.QuantityToByte(resource.MustParse("2Mi")) Expect(err).ToNot(HaveOccurred()) domainSpec = &api.DomainSpec{ diff --git a/pkg/virt-launcher/util.go b/pkg/virt-launcher/util.go new file mode 100644 index 000000000000..82b812ffb1ac --- /dev/null +++ b/pkg/virt-launcher/util.go @@ -0,0 +1,105 @@ +package virtlauncher + +import ( + "fmt" + + k8sv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + + v1 "kubevirt.io/api/core/v1" + "kubevirt.io/client-go/log" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" +) + +const ( + MultiQueueMaxQueues = uint32(256) +) + +func isTrue(networkInterfaceMultiQueue *bool) bool { + return (networkInterfaceMultiQueue != nil) && (*networkInterfaceMultiQueue) +} + +func NetworkQueuesCapacity(vmi *v1.VirtualMachineInstance) uint32 { + if !isTrue(vmi.Spec.Domain.Devices.NetworkInterfaceMultiQueue) { + return 0 + } + + cpuTopology := GetCPUTopology(vmi) + queueNumber := CalculateRequestedVCPUs(cpuTopology) + + if queueNumber > MultiQueueMaxQueues { + log.Log.V(3).Infof("Capped the number of queues to be the current maximum of tap device queues: %d", MultiQueueMaxQueues) + queueNumber = MultiQueueMaxQueues + } + return queueNumber +} + +func CalculateRequestedVCPUs(cpuTopology *api.CPUTopology) uint32 { + return cpuTopology.Cores * cpuTopology.Sockets * cpuTopology.Threads +} + +func GetCPUTopology(vmi *v1.VirtualMachineInstance) *api.CPUTopology { + cores := uint32(1) + threads := uint32(1) + sockets := uint32(1) + vmiCPU := vmi.Spec.Domain.CPU + if vmiCPU != nil { + if vmiCPU.Cores != 0 { + cores = vmiCPU.Cores + } + + if vmiCPU.Threads != 0 { + threads = vmiCPU.Threads + } + + if vmiCPU.Sockets != 0 { + sockets = vmiCPU.Sockets + } + } + // A default guest CPU topology is being set in API mutator webhook, if nothing provided by a user. + // However this setting is still required to handle situations when the webhook fails to set a default topology. + if vmiCPU == nil || (vmiCPU.Cores == 0 && vmiCPU.Sockets == 0 && vmiCPU.Threads == 0) { + //if cores, sockets, threads are not set, take value from domain resources request or limits and + //set value into sockets, which have best performance (https://bugzilla.redhat.com/show_bug.cgi?id=1653453) + resources := vmi.Spec.Domain.Resources + if cpuLimit, ok := resources.Limits[k8sv1.ResourceCPU]; ok { + sockets = uint32(cpuLimit.Value()) + } else if cpuRequests, ok := resources.Requests[k8sv1.ResourceCPU]; ok { + sockets = uint32(cpuRequests.Value()) + } + } + + return &api.CPUTopology{ + Sockets: sockets, + Cores: cores, + Threads: threads, + } +} + +func QuantityToByte(quantity resource.Quantity) (api.Memory, error) { + memorySize, isInt := quantity.AsInt64() + if !isInt { + memorySize = quantity.Value() - 1 + } + + if memorySize < 0 { + return api.Memory{Unit: "b"}, fmt.Errorf("Memory size '%s' must be greater than or equal to 0", quantity.String()) + } + return api.Memory{ + Value: uint64(memorySize), + Unit: "b", + }, nil +} + +func QuantityToMebiByte(quantity resource.Quantity) (uint64, error) { + bytes, err := QuantityToByte(quantity) + if err != nil { + return 0, err + } + if bytes.Value == 0 { + return 0, nil + } else if bytes.Value < 1048576 { + return 1, nil + } + return uint64(float64(bytes.Value)/1048576 + 0.5), nil +} From 3764fb9410e76a6c7fc8e394af4953f3cd8d683a Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Fri, 13 Jun 2025 13:14:54 -0700 Subject: [PATCH 7/8] Fix cmd --- cmd/fake-cmd-server/BUILD.bazel | 2 +- cmd/fake-cmd-server/fake-cmd-server.go | 2 +- .../network-passt-binding/domain/BUILD.bazel | 2 +- .../domain/configurator.go | 2 +- cmd/virt-launcher/BUILD.bazel | 9 +++-- cmd/virt-launcher/virt-launcher.go | 40 ++++++++++--------- 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/cmd/fake-cmd-server/BUILD.bazel b/cmd/fake-cmd-server/BUILD.bazel index 89522c42d1c7..b28a62559271 100644 --- a/cmd/fake-cmd-server/BUILD.bazel +++ b/cmd/fake-cmd-server/BUILD.bazel @@ -8,7 +8,7 @@ go_library( deps = [ "//pkg/virt-handler/cmd-client:go_default_library", "//pkg/virt-launcher/virtwrap:go_default_library", - "//pkg/virt-launcher/virtwrap/agent:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/fake-cmd-server/fake-cmd-server.go b/cmd/fake-cmd-server/fake-cmd-server.go index bcc7a02cb539..dfb52be27533 100644 --- a/cmd/fake-cmd-server/fake-cmd-server.go +++ b/cmd/fake-cmd-server/fake-cmd-server.go @@ -10,8 +10,8 @@ import ( "kubevirt.io/client-go/log" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent" cmdserver "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cmd-server" ) diff --git a/cmd/sidecars/network-passt-binding/domain/BUILD.bazel b/cmd/sidecars/network-passt-binding/domain/BUILD.bazel index 6fdd56988f4c..4c8382bd8c93 100644 --- a/cmd/sidecars/network-passt-binding/domain/BUILD.bazel +++ b/cmd/sidecars/network-passt-binding/domain/BUILD.bazel @@ -11,7 +11,7 @@ go_library( "//pkg/network/namescheme:go_default_library", "//pkg/network/vmispec:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/device:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/vishvananda/netlink:go_default_library", diff --git a/cmd/sidecars/network-passt-binding/domain/configurator.go b/cmd/sidecars/network-passt-binding/domain/configurator.go index 0276e6cd8655..468c55d2fd15 100644 --- a/cmd/sidecars/network-passt-binding/domain/configurator.go +++ b/cmd/sidecars/network-passt-binding/domain/configurator.go @@ -31,7 +31,7 @@ import ( "kubevirt.io/client-go/log" "kubevirt.io/kubevirt/pkg/network/istio" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/device" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device" "kubevirt.io/kubevirt/pkg/network/driver/netlink" "kubevirt.io/kubevirt/pkg/network/namescheme" diff --git a/cmd/virt-launcher/BUILD.bazel b/cmd/virt-launcher/BUILD.bazel index 085ea39c1c57..61cb52249618 100644 --- a/cmd/virt-launcher/BUILD.bazel +++ b/cmd/virt-launcher/BUILD.bazel @@ -28,14 +28,17 @@ go_library( "//pkg/virt-config:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", "//pkg/virt-launcher:go_default_library", + "//pkg/virt-launcher-libvirt-qemu:go_default_library", "//pkg/virt-launcher/metadata:go_default_library", "//pkg/virt-launcher/notify-client:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/notify-client:go_default_library", "//pkg/virt-launcher/virtwrap:go_default_library", - "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/virt-launcher/virt-launcher.go b/cmd/virt-launcher/virt-launcher.go index 6b94cbe694d8..1a46d22b01d2 100644 --- a/cmd/virt-launcher/virt-launcher.go +++ b/cmd/virt-launcher/virt-launcher.go @@ -51,15 +51,17 @@ import ( putil "kubevirt.io/kubevirt/pkg/util" virtconfig "kubevirt.io/kubevirt/pkg/virt-config" cmdclient "kubevirt.io/kubevirt/pkg/virt-handler/cmd-client" - virtlauncher "kubevirt.io/kubevirt/pkg/virt-launcher" + virtlauncherlibvirtqemu "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu" + notifyclient "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/notify-client" + virtwraplibvirtqemu "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap" + agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller" + virtcli "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/cli" + "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/util" "kubevirt.io/kubevirt/pkg/virt-launcher/metadata" - notifyclient "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client" + notifyclientcommon "kubevirt.io/kubevirt/pkg/virt-launcher/notify-client" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap" - agentpoller "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/agent-poller" "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" - virtcli "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cli" cmdserver "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/cmd-server" - "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/util" ) const defaultStartTimeout = 3 * time.Minute @@ -129,7 +131,7 @@ func createLibvirtConnection(runWithNonRoot bool) virtcli.Connection { } func startDomainEventMonitoring( - notifier *notifyclient.Notifier, + notifier *notifyclientcommon.NotifyClient, domainConn virtcli.Connection, deleteNotificationSent chan watch.Event, vmi *v1.VirtualMachineInstance, @@ -151,7 +153,7 @@ func startDomainEventMonitoring( } }() - err := notifier.StartDomainNotifier(domainConn, deleteNotificationSent, vmi, domainName, agentStore, qemuAgentSysInterval, qemuAgentFileInterval, qemuAgentUserInterval, qemuAgentVersionInterval, qemuAgentFSFreezeStatusInterval, metadataCache) + err := notifyclient.StartLibvirtNotifier(notifier, domainConn, deleteNotificationSent, vmi, domainName, agentStore, qemuAgentSysInterval, qemuAgentFileInterval, qemuAgentUserInterval, qemuAgentVersionInterval, qemuAgentFSFreezeStatusInterval, metadataCache) if err != nil { panic(err) } @@ -166,7 +168,7 @@ func initializeDirs(ephemeralDiskDir string, mask := syscall.Umask(0) defer syscall.Umask(mask) - err := virtlauncher.InitializePrivateDirectories(filepath.Join("/var/run/kubevirt-private", uid)) + err := virtlauncherlibvirtqemu.InitializePrivateDirectories(filepath.Join("/var/run/kubevirt-private", uid)) if err != nil { panic(err) } @@ -191,37 +193,37 @@ func initializeDirs(ephemeralDiskDir string, panic(err) } - err = virtlauncher.InitializeDisksDirectories(filepath.Join("/var/run/kubevirt-private", "vm-disks")) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(filepath.Join("/var/run/kubevirt-private", "vm-disks")) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(config.ConfigMapDisksDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(config.ConfigMapDisksDir) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(config.SysprepDisksDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(config.SysprepDisksDir) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(config.SecretDisksDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(config.SecretDisksDir) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(config.DownwardAPIDisksDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(config.DownwardAPIDisksDir) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(config.ServiceAccountDiskDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(config.ServiceAccountDiskDir) if err != nil { panic(err) } - err = virtlauncher.InitializeDisksDirectories(downwardmetrics.DownwardMetricsChannelDir) + err = virtlauncherlibvirtqemu.InitializeDisksDirectories(downwardmetrics.DownwardMetricsChannelDir) if err != nil { panic(err) } @@ -378,7 +380,7 @@ func main() { initializeDirs(*ephemeralDiskDir, *containerDiskDir, *hotplugDiskDir, *uid) if !*runWithNonRoot { - err := virtlauncher.InitializeConsoleLogFile(filepath.Join("/var/run/kubevirt-private", *uid)) + err := virtlauncherlibvirtqemu.InitializeConsoleLogFile(filepath.Join("/var/run/kubevirt-private", *uid)) if err != nil { panic(err) } @@ -422,13 +424,13 @@ func main() { var agentStore = agentpoller.NewAsyncAgentStore() - notifier := notifyclient.NewNotifier(*virtShareDir) + notifier := notifyclientcommon.NewNotifyClient(*virtShareDir) defer notifier.Close() metadataCache := metadata.NewCache() signalStopChan := make(chan struct{}) - domainManager, err := virtwrap.NewLibvirtDomainManager(domainConn, *virtShareDir, *ephemeralDiskDir, &agentStore, *ovmfPath, ephemeralDiskCreator, metadataCache, signalStopChan, *diskMemoryLimitBytes, util.GetPodCPUSet, *imageVolumeEnabled) + domainManager, err := virtwraplibvirtqemu.NewLibvirtDomainManager(domainConn, *virtShareDir, *ephemeralDiskDir, &agentStore, *ovmfPath, ephemeralDiskCreator, metadataCache, signalStopChan, *diskMemoryLimitBytes, util.GetPodCPUSet, *imageVolumeEnabled) if err != nil { panic(err) } @@ -488,7 +490,7 @@ func main() { } else { pidDir = "/run/libvirt/qemu" } - mon := virtlauncher.NewProcessMonitor(domainName, + mon := virtlauncherlibvirtqemu.NewProcessMonitor(domainName, pidDir, *gracePeriodSeconds, finalShutdownCallback, From 69a5b8f3f135ce2bc0c8e6229c69dd3b4cae03fd Mon Sep 17 00:00:00 2001 From: Harshit Gupta Date: Mon, 16 Jun 2025 08:09:43 -0700 Subject: [PATCH 8/8] bazel-build working --- cmd/fake-cmd-server/BUILD.bazel | 2 +- .../network-passt-binding/domain/BUILD.bazel | 2 +- cmd/virt-launcher/BUILD.bazel | 11 +++--- nogo_config.json | 2 + pkg/liveupdate/memory/BUILD.bazel | 4 +- pkg/network/setup/BUILD.bazel | 2 +- .../notify-client/BUILD.bazel | 21 +++-------- .../virtwrap/BUILD.bazel | 20 +++++----- .../virtwrap/access-credentials/BUILD.bazel | 8 ++-- .../virtwrap/agent-poller/BUILD.bazel | 4 +- .../virtwrap/cli/BUILD.bazel | 4 +- .../virtwrap/converter/BUILD.bazel | 6 ++- .../virtwrap/converter/arch/BUILD.bazel | 2 +- .../virtwrap/converter/vcpu/BUILD.bazel | 2 + .../virtwrap/device/hostdevice/BUILD.bazel | 2 +- .../device/hostdevice/generic/BUILD.bazel | 4 +- .../device/hostdevice/gpu/BUILD.bazel | 4 +- .../device/hostdevice/sriov/BUILD.bazel | 4 +- .../virtwrap/statsconv/BUILD.bazel | 2 +- .../virtwrap/util/BUILD.bazel | 4 +- pkg/virt-launcher/BUILD.bazel | 15 ++++++++ pkg/virt-launcher/metadata/BUILD.bazel | 1 - pkg/virt-launcher/notify-client/BUILD.bazel | 32 +--------------- pkg/virt-launcher/util.go | 1 + pkg/virt-launcher/virtwrap/BUILD.bazel | 37 ++++++------------- .../virtwrap/cmd-server/BUILD.bazel | 6 +-- 26 files changed, 85 insertions(+), 117 deletions(-) create mode 100644 pkg/virt-launcher/BUILD.bazel diff --git a/cmd/fake-cmd-server/BUILD.bazel b/cmd/fake-cmd-server/BUILD.bazel index b28a62559271..59d4b316bebd 100644 --- a/cmd/fake-cmd-server/BUILD.bazel +++ b/cmd/fake-cmd-server/BUILD.bazel @@ -7,8 +7,8 @@ go_library( visibility = ["//visibility:private"], deps = [ "//pkg/virt-handler/cmd-client:go_default_library", - "//pkg/virt-launcher/virtwrap:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", + "//pkg/virt-launcher/virtwrap:go_default_library", "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/cmd/sidecars/network-passt-binding/domain/BUILD.bazel b/cmd/sidecars/network-passt-binding/domain/BUILD.bazel index 4c8382bd8c93..686e1fad1691 100644 --- a/cmd/sidecars/network-passt-binding/domain/BUILD.bazel +++ b/cmd/sidecars/network-passt-binding/domain/BUILD.bazel @@ -10,8 +10,8 @@ go_library( "//pkg/network/istio:go_default_library", "//pkg/network/namescheme:go_default_library", "//pkg/network/vmispec:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/vishvananda/netlink:go_default_library", diff --git a/cmd/virt-launcher/BUILD.bazel b/cmd/virt-launcher/BUILD.bazel index 61cb52249618..08723966b764 100644 --- a/cmd/virt-launcher/BUILD.bazel +++ b/cmd/virt-launcher/BUILD.bazel @@ -27,18 +27,17 @@ go_library( "//pkg/util:go_default_library", "//pkg/virt-config:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", - "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher-libvirt-qemu:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/notify-client:go_default_library", "//pkg/virt-launcher-libvirt-qemu/notify-client:go_default_library", - "//pkg/virt-launcher/virtwrap:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/notify-client:go_default_library", + "//pkg/virt-launcher/virtwrap:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", diff --git a/nogo_config.json b/nogo_config.json index 2a9412b2f30b..3e56b12158b3 100644 --- a/nogo_config.json +++ b/nogo_config.json @@ -133,6 +133,7 @@ "exclude_files": { "pkg/.*_test\\.go": "unit tests are allowed to use banned imports", "vendor/": "vendor doesn't pass bannedAPI", + "pkg/virt-launcher-libvirt-qemu/": "KubeVirt virt-launcher-libvirt-qemu pkg does not pass bannedAPI yet", "external/": "external doesn't pass bannedAPI" } }, @@ -165,6 +166,7 @@ "pkg/virt-api/": "KubeVirt virt-api pkg does not pass errcheck yet", "pkg/virt-handler/": "KubeVirt virt-handler pkg does not pass errcheck yet", "pkg/virt-launcher/": "KubeVirt virt-launcher pkg does not pass errcheck yet", + "pkg/virt-launcher-libvirt-qemu/": "KubeVirt virt-launcher-libvirt-qemu pkg does not pass errcheck yet", "pkg/virt-operator/": "KubeVirt virt-operator pkg does not pass errcheck yet", "pkg/virtctl/": "KubeVirt virtctl pkg does not pass errcheck yet", "cmd/": "KubeVirt binaries do not pass errcheck yet", diff --git a/pkg/liveupdate/memory/BUILD.bazel b/pkg/liveupdate/memory/BUILD.bazel index 9a3a5fd4e7c3..1b8bbded7262 100644 --- a/pkg/liveupdate/memory/BUILD.bazel +++ b/pkg/liveupdate/memory/BUILD.bazel @@ -6,8 +6,8 @@ go_library( importpath = "kubevirt.io/kubevirt/pkg/liveupdate/memory", visibility = ["//visibility:public"], deps = [ + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], @@ -22,8 +22,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/libvmi:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter/vcpu:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/network/setup/BUILD.bazel b/pkg/network/setup/BUILD.bazel index 1cbf08c13152..6561dbe59989 100644 --- a/pkg/network/setup/BUILD.bazel +++ b/pkg/network/setup/BUILD.bazel @@ -26,8 +26,8 @@ go_library( "//pkg/network/setup/netpod/masquerade:go_default_library", "//pkg/network/vmispec:go_default_library", "//pkg/util:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//staging/src/kubevirt.io/client-go/precond:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel index 6fafc3c3d21e..e2533447984e 100644 --- a/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/notify-client/BUILD.bazel @@ -6,29 +6,19 @@ go_library( importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/notify-client", visibility = ["//visibility:public"], deps = [ - "//pkg/apimachinery/wait:go_default_library", - "//pkg/ephemeral-disk-utils:go_default_library", - "//pkg/handler-launcher-com:go_default_library", - "//pkg/handler-launcher-com/notify/info:go_default_library", - "//pkg/handler-launcher-com/notify/v1:go_default_library", - "//pkg/util/net/grpc:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/notify-client:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", "//vendor/libvirt.org/go/libvirt:go_default_library", - "@org_golang_google_grpc//:go_default_library", ], ) @@ -43,10 +33,11 @@ go_test( "//pkg/handler-launcher-com/notify/info:go_default_library", "//pkg/testutils:go_default_library", "//pkg/virt-handler/notify-server:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/notify-client:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel index fc9d5f73288a..b8cfe4725277 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/BUILD.bazel @@ -4,7 +4,6 @@ load("@kubevirt//tools/ginkgo:ginkgo.bzl", "ginkgo_test") go_library( name = "go_default_library", srcs = [ - "generated_mock_manager.go", "live-migration-source.go", "live-migration-target.go", "manager.go", @@ -46,12 +45,10 @@ go_library( "//pkg/virt-controller/services:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", "//pkg/virt-handler/migration-proxy:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", @@ -63,13 +60,15 @@ go_library( "//pkg/virt-launcher-libvirt-qemu/virtwrap/efi:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/libvirtxml:go_default_library", - "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//tools/cache:go_default_library", - "//vendor/go.uber.org/mock/gomock:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -107,16 +106,17 @@ go_test( "//pkg/util/net/ip:go_default_library", "//pkg/virt-config:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", - "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/efi:go_default_library", - "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel index 328d086d3f37..4cd7502d94a2 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/access-credentials/BUILD.bazel @@ -7,11 +7,11 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/config:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", @@ -27,13 +27,13 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/handler-launcher-com/cmd/v1:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/util:go_default_library", + "//pkg/virt-launcher/metadata:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel index 870187b0632f..2687ca059ff7 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller/BUILD.bazel @@ -9,8 +9,8 @@ go_library( importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/agent-poller", visibility = ["//visibility:public"], deps = [ - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", @@ -28,8 +28,8 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel index 8ae6e46bf016..2142616a8b30 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/cli/BUILD.bazel @@ -11,10 +11,10 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/apimachinery/wait:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", - "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/go.uber.org/mock/gomock:go_default_library", "//vendor/libvirt.org/go/libvirt:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel index d6da21c2c958..068cd506f529 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/BUILD.bazel @@ -31,11 +31,12 @@ go_library( "//pkg/util:go_default_library", "//pkg/virt-controller/services:go_default_library", "//pkg/virt-controller/watch/topology:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virtiofs:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", @@ -73,10 +74,11 @@ go_test( "//pkg/testutils:go_default_library", "//pkg/util/hardware:go_default_library", "//pkg/virt-controller/services:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/launchsecurity:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel index 63c06a15c2c8..d63ead8c5f17 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch/BUILD.bazel @@ -13,8 +13,8 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/pointer:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", ], diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel index 2156fe44168e..c135419d0a86 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/converter/vcpu/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "//pkg/handler-launcher-com/cmd/v1:go_default_library", "//pkg/util/hardware:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", @@ -26,6 +27,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/handler-launcher-com/cmd/v1:go_default_library", + "//pkg/virt-launcher:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel index 46f75d334b9b..18e410cfa483 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/BUILD.bazel @@ -11,8 +11,8 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/util:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/libvirt.org/go/libvirt:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel index 48dc1771bb31..1ba65c9810cf 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic/BUILD.bazel @@ -9,8 +9,8 @@ go_library( importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/generic", visibility = ["//visibility:public"], deps = [ - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", ], ) @@ -24,8 +24,8 @@ go_test( ], deps = [ ":go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel index e1515bac5eed..af7e6ca79c0c 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu/BUILD.bazel @@ -9,8 +9,8 @@ go_library( importpath = "kubevirt.io/kubevirt/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/gpu", visibility = ["//visibility:public"], deps = [ - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", ], ) @@ -24,8 +24,8 @@ go_test( ], deps = [ ":go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel index c6d9f8583d36..8ec6d82c2940 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice/sriov/BUILD.bazel @@ -14,9 +14,9 @@ go_library( "//pkg/network/deviceinfo:go_default_library", "//pkg/network/downwardapi:go_default_library", "//pkg/network/vmispec:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", ], @@ -34,9 +34,9 @@ go_test( ":go_default_library", "//pkg/network/deviceinfo:go_default_library", "//pkg/network/vmispec:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/device/hostdevice:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel index ad3aec267c54..fb7da65f78c1 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/BUILD.bazel @@ -23,8 +23,8 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/statsconv/util:go_default_library", + "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", diff --git a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel index d9890b526b6f..f389c3cc4b66 100644 --- a/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel +++ b/pkg/virt-launcher-libvirt-qemu/virtwrap/util/BUILD.bazel @@ -14,9 +14,9 @@ go_library( "//pkg/util/hardware:go_default_library", "//pkg/virt-controller/services:go_default_library", "//pkg/virt-handler/cgroup:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/cli:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", @@ -38,10 +38,10 @@ go_test( "//pkg/hooks:go_default_library", "//pkg/pointer:go_default_library", "//pkg/virt-controller/services:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/converter/arch:go_default_library", "//pkg/virt-launcher-libvirt-qemu/virtwrap/testing:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/api:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", diff --git a/pkg/virt-launcher/BUILD.bazel b/pkg/virt-launcher/BUILD.bazel new file mode 100644 index 000000000000..a331c188ba9d --- /dev/null +++ b/pkg/virt-launcher/BUILD.bazel @@ -0,0 +1,15 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["util.go"], + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher", + visibility = ["//visibility:public"], + deps = [ + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//staging/src/kubevirt.io/api/core/v1:go_default_library", + "//staging/src/kubevirt.io/client-go/log:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + ], +) diff --git a/pkg/virt-launcher/metadata/BUILD.bazel b/pkg/virt-launcher/metadata/BUILD.bazel index 654f1916bc66..aa7802dc963e 100644 --- a/pkg/virt-launcher/metadata/BUILD.bazel +++ b/pkg/virt-launcher/metadata/BUILD.bazel @@ -22,7 +22,6 @@ go_test( "metadata_test.go", ], deps = [ - ":go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", "//staging/src/kubevirt.io/client-go/testutils:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", diff --git a/pkg/virt-launcher/notify-client/BUILD.bazel b/pkg/virt-launcher/notify-client/BUILD.bazel index 618d4be73c18..82d3f81bce95 100644 --- a/pkg/virt-launcher/notify-client/BUILD.bazel +++ b/pkg/virt-launcher/notify-client/BUILD.bazel @@ -12,13 +12,7 @@ go_library( "//pkg/handler-launcher-com/notify/info:go_default_library", "//pkg/handler-launcher-com/notify/v1:go_default_library", "//pkg/util/net/grpc:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/agent-poller:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/cli:go_default_library", - "//pkg/virt-launcher/virtwrap/converter:go_default_library", - "//pkg/virt-launcher/virtwrap/errors:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", @@ -34,29 +28,7 @@ go_library( go_test( name = "go_default_test", - srcs = [ - "client_suite_test.go", - "notify_test.go", - ], + srcs = ["client_suite_test.go"], embed = [":go_default_library"], - deps = [ - "//pkg/handler-launcher-com/notify/info:go_default_library", - "//pkg/testutils:go_default_library", - "//pkg/virt-handler/notify-server:go_default_library", - "//pkg/virt-launcher/metadata:go_default_library", - "//pkg/virt-launcher/virtwrap/api:go_default_library", - "//pkg/virt-launcher/virtwrap/testing:go_default_library", - "//pkg/virt-launcher/virtwrap/util:go_default_library", - "//staging/src/kubevirt.io/api/core/v1:go_default_library", - "//staging/src/kubevirt.io/client-go/api:go_default_library", - "//staging/src/kubevirt.io/client-go/testutils:go_default_library", - "//vendor/github.com/onsi/ginkgo/v2:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/go.uber.org/mock/gomock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/libvirt.org/go/libvirt:go_default_library", - ], + deps = ["//staging/src/kubevirt.io/client-go/testutils:go_default_library"], ) diff --git a/pkg/virt-launcher/util.go b/pkg/virt-launcher/util.go index 82b812ffb1ac..d02001670daf 100644 --- a/pkg/virt-launcher/util.go +++ b/pkg/virt-launcher/util.go @@ -8,6 +8,7 @@ import ( v1 "kubevirt.io/api/core/v1" "kubevirt.io/client-go/log" + "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap/api" ) diff --git a/pkg/virt-launcher/virtwrap/BUILD.bazel b/pkg/virt-launcher/virtwrap/BUILD.bazel index 7aaede931528..f0dad45bd83b 100644 --- a/pkg/virt-launcher/virtwrap/BUILD.bazel +++ b/pkg/virt-launcher/virtwrap/BUILD.bazel @@ -1,34 +1,19 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["monitor.go"], - importpath = "kubevirt.io/kubevirt/pkg/virt-launcher", - visibility = ["//visibility:public"], - deps = [ - "//pkg/ephemeral-disk-utils:go_default_library", - "//pkg/util:go_default_library", - "//pkg/virt-launcher/virtwrap/cmd-server:go_default_library", - "//staging/src/kubevirt.io/client-go/log:go_default_library", - ], -) - -go_test( - name = "go_default_test", srcs = [ - "monitor_test.go", - "virt_launcher_suite_test.go", - ], - args = [ - "--fake-qemu-binary-path", - "$(location //cmd/fake-qemu-process)", + "generated_mock_manager.go", + "manager.go", ], - data = ["//cmd/fake-qemu-process"], - embed = [":go_default_library"], + importpath = "kubevirt.io/kubevirt/pkg/virt-launcher/virtwrap", + visibility = ["//visibility:public"], deps = [ - "//staging/src/kubevirt.io/client-go/testutils:go_default_library", - "//vendor/github.com/google/uuid:go_default_library", - "//vendor/github.com/onsi/ginkgo/v2:go_default_library", - "//vendor/github.com/onsi/gomega:go_default_library", + "//pkg/handler-launcher-com/cmd/v1:go_default_library", + "//pkg/virt-handler/cmd-client:go_default_library", + "//pkg/virt-launcher/virtwrap/api:go_default_library", + "//pkg/virt-launcher/virtwrap/stats:go_default_library", + "//staging/src/kubevirt.io/api/core/v1:go_default_library", + "//vendor/go.uber.org/mock/gomock:go_default_library", ], ) diff --git a/pkg/virt-launcher/virtwrap/cmd-server/BUILD.bazel b/pkg/virt-launcher/virtwrap/cmd-server/BUILD.bazel index 40d1926902d8..e848a65559e1 100644 --- a/pkg/virt-launcher/virtwrap/cmd-server/BUILD.bazel +++ b/pkg/virt-launcher/virtwrap/cmd-server/BUILD.bazel @@ -13,9 +13,9 @@ go_library( "//pkg/handler-launcher-com/cmd/v1:go_default_library", "//pkg/util/net/grpc:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/errors:go_default_library", "//pkg/virt-launcher/virtwrap:go_default_library", - "//pkg/virt-launcher/virtwrap/agent:go_default_library", - "//pkg/virt-launcher/virtwrap/errors:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", @@ -34,8 +34,8 @@ go_test( "//pkg/handler-launcher-com/cmd/info:go_default_library", "//pkg/handler-launcher-com/cmd/v1:go_default_library", "//pkg/virt-handler/cmd-client:go_default_library", + "//pkg/virt-launcher-libvirt-qemu/virtwrap/agent:go_default_library", "//pkg/virt-launcher/virtwrap:go_default_library", - "//pkg/virt-launcher/virtwrap/agent:go_default_library", "//pkg/virt-launcher/virtwrap/api:go_default_library", "//pkg/virt-launcher/virtwrap/stats:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library",