diff --git a/controllers/object_controls.go b/controllers/object_controls.go index f26a0c063..b15a84ee4 100644 --- a/controllers/object_controls.go +++ b/controllers/object_controls.go @@ -4840,9 +4840,18 @@ func Service(n ClusterPolicyController) (gpuv1.State, error) { return gpuv1.Ready, nil } -func crdExists(n ClusterPolicyController, name string) (bool, error) { - crd := &apiextensionsv1.CustomResourceDefinition{} - err := n.client.Get(n.ctx, client.ObjectKey{Name: name}, crd) +func k8sObjectExists(n ClusterPolicyController, name, kind string) (bool, error) { + var obj client.Object + switch kind { + // TODO: Add more cases once this method is used to retrieve other kubernetes object types + case "CustomResourceDefinition": + obj = &apiextensionsv1.CustomResourceDefinition{} + case "RuntimeClass": + obj = &nodev1.RuntimeClass{} + default: + return false, fmt.Errorf("unknown object kind %s", kind) + } + err := n.client.Get(n.ctx, client.ObjectKey{Name: name}, obj) if err != nil && apierrors.IsNotFound(err) { return false, nil } else if err != nil { @@ -4862,7 +4871,7 @@ func ServiceMonitor(n ClusterPolicyController) (gpuv1.State, error) { logger := n.logger.WithValues("ServiceMonitor", obj.Name, "Namespace", obj.Namespace) // Check if ServiceMonitor is a valid kind - serviceMonitorCRDExists, err := crdExists(n, ServiceMonitorCRDName) + serviceMonitorCRDExists, err := k8sObjectExists(n, ServiceMonitorCRDName, obj.Kind) if err != nil { return gpuv1.NotReady, err } @@ -5174,6 +5183,22 @@ func RuntimeClasses(n ClusterPolicyController) (gpuv1.State, error) { return transformKataRuntimeClasses(n) } + if n.stateNames[state] == "pre-requisites" && !n.isStateEnabled(n.stateNames[state]) { + for _, obj := range n.resources[state].RuntimeClasses { + var exists bool + var err error + if exists, err = k8sObjectExists(n, obj.Name, obj.Kind); err != nil { + return gpuv1.NotReady, fmt.Errorf("error checking if RuntimeClass %s exists: %w", obj.Name, err) + } + if exists { + if err = n.client.Delete(n.ctx, &obj); err != nil { + return gpuv1.NotReady, fmt.Errorf("error deleting RuntimeClass %s: %w", obj.Name, err) + } + } + } + return gpuv1.Ready, nil + } + createRuntimeClassFunc := transformRuntimeClass if semver.Compare(n.k8sVersion, nodev1MinimumAPIVersion) <= 0 { createRuntimeClassFunc = transformRuntimeClassLegacy diff --git a/controllers/state_manager.go b/controllers/state_manager.go index 4ea634ebe..5969f9980 100644 --- a/controllers/state_manager.go +++ b/controllers/state_manager.go @@ -984,6 +984,8 @@ func (n ClusterPolicyController) isStateEnabled(stateName string) bool { clusterPolicySpec := &n.singleton.Spec switch stateName { + case "pre-requisites": + return !clusterPolicySpec.CDI.IsNRIPluginEnabled() case "state-driver": return clusterPolicySpec.Driver.IsEnabled() case "state-container-toolkit":