Skip to content

Commit e691050

Browse files
author
Arvind Thirumurugan
committed
fix validation related functions
Signed-off-by: Arvind Thirumurugan <[email protected]>
1 parent 7fd6edf commit e691050

File tree

3 files changed

+43
-27
lines changed

3 files changed

+43
-27
lines changed

pkg/controllers/updaterun/initialization.go

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,24 +83,13 @@ func (r *Reconciler) initialize(
8383
}
8484

8585
// TODO (arvindth): remove this conversion step after refactoring other functions to use interface types.
86-
// Convert interfaces back to concrete types for compatibility with other functions that haven't been refactored yet.
87-
scheduledBindings := make([]*placementv1beta1.ClusterResourceBinding, len(scheduledBindingObjs))
88-
toBeDeletedBindings := make([]*placementv1beta1.ClusterResourceBinding, len(toBeDeletedBindingObjs))
89-
90-
for i, bindingObj := range scheduledBindingObjs {
91-
if crb, ok := bindingObj.(*placementv1beta1.ClusterResourceBinding); ok {
92-
scheduledBindings[i] = crb
93-
} else {
94-
return nil, nil, fmt.Errorf("expected ClusterResourceBinding but got %T - initialize function needs further refactoring for namespace-scoped resources", bindingObj)
95-
}
86+
scheduledBindings, err := controller.ConvertBindingObjsToConcreteCRBArray(scheduledBindingObjs)
87+
if err != nil {
88+
return nil, nil, err
9689
}
97-
98-
for i, bindingObj := range toBeDeletedBindingObjs {
99-
if crb, ok := bindingObj.(*placementv1beta1.ClusterResourceBinding); ok {
100-
toBeDeletedBindings[i] = crb
101-
} else {
102-
return nil, nil, fmt.Errorf("expected ClusterResourceBinding but got %T - initialize function needs further refactoring for namespace-scoped resources", bindingObj)
103-
}
90+
toBeDeletedBindings, err := controller.ConvertBindingObjsToConcreteCRBArray(toBeDeletedBindingObjs)
91+
if err != nil {
92+
return nil, nil, err
10493
}
10594

10695
return scheduledBindings, toBeDeletedBindings, r.recordInitializationSucceeded(ctx, updateRun)

pkg/controllers/updaterun/validation.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,27 @@ func (r *Reconciler) validate(
7575
}
7676

7777
// Collect the clusters by the corresponding ClusterResourcePlacement with the latest policy snapshot.
78-
scheduledBindings, toBeDeletedBindings, err := r.collectScheduledClusters(ctx, placementName, latestPolicySnapshot, updateRunCopy)
78+
scheduledBindingObjs, toBeDeletedBindingObjs, err := r.collectScheduledClusters(ctx, placementName, latestPolicySnapshot, updateRunCopy)
7979
if err != nil {
8080
return -1, nil, nil, err
8181
}
8282

8383
// Validate the stages and return the updating stage index.
84-
updatingStageIndex, err := r.validateStagesStatus(ctx, scheduledBindings, toBeDeletedBindings, updateRun, updateRunCopy)
84+
updatingStageIndex, err := r.validateStagesStatus(ctx, scheduledBindingObjs, toBeDeletedBindingObjs, updateRun, updateRunCopy)
8585
if err != nil {
8686
return -1, nil, nil, err
8787
}
88+
89+
// TODO (arvindth): remove this conversion step after refactoring other functions to use interface types.
90+
scheduledBindings, err := controller.ConvertBindingObjsToConcreteCRBArray(scheduledBindingObjs)
91+
if err != nil {
92+
return -1, nil, nil, err
93+
}
94+
toBeDeletedBindings, err := controller.ConvertBindingObjsToConcreteCRBArray(toBeDeletedBindingObjs)
95+
if err != nil {
96+
return -1, nil, nil, err
97+
}
98+
8899
return updatingStageIndex, scheduledBindings, toBeDeletedBindings, nil
89100
}
90101

@@ -95,7 +106,7 @@ func (r *Reconciler) validate(
95106
// If the updating stage index is len(updateRun.Status.StagesStatus), the next stage to be updated will be the delete stage.
96107
func (r *Reconciler) validateStagesStatus(
97108
ctx context.Context,
98-
scheduledBindings, toBeDeletedBindings []*placementv1beta1.ClusterResourceBinding,
109+
scheduledBindingObjs, toBeDeletedBindingObjs []placementv1beta1.BindingObj,
99110
updateRun, updateRunCopy *placementv1beta1.ClusterStagedUpdateRun,
100111
) (int, error) {
101112
updateRunRef := klog.KObj(updateRun)
@@ -108,7 +119,7 @@ func (r *Reconciler) validateStagesStatus(
108119
klog.ErrorS(unexpectedErr, "Failed to find the stagedUpdateStrategySnapshot in the clusterStagedUpdateRun", "clusterStagedUpdateRun", updateRunRef)
109120
return -1, fmt.Errorf("%w: %s", errStagedUpdatedAborted, unexpectedErr.Error())
110121
}
111-
if err := r.computeRunStageStatus(ctx, scheduledBindings, updateRunCopy); err != nil {
122+
if err := r.computeRunStageStatus(ctx, scheduledBindingObjs, updateRunCopy); err != nil {
112123
return -1, err
113124
}
114125

@@ -124,7 +135,7 @@ func (r *Reconciler) validateStagesStatus(
124135
return -1, validateErr
125136
}
126137

127-
return validateDeleteStageStatus(updatingStageIndex, lastFinishedStageIndex, len(existingStageStatus), toBeDeletedBindings, updateRunCopy)
138+
return validateDeleteStageStatus(updatingStageIndex, lastFinishedStageIndex, len(existingStageStatus), toBeDeletedBindingObjs, updateRunCopy)
128139
}
129140

130141
// validateUpdateStagesStatus is a helper function to validate the updating stages in the clusterStagedUpdateRun.
@@ -256,7 +267,7 @@ func validateClusterUpdatingStatus(
256267
// It returns the updating stage index, or any error encountered.
257268
func validateDeleteStageStatus(
258269
updatingStageIndex, lastFinishedStageIndex, totalStages int,
259-
toBeDeletedBindings []*placementv1beta1.ClusterResourceBinding,
270+
toBeDeletedBindingObjs []placementv1beta1.BindingObj,
260271
updateRun *placementv1beta1.ClusterStagedUpdateRun,
261272
) (int, error) {
262273
updateRunRef := klog.KObj(updateRun)
@@ -274,10 +285,11 @@ func validateDeleteStageStatus(
274285
for _, cluster := range existingDeleteStageStatus.Clusters {
275286
deletingClusterMap[cluster.ClusterName] = struct{}{}
276287
}
277-
for _, binding := range toBeDeletedBindings {
278-
if _, ok := deletingClusterMap[binding.Spec.TargetCluster]; !ok {
279-
unexpectedErr := controller.NewUnexpectedBehaviorError(fmt.Errorf("the cluster `%s` to be deleted is not in the delete stage", binding.Spec.TargetCluster))
280-
klog.ErrorS(unexpectedErr, "Detect new cluster to be unscheduled", "clusterResourceBinding", klog.KObj(binding), "clusterStagedUpdateRun", updateRunRef)
288+
for _, bindingObj := range toBeDeletedBindingObjs {
289+
bindingSpec := bindingObj.GetBindingSpec()
290+
if _, ok := deletingClusterMap[bindingSpec.TargetCluster]; !ok {
291+
unexpectedErr := controller.NewUnexpectedBehaviorError(fmt.Errorf("the cluster `%s` to be deleted is not in the delete stage", bindingSpec.TargetCluster))
292+
klog.ErrorS(unexpectedErr, "Detect new cluster to be unscheduled", "binding", klog.KObj(bindingObj), "clusterStagedUpdateRun", updateRunRef)
281293
return -1, fmt.Errorf("%w: %s", errStagedUpdatedAborted, unexpectedErr.Error())
282294
}
283295
}

pkg/utils/controller/binding_resolver.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controller
1818

1919
import (
2020
"context"
21+
"fmt"
2122

2223
"k8s.io/apimachinery/pkg/types"
2324
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -122,3 +123,17 @@ func ConvertRBArrayToBindingObjs(bindings []*placementv1beta1.ResourceBinding) [
122123
}
123124
return result
124125
}
126+
127+
// ConvertBindingObjsToConcreteCRBArray converts a slice of BindingObj interfaces to a slice of concrete ClusterResourceBinding pointers.
128+
func ConvertBindingObjsToConcreteCRBArray(bindingObjs []placementv1beta1.BindingObj) ([]*placementv1beta1.ClusterResourceBinding, error) {
129+
bindings := make([]*placementv1beta1.ClusterResourceBinding, len(bindingObjs))
130+
131+
for i, bindingObj := range bindingObjs {
132+
if crb, ok := bindingObj.(*placementv1beta1.ClusterResourceBinding); ok {
133+
bindings[i] = crb
134+
} else {
135+
return nil, fmt.Errorf("expected ClusterResourceBinding but got %T - initialize function needs further refactoring for namespace-scoped resources", bindingObj)
136+
}
137+
}
138+
return bindings, nil
139+
}

0 commit comments

Comments
 (0)