diff --git a/controllers/object_controls.go b/controllers/object_controls.go index 63e9f03c9..d76ac5f25 100644 --- a/controllers/object_controls.go +++ b/controllers/object_controls.go @@ -3624,6 +3624,28 @@ func transformDriverContainer(obj *appsv1.DaemonSet, config *gpuv1.ClusterPolicy } } + // Mount /lib/modules for SLES/SL-Micro + if release["ID"] == "sles" || release["ID"] == "sl-micro" { + n.logger.Info("Mounting /lib/modules into the driver container", "OS", release["ID"]) + libModulesVolMount := corev1.VolumeMount{ + Name: "lib-modules", + MountPath: "/run/host/lib/modules", + ReadOnly: true, + } + driverContainer.VolumeMounts = append(driverContainer.VolumeMounts, libModulesVolMount) + + libModulesVol := corev1.Volume{ + Name: "lib-modules", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/lib/modules", + Type: ptr.To(corev1.HostPathDirectory), + }, + }, + } + podSpec.Volumes = append(podSpec.Volumes, libModulesVol) + } + // apply proxy and env settings if this is an OpenShift cluster if _, ok := release["OPENSHIFT_VERSION"]; ok { setContainerEnv(driverContainer, "OPENSHIFT_VERSION", release["OPENSHIFT_VERSION"]) diff --git a/controllers/object_controls_test.go b/controllers/object_controls_test.go index 6412c9a9e..6e8d10576 100644 --- a/controllers/object_controls_test.go +++ b/controllers/object_controls_test.go @@ -1921,4 +1921,53 @@ func TestMIGManager(t *testing.T) { clusterPolicyController.idx-- }) } + +// TestDriverSLES tests that the GPU Operator correctly handles SLES-specific configurations +func TestDriverSLES(t *testing.T) { + // Backup original parseOSRelease + originalParseOSRelease := parseOSRelease + defer func() { parseOSRelease = originalParseOSRelease }() + + // Mock SLES environment + parseOSRelease = mockOSRelease("sles", "15.7") + + cp := getDriverTestInput("default") + output := getDriverTestOutput("default") + + ds, err := testDaemonsetCommon(t, cp, "Driver", output["numDaemonsets"].(int)) + if err != nil { + t.Fatalf("error in testDaemonsetCommon(): %v", err) + } + require.NotNil(t, ds) + + // Check for /lib/modules volume and mount + foundVolume := false + for _, vol := range ds.Spec.Template.Spec.Volumes { + if vol.Name == "lib-modules" { + foundVolume = true + require.NotNil(t, vol.HostPath) + require.Equal(t, "/lib/modules", vol.HostPath.Path) + } + } + require.True(t, foundVolume, "lib-modules volume not found for SLES") + + foundMount := false + driverContainer := findContainerByName(ds.Spec.Template.Spec.Containers, "nvidia-driver-ctr") + require.NotNil(t, driverContainer) + + for _, mount := range driverContainer.VolumeMounts { + if mount.Name == "lib-modules" { + foundMount = true + require.Equal(t, "/run/host/lib/modules", mount.MountPath) + require.True(t, mount.ReadOnly) + } + } + require.True(t, foundMount, "lib-modules volume mount not found for SLES") + + // Cleanup + err = removeState(&clusterPolicyController, clusterPolicyController.idx-1) + if err != nil { + t.Fatalf("error removing state %v:", err) + } + clusterPolicyController.idx-- } diff --git a/internal/state/driver_volumes.go b/internal/state/driver_volumes.go index c9e13b998..633c41386 100644 --- a/internal/state/driver_volumes.go +++ b/internal/state/driver_volumes.go @@ -209,6 +209,28 @@ func (s *stateDriver) getDriverAdditionalConfigs(ctx context.Context, cr *v1alph additionalCfgs.Volumes = append(additionalCfgs.Volumes, subscriptionVol) } } + + // Mount /lib/modules for SLES/SL-Micro + if pool.osRelease == "sles" || pool.osRelease == "sl-micro" { + logger.Info("Mounting /lib/modules into the driver container", "OS", pool.osRelease) + libModulesVolMount := corev1.VolumeMount{ + Name: "lib-modules", + MountPath: "/run/host/lib/modules", + ReadOnly: true, + } + additionalCfgs.VolumeMounts = append(additionalCfgs.VolumeMounts, libModulesVolMount) + + libModulesVol := corev1.Volume{ + Name: "lib-modules", + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: "/lib/modules", + Type: ptr.To(corev1.HostPathDirectory), + }, + }, + } + additionalCfgs.Volumes = append(additionalCfgs.Volumes, libModulesVol) + } } // mount any custom kernel module configuration parameters at /drivers