From acf8acdbd46dff6909cd8866b32add0ce656a3bf Mon Sep 17 00:00:00 2001 From: Roman Sysoev Date: Mon, 27 Apr 2026 18:42:49 +0300 Subject: [PATCH 1/4] test(e2e): add vm version test using new framework Signed-off-by: Roman Sysoev --- test/e2e/default_config.yaml | 1 - test/e2e/internal/config/config.go | 1 - .../testdata/vm-versions/kustomization.yaml | 15 --- test/e2e/legacy/testdata/vm-versions/ns.yaml | 4 - .../testdata/vm-versions/transformer.yaml | 52 -------- .../vm-versions/vd/kustomization.yaml | 4 - .../testdata/vm-versions/vd/vd-root.yaml | 13 -- .../vm-versions/vm/kustomization.yaml | 8 -- .../testdata/vm-versions/vm/transformer.yaml | 54 --------- .../legacy/testdata/vm-versions/vm/vm.yaml | 17 --- test/e2e/legacy/vm_version.go | 114 ------------------ test/e2e/vm/version.go | 81 +++++++++++++ 12 files changed, 81 insertions(+), 283 deletions(-) delete mode 100644 test/e2e/legacy/testdata/vm-versions/kustomization.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/ns.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/transformer.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/vd/kustomization.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/vd/vd-root.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/vm/kustomization.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/vm/transformer.yaml delete mode 100644 test/e2e/legacy/testdata/vm-versions/vm/vm.yaml delete mode 100644 test/e2e/legacy/vm_version.go create mode 100644 test/e2e/vm/version.go diff --git a/test/e2e/default_config.yaml b/test/e2e/default_config.yaml index f359c36022..38339899c9 100644 --- a/test/e2e/default_config.yaml +++ b/test/e2e/default_config.yaml @@ -21,7 +21,6 @@ testData: vmMigrationCancel: "/tmp/testdata/vm-migration-cancel" vmEvacuation: "/tmp/testdata/vm-evacuation" vmDiskAttachment: "/tmp/testdata/vm-disk-attachment" - vmVersions: "/tmp/testdata/vm-versions" vdSnapshots: "/tmp/testdata/vd-snapshots" sshKey: "/tmp/testdata/sshkeys/id_ed" sshUser: "cloud" diff --git a/test/e2e/internal/config/config.go b/test/e2e/internal/config/config.go index c44bb0a98e..d373c59716 100644 --- a/test/e2e/internal/config/config.go +++ b/test/e2e/internal/config/config.go @@ -89,7 +89,6 @@ type TestData struct { VMMigrationCancel string `yaml:"vmMigrationCancel"` VMEvacuation string `yaml:"vmEvacuation"` VMDiskAttachment string `yaml:"vmDiskAttachment"` - VMVersions string `yaml:"vmVersions"` VdSnapshots string `yaml:"vdSnapshots"` Sshkey string `yaml:"sshKey"` SSHUser string `yaml:"sshUser"` diff --git a/test/e2e/legacy/testdata/vm-versions/kustomization.yaml b/test/e2e/legacy/testdata/vm-versions/kustomization.yaml deleted file mode 100644 index fa6e4b5a8b..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/kustomization.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: testcases -namePrefix: pr-number-or-commit-hash- -resources: - - ns.yaml - - vm - - vd -configurations: - - transformer.yaml -labels: - - includeSelectors: true - pairs: - id: pr-number-or-commit-hash - testcase: vm-versions diff --git a/test/e2e/legacy/testdata/vm-versions/ns.yaml b/test/e2e/legacy/testdata/vm-versions/ns.yaml deleted file mode 100644 index 5efde875b6..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/ns.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: default diff --git a/test/e2e/legacy/testdata/vm-versions/transformer.yaml b/test/e2e/legacy/testdata/vm-versions/transformer.yaml deleted file mode 100644 index ec70d37fcd..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/transformer.yaml +++ /dev/null @@ -1,52 +0,0 @@ -namespace: - - kind: ClusterVirtualImage - path: spec/dataSource/objectRef/namespace -nameReference: - - kind: VirtualImage - version: v1alpha2 # optional - fieldSpecs: - - path: spec/dataSource/objectRef/name - kind: ClusterVirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualDisk - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - kind: ClusterVirtualImage - version: v1alpha2 # optional - fieldSpecs: - - path: spec/dataSource/objectRef/name - kind: ClusterVirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualDisk - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - kind: VirtualDisk - version: v1alpha2 # optional - fieldSpecs: - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - path: spec/blockDeviceRef/name - kind: VirtualMachineBlockDeviceAttachment - - kind: Secret - fieldSpecs: - - path: spec/provisioning/userDataRef/name - kind: VirtualMachine - - kind: VirtualMachineIPAddress - version: v1alpha2 - fieldSpecs: - - path: spec/virtualMachineIPAddressName - kind: VirtualMachine - - kind: VirtualMachine - version: v1alpha2 - fieldSpecs: - - path: spec/virtualMachineName - kind: VirtualMachineBlockDeviceAttachment - - kind: VirtualMachineClass - version: v1alpha3 - fieldSpecs: - - path: spec/virtualMachineClassName - kind: VirtualMachine diff --git a/test/e2e/legacy/testdata/vm-versions/vd/kustomization.yaml b/test/e2e/legacy/testdata/vm-versions/vd/kustomization.yaml deleted file mode 100644 index 0e2842b120..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/vd/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -resources: - - vd-root.yaml diff --git a/test/e2e/legacy/testdata/vm-versions/vd/vd-root.yaml b/test/e2e/legacy/testdata/vm-versions/vd/vd-root.yaml deleted file mode 100644 index 11db56f25c..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/vd/vd-root.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: virtualization.deckhouse.io/v1alpha2 -kind: VirtualDisk -metadata: - name: vd-root -spec: - persistentVolumeClaim: - size: 512Mi - dataSource: - type: ObjectRef - objectRef: - kind: ClusterVirtualImage - name: v12n-e2e-alpine-uefi diff --git a/test/e2e/legacy/testdata/vm-versions/vm/kustomization.yaml b/test/e2e/legacy/testdata/vm-versions/vm/kustomization.yaml deleted file mode 100644 index fc884e732d..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/vm/kustomization.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -resources: - - ./vm.yaml -configurations: - - transformer.yaml -generatorOptions: - disableNameSuffixHash: true diff --git a/test/e2e/legacy/testdata/vm-versions/vm/transformer.yaml b/test/e2e/legacy/testdata/vm-versions/vm/transformer.yaml deleted file mode 100644 index 1dc146a3af..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/vm/transformer.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# https://github.com/kubernetes-sigs/kustomize/blob/master/examples/transformerconfigs/README.md#transformer-configurations - -namespace: - - kind: ClusterVirtualImage - path: spec/dataSource/objectRef/namespace -nameReference: - - kind: VirtualImage - version: v1alpha2 # optional - fieldSpecs: - - path: spec/dataSource/objectRef/name - kind: ClusterVirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualDisk - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - kind: ClusterVirtualImage - version: v1alpha2 # optional - fieldSpecs: - - path: spec/dataSource/objectRef/name - kind: ClusterVirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualImage - - path: spec/dataSource/objectRef/name - kind: VirtualDisk - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - kind: VirtualDisk - version: v1alpha2 # optional - fieldSpecs: - - path: spec/blockDeviceRefs/name - kind: VirtualMachine - - path: spec/blockDeviceRef/name - kind: VirtualMachineBlockDeviceAttachment - - kind: Secret - fieldSpecs: - - path: spec/provisioning/userDataRef/name - kind: VirtualMachine - - kind: VirtualMachineIPAddress - version: v1alpha2 - fieldSpecs: - - path: spec/virtualMachineIPAddressName - kind: VirtualMachine - - kind: VirtualMachine - version: v1alpha2 - fieldSpecs: - - path: spec/virtualMachineName - kind: VirtualMachineBlockDeviceAttachment - - kind: VirtualMachineClass - version: v1alpha3 - fieldSpecs: - - path: spec/virtualMachineClassName - kind: VirtualMachine diff --git a/test/e2e/legacy/testdata/vm-versions/vm/vm.yaml b/test/e2e/legacy/testdata/vm-versions/vm/vm.yaml deleted file mode 100644 index 2d72be6ce4..0000000000 --- a/test/e2e/legacy/testdata/vm-versions/vm/vm.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: virtualization.deckhouse.io/v1alpha2 -kind: VirtualMachine -metadata: - name: vm -spec: - bootloader: EFI - virtualMachineClassName: generic - cpu: - cores: 1 - coreFraction: 50% - memory: - size: 256Mi - disruptions: - restartApprovalMode: Manual - blockDeviceRefs: - - kind: VirtualDisk - name: vd-root diff --git a/test/e2e/legacy/vm_version.go b/test/e2e/legacy/vm_version.go deleted file mode 100644 index 1ef1c66aee..0000000000 --- a/test/e2e/legacy/vm_version.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2024 Flant JSC - -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. -*/ - -package legacy - -import ( - "fmt" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/deckhouse/virtualization/api/core/v1alpha2" - "github.com/deckhouse/virtualization/test/e2e/internal/config" - kc "github.com/deckhouse/virtualization/test/e2e/internal/kubectl" - "github.com/deckhouse/virtualization/test/e2e/internal/label" -) - -var _ = Describe("VirtualMachineVersions", Ordered, label.Legacy(), func() { - testCaseLabel := map[string]string{"testcase": "vm-versions"} - var ns string - - BeforeAll(func() { - kustomization := fmt.Sprintf("%s/%s", conf.TestData.VMVersions, "kustomization.yaml") - var err error - ns, err = kustomize.GetNamespace(kustomization) - Expect(err).NotTo(HaveOccurred(), "%w", err) - - CreateNamespace(ns) - }) - - AfterEach(func() { - if CurrentSpecReport().Failed() { - SaveTestCaseDump(testCaseLabel, CurrentSpecReport().LeafNodeText, ns) - } - }) - - AfterAll(func() { - if config.IsCleanUpNeeded() { - DeleteTestCaseResources(ns, ResourcesToDelete{ - KustomizationDir: conf.TestData.VMVersions, - }) - } - }) - - Context("When virtualization resources are applied:", func() { - It("result should be succeeded", func() { - res := kubectl.Apply(kc.ApplyOptions{ - Filename: []string{conf.TestData.VMVersions}, - FilenameOption: kc.Kustomize, - }) - Expect(res.Error()).NotTo(HaveOccurred(), "cmd: %s\nstderr: %s", res.GetCmd(), res.StdErr()) - }) - }) - - Context("When virtual disks are applied:", func() { - It("checks VDs phases", func() { - By(fmt.Sprintf("VDs should be in %s phase", PhaseReady)) - WaitPhaseByLabel(kc.ResourceVD, PhaseReady, kc.WaitOptions{ - Labels: testCaseLabel, - Namespace: ns, - Timeout: MaxWaitTimeout, - }) - }) - }) - - Context("When virtual machines are applied:", func() { - It("checks VMs phases", func() { - By(fmt.Sprintf("VM should be in %s phase", PhaseRunning)) - WaitPhaseByLabel(kc.ResourceVM, PhaseRunning, kc.WaitOptions{ - Labels: testCaseLabel, - Namespace: ns, - Timeout: MaxWaitTimeout, - }) - }) - }) - - Context("When virtual machines are ready:", func() { - Eventually(func() error { - var vms v1alpha2.VirtualMachineList - err := GetObjects(kc.ResourceVM, &vms, kc.GetOptions{ - Labels: testCaseLabel, - Namespace: ns, - }) - Expect(err).NotTo(HaveOccurred()) - - It("has qemu version in the status", func() { - for _, vm := range vms.Items { - Expect(vm.Status.Versions.Qemu).NotTo(BeEmpty()) - } - }) - - It("has libvirt version in the status", func() { - for _, vm := range vms.Items { - Expect(vm.Status.Versions.Libvirt).NotTo(BeEmpty()) - } - }) - - return nil - }).WithTimeout(Timeout).WithPolling(Interval).Should(Succeed()) - }) -}) diff --git a/test/e2e/vm/version.go b/test/e2e/vm/version.go new file mode 100644 index 0000000000..aaf4a065c2 --- /dev/null +++ b/test/e2e/vm/version.go @@ -0,0 +1,81 @@ +/* +Copyright 2026 Flant JSC + +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. +*/ + +package vm + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/utils/ptr" + crclient "sigs.k8s.io/controller-runtime/pkg/client" + + vdbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vd" + vmbuilder "github.com/deckhouse/virtualization-controller/pkg/builder/vm" + "github.com/deckhouse/virtualization/api/core/v1alpha2" + "github.com/deckhouse/virtualization/test/e2e/internal/framework" + "github.com/deckhouse/virtualization/test/e2e/internal/object" + "github.com/deckhouse/virtualization/test/e2e/internal/util" +) + +var _ = Describe("VirtualMachineVersions", func() { + var f *framework.Framework + + BeforeEach(func() { + f = framework.NewFramework("vm-versions") + DeferCleanup(f.After) + f.Before() + }) + + It("should expose qemu and libvirt versions in VM status", func() { + By("Creating VirtualDisk from precreated ClusterVirtualImage") + vdRoot := object.NewVDFromCVI("vd-root", f.Namespace().Name, object.PrecreatedCVIAlpineUEFI, + vdbuilder.WithSize(ptr.To(resource.MustParse("512Mi"))), + ) + + By("Creating VirtualMachine") + vm := object.NewMinimalVM("vm-", f.Namespace().Name, + vmbuilder.WithBootloader(v1alpha2.EFI), + vmbuilder.WithCPU(1, ptr.To("50%")), + vmbuilder.WithMemory(resource.MustParse("256Mi")), + vmbuilder.WithRestartApprovalMode(v1alpha2.Manual), + vmbuilder.WithBlockDeviceRefs( + v1alpha2.BlockDeviceSpecRef{ + Kind: v1alpha2.DiskDevice, + Name: vdRoot.Name, + }, + ), + ) + + By("Creating resources") + err := f.CreateWithDeferredDeletion(context.Background(), vdRoot, vm) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for VirtualMachine to be Running") + util.UntilObjectPhase(string(v1alpha2.MachineRunning), framework.LongTimeout, vm) + + By("Checking VM status has qemu and libvirt versions") + Eventually(func(g Gomega) { + err := f.GenericClient().Get(context.Background(), crclient.ObjectKeyFromObject(vm), vm) + g.Expect(err).NotTo(HaveOccurred()) + g.Expect(vm.Status.Versions).NotTo(BeNil()) + g.Expect(vm.Status.Versions.Qemu).NotTo(BeEmpty()) + g.Expect(vm.Status.Versions.Libvirt).NotTo(BeEmpty()) + }).WithTimeout(framework.LongTimeout).WithPolling(framework.PollingInterval).Should(Succeed()) + }) +}) From 0181eb5dd341431f6d5516f252e288031e3a954f Mon Sep 17 00:00:00 2001 From: Roman Sysoev Date: Tue, 28 Apr 2026 10:59:26 +0300 Subject: [PATCH 2/4] test: remove unnecessary vm params Signed-off-by: Roman Sysoev --- test/e2e/vm/version.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/e2e/vm/version.go b/test/e2e/vm/version.go index aaf4a065c2..bf6a044831 100644 --- a/test/e2e/vm/version.go +++ b/test/e2e/vm/version.go @@ -51,9 +51,7 @@ var _ = Describe("VirtualMachineVersions", func() { By("Creating VirtualMachine") vm := object.NewMinimalVM("vm-", f.Namespace().Name, vmbuilder.WithBootloader(v1alpha2.EFI), - vmbuilder.WithCPU(1, ptr.To("50%")), vmbuilder.WithMemory(resource.MustParse("256Mi")), - vmbuilder.WithRestartApprovalMode(v1alpha2.Manual), vmbuilder.WithBlockDeviceRefs( v1alpha2.BlockDeviceSpecRef{ Kind: v1alpha2.DiskDevice, From 8c91787dc1a42953a3b433d872a43014b60a97a7 Mon Sep 17 00:00:00 2001 From: Roman Sysoev Date: Tue, 28 Apr 2026 11:14:16 +0300 Subject: [PATCH 3/4] test: remove unnecessary vm params 2 Signed-off-by: Roman Sysoev --- test/e2e/vm/version.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/e2e/vm/version.go b/test/e2e/vm/version.go index bf6a044831..239d2b4318 100644 --- a/test/e2e/vm/version.go +++ b/test/e2e/vm/version.go @@ -44,14 +44,12 @@ var _ = Describe("VirtualMachineVersions", func() { It("should expose qemu and libvirt versions in VM status", func() { By("Creating VirtualDisk from precreated ClusterVirtualImage") - vdRoot := object.NewVDFromCVI("vd-root", f.Namespace().Name, object.PrecreatedCVIAlpineUEFI, + vdRoot := object.NewVDFromCVI("vd-root", f.Namespace().Name, object.PrecreatedCVIAlpineBIOS, vdbuilder.WithSize(ptr.To(resource.MustParse("512Mi"))), ) By("Creating VirtualMachine") vm := object.NewMinimalVM("vm-", f.Namespace().Name, - vmbuilder.WithBootloader(v1alpha2.EFI), - vmbuilder.WithMemory(resource.MustParse("256Mi")), vmbuilder.WithBlockDeviceRefs( v1alpha2.BlockDeviceSpecRef{ Kind: v1alpha2.DiskDevice, From e6c0d009bda16cbca1805b5b551bdbf93af41f55 Mon Sep 17 00:00:00 2001 From: Roman Sysoev Date: Tue, 28 Apr 2026 11:28:59 +0300 Subject: [PATCH 4/4] test: improve step description Signed-off-by: Roman Sysoev --- test/e2e/vm/version.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/vm/version.go b/test/e2e/vm/version.go index 239d2b4318..9635da985d 100644 --- a/test/e2e/vm/version.go +++ b/test/e2e/vm/version.go @@ -43,12 +43,12 @@ var _ = Describe("VirtualMachineVersions", func() { }) It("should expose qemu and libvirt versions in VM status", func() { - By("Creating VirtualDisk from precreated ClusterVirtualImage") + By("Generating VirtualDisk from precreated ClusterVirtualImage") vdRoot := object.NewVDFromCVI("vd-root", f.Namespace().Name, object.PrecreatedCVIAlpineBIOS, vdbuilder.WithSize(ptr.To(resource.MustParse("512Mi"))), ) - By("Creating VirtualMachine") + By("Generating VirtualMachine") vm := object.NewMinimalVM("vm-", f.Namespace().Name, vmbuilder.WithBlockDeviceRefs( v1alpha2.BlockDeviceSpecRef{