@@ -35,6 +35,7 @@ import (
3535 "sigs.k8s.io/controller-runtime/pkg/event"
3636 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3737
38+ "github.com/cobaltcore-dev/kvm-node-agent/internal/kernel"
3839 "github.com/cobaltcore-dev/kvm-node-agent/internal/libvirt"
3940 "github.com/cobaltcore-dev/kvm-node-agent/internal/sys"
4041 "github.com/cobaltcore-dev/kvm-node-agent/internal/systemd"
@@ -127,13 +128,22 @@ var _ = Describe("Hypervisor Controller", func() {
127128 })
128129
129130 Context ("When testing SetupWithManager method" , func () {
130- It ("should successfully setup controller with manager" , func () {
131+ It ("should successfully setup controller with manager and read kernel parameters " , func () {
131132 // Create a test manager
132133 mgr , err := ctrl .NewManager (cfg , ctrl.Options {
133134 Scheme : k8sClient .Scheme (),
134135 })
135136 Expect (err ).NotTo (HaveOccurred ())
136137
138+ // Use mock kernel reader
139+ mockKernelReader := & kernel.InterfaceMock {
140+ ReadParametersFunc : func () (* kernel.Parameters , error ) {
141+ return & kernel.Parameters {
142+ CommandLine : "quiet splash console=ttyS0 intel_iommu=on" ,
143+ }, nil
144+ },
145+ }
146+
137147 controllerReconciler := & HypervisorReconciler {
138148 Client : k8sClient ,
139149 Scheme : k8sClient .Scheme (),
@@ -156,13 +166,21 @@ var _ = Describe("Hypervisor Controller", func() {
156166 }, nil
157167 },
158168 },
169+ KernelReader : mockKernelReader ,
159170 }
160171
161172 err = controllerReconciler .SetupWithManager (mgr )
162173 Expect (err ).NotTo (HaveOccurred ())
163174 Expect (controllerReconciler .reconcileCh ).NotTo (BeNil ())
164175 Expect (controllerReconciler .osDescriptor ).NotTo (BeNil ())
165176 Expect (controllerReconciler .osDescriptor .OperatingSystemReleaseData ).To (HaveLen (2 ))
177+
178+ // Verify that kernel reader was called and parameters were stored
179+ Expect (mockKernelReader .ReadParametersCalls ()).To (HaveLen (1 ))
180+ Expect (controllerReconciler .kernelParameters ).NotTo (BeNil ())
181+ Expect (
182+ controllerReconciler .kernelParameters .CommandLine ,
183+ ).To (Equal ("quiet splash console=ttyS0 intel_iommu=on" ))
166184 })
167185
168186 It ("should fail when systemd Describe returns error" , func () {
@@ -172,9 +190,16 @@ var _ = Describe("Hypervisor Controller", func() {
172190 })
173191 Expect (err ).NotTo (HaveOccurred ())
174192
193+ mockKernelReader := & kernel.InterfaceMock {
194+ ReadParametersFunc : func () (* kernel.Parameters , error ) {
195+ return & kernel.Parameters {CommandLine : "quiet splash" }, nil
196+ },
197+ }
198+
175199 controllerReconciler := & HypervisorReconciler {
176- Client : k8sClient ,
177- Scheme : k8sClient .Scheme (),
200+ Client : k8sClient ,
201+ Scheme : k8sClient .Scheme (),
202+ KernelReader : mockKernelReader ,
178203 Systemd : & systemd.InterfaceMock {
179204 DescribeFunc : func (ctx context.Context ) (* systemd.Descriptor , error ) {
180205 return nil , errors .New ("systemd describe failed" )
@@ -187,6 +212,39 @@ var _ = Describe("Hypervisor Controller", func() {
187212 Expect (err .Error ()).To (ContainSubstring ("unable to get Systemd hostname describe()" ))
188213 Expect (err .Error ()).To (ContainSubstring ("systemd describe failed" ))
189214 })
215+
216+ It ("should fail when kernel parameters cannot be read" , func () {
217+ // Create a test manager
218+ mgr , err := ctrl .NewManager (cfg , ctrl.Options {
219+ Scheme : k8sClient .Scheme (),
220+ })
221+ Expect (err ).NotTo (HaveOccurred ())
222+
223+ mockKernelReader := & kernel.InterfaceMock {
224+ ReadParametersFunc : func () (* kernel.Parameters , error ) {
225+ return nil , errors .New ("failed to read /proc/cmdline" )
226+ },
227+ }
228+
229+ controllerReconciler := & HypervisorReconciler {
230+ Client : k8sClient ,
231+ Scheme : k8sClient .Scheme (),
232+ KernelReader : mockKernelReader ,
233+ Systemd : & systemd.InterfaceMock {
234+ DescribeFunc : func (ctx context.Context ) (* systemd.Descriptor , error ) {
235+ return & systemd.Descriptor {
236+ KernelVersion : "6.1.0" ,
237+ }, nil
238+ },
239+ },
240+ }
241+
242+ err = controllerReconciler .SetupWithManager (mgr )
243+ Expect (err ).To (HaveOccurred ())
244+ Expect (err .Error ()).To (ContainSubstring ("unable to read kernel parameters" ))
245+ Expect (err .Error ()).To (ContainSubstring ("failed to read /proc/cmdline" ))
246+ Expect (mockKernelReader .ReadParametersCalls ()).To (HaveLen (1 ))
247+ })
190248 })
191249
192250 Context ("When reconciling a resource" , func () {
@@ -227,8 +285,9 @@ var _ = Describe("Hypervisor Controller", func() {
227285 By ("Cleanup the specific resource instance Hypervisor" )
228286 Expect (k8sClient .Delete (ctx , resource )).To (Succeed ())
229287 })
230- It ("should successfully reconcile the resource" , func () {
288+ It ("should successfully reconcile the resource with kernel parameters " , func () {
231289 By ("Reconciling the created resource" )
290+
232291 controllerReconciler := & HypervisorReconciler {
233292 Client : k8sClient ,
234293 Scheme : k8sClient .Scheme (),
@@ -289,6 +348,9 @@ var _ = Describe("Hypervisor Controller", func() {
289348 "VARIANT_ID=metal-sci_usi-amd64" ,
290349 },
291350 },
351+ kernelParameters : & kernel.Parameters {
352+ CommandLine : "quiet splash console=ttyS0 intel_iommu=on" ,
353+ },
292354 }
293355
294356 _ , err := controllerReconciler .Reconcile (ctx , reconcile.Request {
@@ -321,6 +383,9 @@ var _ = Describe("Hypervisor Controller", func() {
321383 Expect (hypervisor .Status .OperatingSystem .GardenLinuxCommitID ).To (Equal ("abcdef1234567890" ))
322384 Expect (hypervisor .Status .OperatingSystem .GardenLinuxFeatures ).To (Equal ([]string {"_rescue" , "log" , "sap" }))
323385 Expect (hypervisor .Status .OperatingSystem .VariantID ).To (Equal ("metal-sci_usi-amd64" ))
386+ Expect (
387+ hypervisor .Status .OperatingSystem .KernelCommandLine ,
388+ ).To (Equal ("quiet splash console=ttyS0 intel_iommu=on" ))
324389 })
325390 })
326391})
0 commit comments