Skip to content

Commit

Permalink
DownwardMetrics: Add functional tests
Browse files Browse the repository at this point in the history
Add functional test for getting DownwardMetrics via virtio-serial
channel.

Signed-off-by: Javier Cano Cano <[email protected]>
Signed-off-by: German Maglione <[email protected]>
  • Loading branch information
germag committed Sep 15, 2023
1 parent 06743f6 commit 47f8afa
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 35 deletions.
1 change: 0 additions & 1 deletion tests/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ go_test(
"//pkg/cloud-init:go_default_library",
"//pkg/config:go_default_library",
"//pkg/controller:go_default_library",
"//pkg/downwardmetrics:go_default_library",
"//pkg/hooks:go_default_library",
"//pkg/hooks/v1alpha1:go_default_library",
"//pkg/hooks/v1alpha2:go_default_library",
Expand Down
21 changes: 12 additions & 9 deletions tests/infrastructure/downward-metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,33 +46,36 @@ var _ = DescribeInfra("downwardMetrics", func() {
virtClient = kubevirt.Client()
})

It("[test_id:6535]should be published to a vmi and periodically updated", func() {
vmi := libvmi.NewFedora()
tests.AddDownwardMetricsVolume(vmi, "vhostmd")
DescribeTable("should start a vmi and get the metrics", func(via libvmi.Option, metricsGetter libinfra.MetricsGetter) {

vmi := libvmi.NewFedora(via)
vmi = tests.RunVMIAndExpectLaunch(vmi, 180)
Expect(console.LoginToFedora(vmi)).To(Succeed())

metrics, err := libinfra.GetDownwardMetrics(vmi)
metrics, err := metricsGetter(vmi)
Expect(err).ToNot(HaveOccurred())
timestamp := libinfra.GetTimeFromMetrics(metrics)

vmi, err = virtClient.VirtualMachineInstance(vmi.Namespace).Get(context.Background(), vmi.Name, &metav1.GetOptions{})
Expect(err).ToNot(HaveOccurred())
Eventually(func() int {
metrics, err = libinfra.GetDownwardMetrics(vmi)
metrics, err = metricsGetter(vmi)
Expect(err).ToNot(HaveOccurred())
return libinfra.GetTimeFromMetrics(metrics)
}, 10*time.Second, 1*time.Second).ShouldNot(Equal(timestamp))
Expect(libinfra.GetHostnameFromMetrics(metrics)).To(Equal(vmi.Status.NodeName))
})

},
Entry("[test_id:6535]using a disk", libvmi.WithDownwardMetricsVolume("vhostmd"), libinfra.GetDownwardMetricsDisk),
Entry("using a virtio serial device", libvmi.WithDownwardMetricsChannel(), libinfra.GetDownwardMetricsVirtio),
)

It("metric ResourceProcessorLimit should be present", func() {
vmi := libvmi.NewFedora(libvmi.WithCPUCount(1, 1, 1))
tests.AddDownwardMetricsVolume(vmi, "vhostmd")
vmi := libvmi.NewFedora(libvmi.WithCPUCount(1, 1, 1), libvmi.WithDownwardMetricsVolume("vhostmd"))
vmi = tests.RunVMIAndExpectLaunch(vmi, 180)
Expect(console.LoginToFedora(vmi)).To(Succeed())

metrics, err := libinfra.GetDownwardMetrics(vmi)
metrics, err := libinfra.GetDownwardMetricsDisk(vmi)
Expect(err).ToNot(HaveOccurred())

//let's try to find the ResourceProcessorLimit metric
Expand Down
16 changes: 14 additions & 2 deletions tests/libinfra/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,21 @@ import (
"kubevirt.io/kubevirt/tests/console"
)

func GetDownwardMetrics(vmi *v1.VirtualMachineInstance) (*api.Metrics, error) {
type MetricsGetter func(vmi *v1.VirtualMachineInstance) (*api.Metrics, error)

func GetDownwardMetricsDisk(vmi *v1.VirtualMachineInstance) (*api.Metrics, error) {
cmd := `sudo vm-dump-metrics 2> /dev/null`
return runAndCheckDumpMetrics(vmi, cmd)
}

func GetDownwardMetricsVirtio(vmi *v1.VirtualMachineInstance) (*api.Metrics, error) {
cmd := `sudo vm-dump-metrics --virtio 2> /dev/null`
return runAndCheckDumpMetrics(vmi, cmd)
}

func runAndCheckDumpMetrics(vmi *v1.VirtualMachineInstance, cmd string) (*api.Metrics, error) {
res, err := console.SafeExpectBatchWithResponse(vmi, []expect.Batcher{
&expect.BSnd{S: `sudo vm-dump-metrics 2> /dev/null` + "\n"},
&expect.BSnd{S: cmd + "\n"},
&expect.BExp{R: `(?s)(<metrics>.+</metrics>)`},
}, 5)
if err != nil {
Expand Down
19 changes: 19 additions & 0 deletions tests/libvmi/vmi.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,25 @@ func WithLimitCPU(value string) Option {
}
}

func WithDownwardMetricsVolume(volumeName string) Option {
return func(vmi *v1.VirtualMachineInstance) {
vmi.Spec.Volumes = append(vmi.Spec.Volumes, v1.Volume{
Name: volumeName,
VolumeSource: v1.VolumeSource{
DownwardMetrics: &v1.DownwardMetricsVolumeSource{},
}})

vmi.Spec.Domain.Devices.Disks = append(vmi.Spec.Domain.Devices.Disks, v1.Disk{
Name: volumeName,
DiskDevice: v1.DiskDevice{
Disk: &v1.DiskTarget{
Bus: v1.DiskBusVirtio,
},
},
})
}
}

func WithDownwardMetricsChannel() Option {
return func(vmi *v1.VirtualMachineInstance) {
vmi.Spec.Domain.Devices.DownwardMetrics = &v1.DownwardMetrics{}
Expand Down
16 changes: 10 additions & 6 deletions tests/migration/migration.go
Original file line number Diff line number Diff line change
Expand Up @@ -552,12 +552,12 @@ var _ = SIGMigrationDescribe("VM Live Migration", func() {
}, 20*time.Second, 1*time.Second).Should(Equal(v1.LiveMigration), "migration method is expected to be Live Migration")
})

It("[test_id:6971]should migrate with a downwardMetrics disk", func() {
DescribeTable("should migrate with a downwardMetrics", func(via libvmi.Option, metricsGetter libinfra.MetricsGetter) {
vmi := libvmi.NewFedora(
libvmi.WithInterface(libvmi.InterfaceDeviceWithMasqueradeBinding()),
libvmi.WithNetwork(v1.DefaultPodNetwork()),
via,
)
tests.AddDownwardMetricsVolume(vmi, "vhostmd")
vmi = tests.RunVMIAndExpectLaunch(vmi, 180)
Expect(console.LoginToFedora(vmi)).To(Succeed())

Expand All @@ -569,14 +569,14 @@ var _ = SIGMigrationDescribe("VM Live Migration", func() {

By("checking if the metrics are still updated after the migration")
Eventually(func() error {
_, err := libinfra.GetDownwardMetrics(vmi)
_, err := metricsGetter(vmi)
return err
}, 20*time.Second, 1*time.Second).ShouldNot(HaveOccurred())
metrics, err := libinfra.GetDownwardMetrics(vmi)
metrics, err := metricsGetter(vmi)
Expect(err).ToNot(HaveOccurred())
timestamp := libinfra.GetTimeFromMetrics(metrics)
Eventually(func() int {
metrics, err := libinfra.GetDownwardMetrics(vmi)
metrics, err := metricsGetter(vmi)
Expect(err).ToNot(HaveOccurred())
return libinfra.GetTimeFromMetrics(metrics)
}, 10*time.Second, 1*time.Second).ShouldNot(Equal(timestamp))
Expand All @@ -585,7 +585,11 @@ var _ = SIGMigrationDescribe("VM Live Migration", func() {
vmi, err = virtClient.VirtualMachineInstance(vmi.Namespace).Get(context.Background(), vmi.Name, &metav1.GetOptions{})
Expect(err).ToNot(HaveOccurred())
Expect(libinfra.GetHostnameFromMetrics(metrics)).To(Equal(vmi.Status.NodeName))
})

},
Entry("[test_id:6971]disk", libvmi.WithDownwardMetricsVolume("vhostmd"), libinfra.GetDownwardMetricsDisk),
Entry("channel", libvmi.WithDownwardMetricsChannel(), libinfra.GetDownwardMetricsVirtio),
)

It("[test_id:6842]should migrate with TSC frequency set", decorators.Invtsc, decorators.TscFrequencies, func() {
vmi := tests.NewRandomVMIWithEphemeralDisk(cd.ContainerDiskFor(cd.ContainerDiskAlpine))
Expand Down
17 changes: 0 additions & 17 deletions tests/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -1045,23 +1045,6 @@ func AddLabelDownwardAPIVolume(vmi *v1.VirtualMachineInstance, volumeName string
})
}

func AddDownwardMetricsVolume(vmi *v1.VirtualMachineInstance, volumeName string) {
vmi.Spec.Volumes = append(vmi.Spec.Volumes, v1.Volume{
Name: volumeName,
VolumeSource: v1.VolumeSource{
DownwardMetrics: &v1.DownwardMetricsVolumeSource{},
}})

vmi.Spec.Domain.Devices.Disks = append(vmi.Spec.Domain.Devices.Disks, v1.Disk{
Name: volumeName,
DiskDevice: v1.DiskDevice{
Disk: &v1.DiskTarget{
Bus: v1.DiskBusVirtio,
},
},
})
}

func AddServiceAccountDisk(vmi *v1.VirtualMachineInstance, serviceAccountName string) {
volumeName := serviceAccountName + "-disk"
vmi.Spec.Volumes = append(vmi.Spec.Volumes, v1.Volume{
Expand Down

0 comments on commit 47f8afa

Please sign in to comment.