Skip to content

Commit 5bcc488

Browse files
Pass domcapabilities to cr
1 parent faa6747 commit 5bcc488

5 files changed

Lines changed: 48 additions & 55 deletions

File tree

internal/controller/hypervisor_controller.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ type HypervisorReconciler struct {
5151
}
5252

5353
const (
54-
OSUpdateType = "OperatingSystemUpdate"
55-
LibVirtType = "LibVirtConnection"
56-
CapabilitiesClientType = "CapabilitiesClientConnection"
54+
OSUpdateType = "OperatingSystemUpdate"
55+
LibVirtType = "LibVirtConnection"
56+
CapabilitiesClientType = "CapabilitiesClientConnection"
57+
DomainCapabilitiesClientType = "DomainCapabilitiesClientConnection"
5758
)
5859

5960
// +kubebuilder:rbac:groups=kvm.cloud.sap,resources=hypervisors,verbs=get;list;watch;update;patch;delete
@@ -204,6 +205,24 @@ func (r *HypervisorReconciler) Reconcile(ctx context.Context, req ctrl.Request)
204205
Reason: "CapabilitiesClientGetFailed",
205206
})
206207
}
208+
209+
// Update the domain capabilities status.
210+
if domainCapabilities, err := r.Libvirt.GetDomainCapabilities(); err == nil {
211+
hypervisor.Status.DomainCapabilities = domainCapabilities
212+
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
213+
Type: DomainCapabilitiesClientType,
214+
Status: metav1.ConditionTrue,
215+
Reason: "DomainCapabilitiesClientGetSucceeded",
216+
})
217+
} else {
218+
log.Error(err, "failed to get domain capabilities")
219+
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{
220+
Type: DomainCapabilitiesClientType,
221+
Status: metav1.ConditionFalse,
222+
Message: err.Error(),
223+
Reason: "DomainCapabilitiesClientGetFailed",
224+
})
225+
}
207226
}
208227

209228
// Reconcile operating system update

internal/controller/hypervisor_controller_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ var _ = Describe("Hypervisor Controller", func() {
115115
HostMemory: *resource.NewQuantity(8192, resource.DecimalSI),
116116
}, nil
117117
},
118+
GetDomainCapabilitiesFunc: func() (kvmv1.DomainCapabilities, error) {
119+
return kvmv1.DomainCapabilities{
120+
Arch: "x86_64",
121+
HypervisorType: "kvm",
122+
SupportedCpuModes: []string{"mode/example", "mode/example/1"},
123+
}, nil
124+
},
118125
},
119126
Systemd: &systemd.InterfaceMock{
120127
CloseFunc: func() {},
@@ -165,6 +172,11 @@ var _ = Describe("Hypervisor Controller", func() {
165172
To(Equal(resource.NewQuantity(4, resource.DecimalSI).AsDec().UnscaledBig()))
166173
Expect(hypervisor.Status.Capabilities.HostMemory.AsDec().UnscaledBig()).
167174
To(Equal(resource.NewQuantity(8192, resource.DecimalSI).AsDec().UnscaledBig()))
175+
176+
Expect(hypervisor.Status.DomainCapabilities.Arch).To(Equal("x86_64"))
177+
Expect(hypervisor.Status.DomainCapabilities.HypervisorType).To(Equal("kvm"))
178+
Expect(hypervisor.Status.DomainCapabilities.SupportedCpuModes).To(ContainElements(
179+
"mode/example", "mode/example/1"))
168180
})
169181
})
170182
})

internal/emulator/libvirt.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
2828
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
29+
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/domcapabilities"
2930
)
3031

3132
func NewLibVirtEmulator(ctx context.Context) *libvirt.InterfaceMock {
@@ -58,6 +59,9 @@ func NewLibVirtEmulator(ctx context.Context) *libvirt.InterfaceMock {
5859
GetCapabilitiesFunc: func() (v1.Capabilities, error) {
5960
return capabilities.NewClientEmulator().Get(nil)
6061
},
62+
GetDomainCapabilitiesFunc: func() (v1.DomainCapabilities, error) {
63+
return domcapabilities.NewClientEmulator().Get(nil)
64+
},
6165
}
6266
return mockedInterface
6367
}

internal/libvirt/domcapabilities/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func NewClient() Client {
4242

4343
// Return the domain capabilities of the host we are mounted on.
4444
func (m *client) Get(virt *libvirt.Libvirt) (v1.DomainCapabilities, error) {
45-
// Same as running `virsh domcapabilities`
45+
// Same as running `virsh domcapabilities` without any arguments.
4646
capabilitiesXMLStr, err := virt.
4747
ConnectGetDomainCapabilities(nil, nil, nil, nil, 0)
4848
if err != nil {
@@ -91,7 +91,7 @@ func convert(in DomainCapabilities) (out v1.DomainCapabilities, err error) {
9191
continue
9292
}
9393
out.SupportedCpuModes = append(out.SupportedCpuModes,
94-
fmt.Sprintf("mode/%s", cpuMode.Name))
94+
"mode/"+cpuMode.Name)
9595
for _, enum := range cpuMode.Enums {
9696
for _, cpuType := range enum.Values {
9797
out.SupportedCpuModes = append(out.SupportedCpuModes,

internal/libvirt/domcapabilities/client_test.go

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,7 @@ func TestClientEmulatorGet(t *testing.T) {
7676
t.Errorf("Expected %d supported CPU modes, got %d", len(expectedCpuModes), len(status.SupportedCpuModes))
7777
}
7878
for _, expected := range expectedCpuModes {
79-
found := false
80-
for _, actual := range status.SupportedCpuModes {
81-
if actual == expected {
82-
found = true
83-
break
84-
}
85-
}
79+
found := slices.Contains(status.SupportedCpuModes, expected)
8680
if !found {
8781
t.Errorf("Expected CPU mode '%s' not found in supported modes", expected)
8882
}
@@ -188,13 +182,7 @@ func TestConvert(t *testing.T) {
188182
t.Errorf("Expected %d CPU modes, got %d", len(expectedCpuModes), len(status.SupportedCpuModes))
189183
}
190184
for _, expected := range expectedCpuModes {
191-
found := false
192-
for _, actual := range status.SupportedCpuModes {
193-
if actual == expected {
194-
found = true
195-
break
196-
}
197-
}
185+
found := slices.Contains(status.SupportedCpuModes, expected)
198186
if !found {
199187
t.Errorf("Expected CPU mode '%s' not found", expected)
200188
}
@@ -210,13 +198,7 @@ func TestConvert(t *testing.T) {
210198
t.Errorf("Expected %d devices, got %d", len(expectedDevices), len(status.SupportedDevices))
211199
}
212200
for _, expected := range expectedDevices {
213-
found := false
214-
for _, actual := range status.SupportedDevices {
215-
if actual == expected {
216-
found = true
217-
break
218-
}
219-
}
201+
found := slices.Contains(status.SupportedDevices, expected)
220202
if !found {
221203
t.Errorf("Expected device '%s' not found", expected)
222204
}
@@ -414,13 +396,7 @@ func TestConvertWithMultipleDeviceTypes(t *testing.T) {
414396
}
415397

416398
for _, expected := range expectedDevices {
417-
found := false
418-
for _, actual := range status.SupportedDevices {
419-
if actual == expected {
420-
found = true
421-
break
422-
}
423-
}
399+
found := slices.Contains(status.SupportedDevices, expected)
424400
if !found {
425401
t.Errorf("Expected device '%s' not found", expected)
426402
}
@@ -487,13 +463,7 @@ func TestConvertWithMultipleCpuModes(t *testing.T) {
487463
}
488464

489465
for _, expected := range expectedCpuModes {
490-
found := false
491-
for _, actual := range status.SupportedCpuModes {
492-
if actual == expected {
493-
found = true
494-
break
495-
}
496-
}
466+
found := slices.Contains(status.SupportedCpuModes, expected)
497467
if !found {
498468
t.Errorf("Expected CPU mode '%s' not found", expected)
499469
}
@@ -580,13 +550,7 @@ func TestConvertWithMultipleFeatures(t *testing.T) {
580550
}
581551

582552
for _, expected := range expectedFeatures {
583-
found := false
584-
for _, actual := range status.SupportedFeatures {
585-
if actual == expected {
586-
found = true
587-
break
588-
}
589-
}
553+
found := slices.Contains(status.SupportedFeatures, expected)
590554
if !found {
591555
t.Errorf("Expected feature '%s' not found", expected)
592556
}
@@ -613,10 +577,7 @@ func createMockDomainCapabilities(
613577
for i, mode := range cpuModes {
614578
enums := make([]DomainCapabilitiesEnum, len(mode.Enums))
615579
for j, enum := range mode.Enums {
616-
enums[j] = DomainCapabilitiesEnum{
617-
Name: enum.Name,
618-
Values: enum.Values,
619-
}
580+
enums[j] = DomainCapabilitiesEnum(enum)
620581
}
621582
capabilitiesCpuModes[i] = DomainCapabilitiesCPUMode{
622583
Name: mode.Name,
@@ -630,10 +591,7 @@ func createMockDomainCapabilities(
630591
for i, device := range devices {
631592
enums := make([]DomainCapabilitiesEnum, len(device.Enums))
632593
for j, enum := range device.Enums {
633-
enums[j] = DomainCapabilitiesEnum{
634-
Name: enum.Name,
635-
Values: enum.Values,
636-
}
594+
enums[j] = DomainCapabilitiesEnum(enum)
637595
}
638596
capabilitiesDevices[i] = DomainCapabilitiesDevice{
639597
Supported: device.Supported,

0 commit comments

Comments
 (0)