Skip to content

Commit cd8df3d

Browse files
Feedback
1 parent 20bac93 commit cd8df3d

File tree

9 files changed

+81
-42
lines changed

9 files changed

+81
-42
lines changed

cmd/main.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"github.com/cobaltcore-dev/kvm-node-agent/internal/certificates"
3030
"github.com/cobaltcore-dev/kvm-node-agent/internal/emulator"
3131
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
32-
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
3332
"github.com/cobaltcore-dev/kvm-node-agent/internal/sys"
3433
"github.com/cobaltcore-dev/kvm-node-agent/internal/systemd"
3534

@@ -177,12 +176,10 @@ func main() {
177176

178177
var sysd systemd.Interface
179178
var libv libvirt.Interface
180-
var capabilitiesClient capabilities.Client
181179
if os.Getenv("EMULATE") != "" {
182180
ctx := logger.IntoContext(context.Background(), setupLog)
183181
libv = emulator.NewLibVirtEmulator(ctx)
184182
sysd = emulator.NewSystemdEmulator(ctx)
185-
capabilitiesClient = capabilities.NewClientEmulator()
186183
} else {
187184
var err error
188185
ctx := logger.IntoContext(context.Background(), setupLog)
@@ -192,15 +189,13 @@ func main() {
192189
setupLog.Error(err, "unable to create systemd instance")
193190
os.Exit(1)
194191
}
195-
capabilitiesClient = capabilities.NewClient()
196192
}
197193

198194
if err = (&controller.HypervisorReconciler{
199-
Client: mgr.GetClient(),
200-
Scheme: mgr.GetScheme(),
201-
Systemd: sysd,
202-
Libvirt: libv,
203-
CapabilitiesClient: capabilitiesClient,
195+
Client: mgr.GetClient(),
196+
Scheme: mgr.GetScheme(),
197+
Systemd: sysd,
198+
Libvirt: libv,
204199
}).SetupWithManager(mgr); err != nil {
205200
setupLog.Error(err, "unable to create controller", "controller", "Hypervisor")
206201
os.Exit(1)

internal/controller/hypervisor_controller.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import (
3636
"github.com/cobaltcore-dev/kvm-node-agent/internal/certificates"
3737
"github.com/cobaltcore-dev/kvm-node-agent/internal/evacuation"
3838
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
39-
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
4039
"github.com/cobaltcore-dev/kvm-node-agent/internal/sys"
4140
"github.com/cobaltcore-dev/kvm-node-agent/internal/systemd"
4241
)
@@ -48,9 +47,6 @@ type HypervisorReconciler struct {
4847
Systemd systemd.Interface
4948
Libvirt libvirt.Interface
5049

51-
// Client that connects to libvirt and fetches capabilities of the hypervisor.
52-
CapabilitiesClient capabilities.Client
53-
5450
osDescriptor *systemd.Descriptor
5551
evacuateOnReboot bool
5652
}
@@ -140,7 +136,7 @@ func (r *HypervisorReconciler) Reconcile(ctx context.Context, req ctrl.Request)
140136

141137
// Update capabilities status.
142138
var err error
143-
hypervisor.Status.Capabilities, err = r.CapabilitiesClient.Get()
139+
hypervisor.Status.Capabilities, err = r.Libvirt.GetCapabilities()
144140
if err != nil {
145141
log.Error(err, "failed to get capabilities")
146142
meta.SetStatusCondition(&hypervisor.Status.Conditions, metav1.Condition{

internal/controller/hypervisor_controller_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ import (
2525
. "github.com/onsi/ginkgo/v2"
2626
. "github.com/onsi/gomega"
2727
"k8s.io/apimachinery/pkg/api/errors"
28+
"k8s.io/apimachinery/pkg/api/resource"
2829
"k8s.io/apimachinery/pkg/types"
2930
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3031

3132
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3233

3334
kvmv1alpha1 "github.com/cobaltcore-dev/kvm-node-agent/api/v1alpha1"
3435
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
35-
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
3636
"github.com/cobaltcore-dev/kvm-node-agent/internal/sys"
3737
"github.com/cobaltcore-dev/kvm-node-agent/internal/systemd"
3838
)
@@ -109,6 +109,13 @@ var _ = Describe("Hypervisor Controller", func() {
109109
GetNumInstancesFunc: func() int {
110110
return 1
111111
},
112+
GetCapabilitiesFunc: func() (kvmv1alpha1.CapabilitiesStatus, error) {
113+
return kvmv1alpha1.CapabilitiesStatus{
114+
HostCpuArch: "x86_64",
115+
HostCpus: *resource.NewQuantity(4, resource.DecimalSI),
116+
HostMemory: *resource.NewQuantity(8192, resource.DecimalSI),
117+
}, nil
118+
},
112119
},
113120
Systemd: &systemd.InterfaceMock{
114121
CloseFunc: func() {},
@@ -128,7 +135,6 @@ var _ = Describe("Hypervisor Controller", func() {
128135
return nil, nil
129136
},
130137
},
131-
CapabilitiesClient: capabilities.NewClientEmulator(),
132138
}
133139

134140
_, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
@@ -153,6 +159,12 @@ var _ = Describe("Hypervisor Controller", func() {
153159
Expect(hypervisor.Status.Conditions[2].Type).To(Equal("test-unit"))
154160
Expect(hypervisor.Status.Conditions[2].Status).To(Equal(metav1.ConditionTrue))
155161
Expect(hypervisor.Status.Conditions[2].Reason).To(Equal("Running"))
162+
163+
Expect(hypervisor.Status.Capabilities.HostCpuArch).To(Equal("x86_64"))
164+
Expect(hypervisor.Status.Capabilities.HostCpus.AsDec().UnscaledBig()).
165+
To(Equal(resource.NewQuantity(4, resource.DecimalSI).AsDec().UnscaledBig()))
166+
Expect(hypervisor.Status.Capabilities.HostMemory.AsDec().UnscaledBig()).
167+
To(Equal(resource.NewQuantity(8192, resource.DecimalSI).AsDec().UnscaledBig()))
156168
})
157169
})
158170
})

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/api/v1alpha1"
2828
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
29+
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
2930
)
3031

3132
func NewLibVirtEmulator(ctx context.Context) *libvirt.InterfaceMock {
@@ -55,6 +56,9 @@ func NewLibVirtEmulator(ctx context.Context) *libvirt.InterfaceMock {
5556
log.Info("IsConnectedFunc Func called")
5657
return true
5758
},
59+
GetCapabilitiesFunc: func() (v1alpha1.CapabilitiesStatus, error) {
60+
return capabilities.NewClientEmulator().Get(nil)
61+
},
5862
}
5963
return mockedInterface
6064
}

internal/libvirt/capabilities/client.go

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,30 @@ package capabilities
2020
import (
2121
"encoding/xml"
2222
"fmt"
23-
"os"
2423

2524
"github.com/cobaltcore-dev/kvm-node-agent/api/v1alpha1"
2625
libvirt "github.com/digitalocean/go-libvirt"
27-
"github.com/digitalocean/go-libvirt/socket/dialers"
2826
"k8s.io/apimachinery/pkg/api/resource"
2927
"sigs.k8s.io/controller-runtime/pkg/log"
3028
)
3129

3230
// Client that returns the capabilities of the host we are mounted on.
3331
type Client interface {
3432
// Return the capabilities status of the host we are mounted on.
35-
Get() (v1alpha1.CapabilitiesStatus, error)
33+
Get(virt *libvirt.Libvirt) (v1alpha1.CapabilitiesStatus, error)
3634
}
3735

3836
// Implementation of the CapabilitiesClient interface.
39-
type client struct {
40-
// Libvirt instance to connect to.
41-
virt *libvirt.Libvirt
42-
}
37+
type client struct{}
4338

44-
// Create a new capabilities client using the provided LIBVIRT_SOCKET env variable.
39+
// Create a new capabilities client.
4540
func NewClient() Client {
46-
socketPath := os.Getenv("LIBVIRT_SOCKET")
47-
if socketPath == "" {
48-
socketPath = "/run/libvirt/libvirt-sock"
49-
}
50-
log.Log.Info("capabilities client uses libvirt socket", "socket", socketPath)
51-
dialer := dialers.NewLocal(dialers.WithSocket(socketPath))
52-
virt := libvirt.NewWithDialer(dialer)
53-
return &client{virt: virt}
41+
return &client{}
5442
}
5543

5644
// Return the capabilities of the host we are mounted on.
57-
func (m *client) Get() (v1alpha1.CapabilitiesStatus, error) {
58-
if !m.virt.IsConnected() {
59-
if err := m.virt.Connect(); err != nil {
60-
log.Log.Error(err, "failed to connect to libvirt")
61-
return v1alpha1.CapabilitiesStatus{}, err
62-
}
63-
}
64-
capabilitiesXMLBytes, err := m.virt.Capabilities()
45+
func (m *client) Get(virt *libvirt.Libvirt) (v1alpha1.CapabilitiesStatus, error) {
46+
capabilitiesXMLBytes, err := virt.Capabilities()
6547
if err != nil {
6648
log.Log.Error(err, "failed to get libvirt capabilities")
6749
return v1alpha1.CapabilitiesStatus{}, err
@@ -83,7 +65,7 @@ func NewClientEmulator() Client {
8365
}
8466

8567
// Get the capabilities of the host we are mounted on.
86-
func (c *clientEmulator) Get() (v1alpha1.CapabilitiesStatus, error) {
68+
func (c *clientEmulator) Get(virt *libvirt.Libvirt) (v1alpha1.CapabilitiesStatus, error) {
8769
var capabilities Capabilities
8870
if err := xml.Unmarshal(exampleXML, &capabilities); err != nil {
8971
log.Log.Error(err, "failed to unmarshal example capabilities")

internal/libvirt/capabilities/client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func TestNewClientEmulator(t *testing.T) {
6969
func TestClientEmulatorGet(t *testing.T) {
7070
client := NewClientEmulator()
7171

72-
status, err := client.Get()
72+
status, err := client.Get(nil)
7373
if err != nil {
7474
t.Fatalf("clientEmulator.Get() returned error: %v", err)
7575
}

internal/libvirt/interface.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,7 @@ type Interface interface {
4646

4747
// GetNumInstances returns the number of instances.
4848
GetNumInstances() int
49+
50+
// Get the capabilities of the libvirt daemon.
51+
GetCapabilities() (v1alpha1.CapabilitiesStatus, error)
4952
}

internal/libvirt/interface_mock.go

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/libvirt/libvirt.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"sigs.k8s.io/controller-runtime/pkg/log"
3030

3131
"github.com/cobaltcore-dev/kvm-node-agent/api/v1alpha1"
32+
"github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt/capabilities"
3233
)
3334

3435
type LibVirt struct {
@@ -38,6 +39,9 @@ type LibVirt struct {
3839
migrationLock sync.Mutex
3940
version string
4041
domains map[libvirt.ConnectListAllDomainsFlags][]libvirt.Domain
42+
43+
// Client that connects to libvirt and fetches capabilities of the hypervisor.
44+
capabilitiesClient capabilities.Client
4145
}
4246

4347
func NewLibVirt(k client.Client) *LibVirt {
@@ -53,6 +57,7 @@ func NewLibVirt(k client.Client) *LibVirt {
5357
sync.Mutex{},
5458
"N/A",
5559
make(map[libvirt.ConnectListAllDomainsFlags][]libvirt.Domain, 2),
60+
capabilities.NewClient(),
5661
}
5762
}
5863

@@ -123,3 +128,8 @@ func (l *LibVirt) IsConnected() bool {
123128
func (l *LibVirt) GetNumInstances() int {
124129
return len(l.domains[libvirt.ConnectListDomainsActive])
125130
}
131+
132+
// Get the capabilities of the libvirt daemon.
133+
func (l *LibVirt) GetCapabilities() (v1alpha1.CapabilitiesStatus, error) {
134+
return l.capabilitiesClient.Get(l.virt)
135+
}

0 commit comments

Comments
 (0)