diff --git a/internal/conditions/clusterpolicy.go b/internal/conditions/clusterpolicy.go index b1d89ba13..09d0607ab 100644 --- a/internal/conditions/clusterpolicy.go +++ b/internal/conditions/clusterpolicy.go @@ -18,6 +18,7 @@ package conditions import ( "context" + "fmt" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -39,42 +40,22 @@ func NewClusterPolicyUpdater(client client.Client) Updater { } func (u *clusterPolicyUpdater) SetConditionsReady(ctx context.Context, cr any, reason, message string) error { - clusterPolicyCr, _ := cr.(*nvidiav1.ClusterPolicy) - return u.setConditionsReady(ctx, clusterPolicyCr, reason, message) + clusterPolicyCr, ok := cr.(*nvidiav1.ClusterPolicy) + if !ok { + return fmt.Errorf("provided object is not a *nvidiav1.ClusterPolicy") + } + return u.setConditions(ctx, clusterPolicyCr, Ready, reason, message) } func (u *clusterPolicyUpdater) SetConditionsError(ctx context.Context, cr any, reason, message string) error { - clusterPolicyCr, _ := cr.(*nvidiav1.ClusterPolicy) - return u.setConditionsError(ctx, clusterPolicyCr, reason, message) -} - -func (u *clusterPolicyUpdater) setConditionsReady(ctx context.Context, cr *nvidiav1.ClusterPolicy, reason, message string) error { - reqLogger := log.FromContext(ctx) - // Fetch latest instance and update state to avoid version mismatch - instance := &nvidiav1.ClusterPolicy{} - err := u.client.Get(ctx, types.NamespacedName{Name: cr.Name}, instance) - if err != nil { - reqLogger.Error(err, "Failed to get ClusterPolicy instance for status update", "name", cr.Name) - return err + clusterPolicyCr, ok := cr.(*nvidiav1.ClusterPolicy) + if !ok { + return fmt.Errorf("provided object is not a *nvidiav1.ClusterPolicy") } - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Ready, - Status: metav1.ConditionTrue, - Reason: reason, - Message: message, - }) - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Error, - Status: metav1.ConditionFalse, - Reason: Ready, - }) - - return u.client.Status().Update(ctx, instance) + return u.setConditions(ctx, clusterPolicyCr, Error, reason, message) } -func (u *clusterPolicyUpdater) setConditionsError(ctx context.Context, cr *nvidiav1.ClusterPolicy, reason, message string) error { +func (u *clusterPolicyUpdater) setConditions(ctx context.Context, cr *nvidiav1.ClusterPolicy, statusType, reason, message string) error { reqLogger := log.FromContext(ctx) // Fetch latest instance and update state to avoid version mismatch instance := &nvidiav1.ClusterPolicy{} @@ -84,18 +65,37 @@ func (u *clusterPolicyUpdater) setConditionsError(ctx context.Context, cr *nvidi return err } - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Ready, - Status: metav1.ConditionFalse, - Reason: Error, - }) - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Error, - Status: metav1.ConditionTrue, - Reason: reason, - Message: message, - }) + switch statusType { + case Ready: + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionTrue, + Reason: reason, + Message: message, + }) + + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Error, + Status: metav1.ConditionFalse, + Reason: Ready, + }) + case Error: + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionFalse, + Reason: Error, + }) + + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Error, + Status: metav1.ConditionTrue, + Reason: reason, + Message: message, + }) + default: + reqLogger.Error(nil, "Unknown status type provided", "statusType", statusType) + return fmt.Errorf("unknown status type provided: %s", statusType) + } return u.client.Status().Update(ctx, instance) } diff --git a/internal/conditions/nvidiadriver.go b/internal/conditions/nvidiadriver.go index c3ff538fd..32c88a565 100644 --- a/internal/conditions/nvidiadriver.go +++ b/internal/conditions/nvidiadriver.go @@ -18,6 +18,7 @@ package conditions import ( "context" + "fmt" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -45,69 +46,69 @@ func NewNvDriverUpdater(client client.Client) Updater { } func (u *nvDriverUpdater) SetConditionsReady(ctx context.Context, cr any, reason, message string) error { - nvDriverCr, _ := cr.(*nvidiav1alpha1.NVIDIADriver) - return u.setConditionsReady(ctx, nvDriverCr, reason, message) + nvDriverCr, ok := cr.(*nvidiav1alpha1.NVIDIADriver) + if !ok { + return fmt.Errorf("provided object is not a *nvidiav1alpha1.NVIDIADriver") + } + return u.setConditions(ctx, nvDriverCr, Ready, reason, message) } func (u *nvDriverUpdater) SetConditionsError(ctx context.Context, cr any, reason, message string) error { - nvDriverCr, _ := cr.(*nvidiav1alpha1.NVIDIADriver) - return u.setConditionsError(ctx, nvDriverCr, reason, message) -} - -func (u *nvDriverUpdater) setConditionsReady(ctx context.Context, cr *nvidiav1alpha1.NVIDIADriver, reason, message string) error { - reqLogger := log.FromContext(ctx) - // Fetch latest instance and update state to avoid version mismatch - instance := &nvidiav1alpha1.NVIDIADriver{} - err := u.client.Get(ctx, types.NamespacedName{Name: cr.Name}, instance) - if err != nil { - reqLogger.Error(err, "Failed to get NVIDIADriver instance for status update", "name", cr.Name) - return err + nvDriverCr, ok := cr.(*nvidiav1alpha1.NVIDIADriver) + if !ok { + return fmt.Errorf("provided object is not a *nvidiav1alpha1.NVIDIADriver") } - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Ready, - Status: metav1.ConditionTrue, - Reason: reason, - Message: message, - }) - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Error, - Status: metav1.ConditionFalse, - Reason: Ready, - }) - - return u.client.Status().Update(ctx, instance) + return u.setConditions(ctx, nvDriverCr, Error, reason, message) } -func (u *nvDriverUpdater) setConditionsError(ctx context.Context, cr *nvidiav1alpha1.NVIDIADriver, reason, message string) error { +func (u *nvDriverUpdater) setConditions(ctx context.Context, cr *nvidiav1alpha1.NVIDIADriver, statusType, reason, message string) error { reqLogger := log.FromContext(ctx) // Fetch latest instance and update state to avoid version mismatch instance := &nvidiav1alpha1.NVIDIADriver{} err := u.client.Get(ctx, types.NamespacedName{Name: cr.Name}, instance) if err != nil { reqLogger.Error(err, "Failed to get NVIDIADriver instance for status update", "name", cr.Name) + return err } - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Ready, - Status: metav1.ConditionFalse, - Reason: Error, - }) - - meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ - Type: Error, - Status: metav1.ConditionTrue, - Reason: reason, - Message: message, - }) - - // Ensure status.state is not empty when updating the CR status. - // The caller should set the state appropriately in the CR - // depending on the error condition. - instance.Status.State = cr.Status.State - if instance.Status.State == "" { - instance.Status.State = nvidiav1alpha1.NotReady + switch statusType { + case Ready: + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionTrue, + Reason: reason, + Message: message, + }) + + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Error, + Status: metav1.ConditionFalse, + Reason: Ready, + }) + case Error: + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Ready, + Status: metav1.ConditionFalse, + Reason: Error, + }) + + meta.SetStatusCondition(&instance.Status.Conditions, metav1.Condition{ + Type: Error, + Status: metav1.ConditionTrue, + Reason: reason, + Message: message, + }) + + // Ensure status.state is not empty when updating the CR status. + // The caller should set the state appropriately in the CR + // depending on the error condition. + instance.Status.State = cr.Status.State + if instance.Status.State == "" { + instance.Status.State = nvidiav1alpha1.NotReady + } + default: + reqLogger.Error(nil, "Unknown status type provided", "statusType", statusType) + return fmt.Errorf("unknown status type provided: %s", statusType) } return u.client.Status().Update(ctx, instance)