Skip to content

Commit be3e0eb

Browse files
committed
test
Signed-off-by: Ryan Zhang <[email protected]>
1 parent b0ccb0b commit be3e0eb

File tree

12 files changed

+101
-38
lines changed

12 files changed

+101
-38
lines changed

pkg/controllers/rollout/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ type Reconciler struct {
6565
// Reconcile triggers a single binding reconcile round.
6666
func (r *Reconciler) Reconcile(ctx context.Context, req runtime.Request) (runtime.Result, error) {
6767
startTime := time.Now()
68-
placementKey := controller.GetPlacementKeyFromRequest(req)
68+
placementKey := controller.GetObjectKeyFromRequest(req)
6969
klog.V(2).InfoS("Start to rollout the bindings", "placementKey", placementKey)
7070

7171
// add latency log
@@ -147,7 +147,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req runtime.Request) (runtim
147147
}
148148

149149
// find the master resourceSnapshot.
150-
masterResourceSnapshot, err := controller.FetchMasterResourceSnapshot(ctx, r.UncachedReader, string(placementKey))
150+
masterResourceSnapshot, err := controller.FetchLatestMasterResourceSnapshot(ctx, r.UncachedReader, string(placementKey))
151151
if err != nil {
152152
klog.ErrorS(err, "Failed to find the masterResourceSnapshot for the placement",
153153
"placement", placementObjRef)

pkg/controllers/workgenerator/controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req controllerruntime.Reques
9595
}()
9696

9797
// Get the binding using the utility function
98-
placementKey := controller.GetPlacementKeyFromRequest(req)
98+
placementKey := controller.GetObjectKeyFromRequest(req)
9999
resourceBinding, err := controller.FetchBindingFromKey(ctx, r.Client, placementKey)
100100
if err != nil {
101101
if apierrors.IsNotFound(err) {
@@ -280,7 +280,7 @@ func (r *Reconciler) updateBindingStatusWithRetry(ctx context.Context, resourceB
280280
klog.ErrorS(err, "Failed to update the binding status, will retry", "binding", bindingRef, "bindingStatus", resourceBinding.GetBindingStatus())
281281
errAfterRetries := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
282282
// Get the latest binding object using the utility function
283-
placementKey := controller.GetPlacementKeyFromObj(resourceBinding)
283+
placementKey := controller.GetObjectKeyFromObj(resourceBinding)
284284
latestBinding, err := controller.FetchBindingFromKey(ctx, r.Client, placementKey)
285285
if err != nil {
286286
return err

pkg/controllers/workgenerator/envelope.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,36 +39,36 @@ func (r *Reconciler) createOrUpdateEnvelopeCRWorkObj(
3939
ctx context.Context,
4040
envelopeReader fleetv1beta1.EnvelopeReader,
4141
workNamePrefix string,
42-
resourceBinding fleetv1beta1.BindingObj,
42+
binding fleetv1beta1.BindingObj,
4343
resourceSnapshot fleetv1beta1.ResourceSnapshotObj,
4444
resourceOverrideSnapshotHash, clusterResourceOverrideSnapshotHash string,
4545
) (*fleetv1beta1.Work, error) {
4646
manifests, err := extractManifestsFromEnvelopeCR(envelopeReader)
4747
if err != nil {
4848
klog.ErrorS(err, "Failed to extract manifests from the envelope spec",
49-
"resourceBinding", klog.KObj(resourceBinding),
49+
"resourceBinding", klog.KObj(binding),
5050
"resourceSnapshot", klog.KObj(resourceSnapshot),
5151
"envelope", envelopeReader.GetEnvelopeObjRef())
5252
return nil, err
5353
}
5454
klog.V(2).InfoS("Successfully extracted wrapped manifests from the envelope",
5555
"numOfResources", len(manifests),
56-
"resourceBinding", klog.KObj(resourceBinding),
56+
"resourceBinding", klog.KObj(binding),
5757
"resourceSnapshot", klog.KObj(resourceSnapshot),
5858
"envelope", envelopeReader.GetEnvelopeObjRef())
5959

6060
// Check to see if a corresponding work object has been created for the envelope.
6161
labelMatcher := client.MatchingLabels{
62-
fleetv1beta1.ParentBindingLabel: resourceBinding.GetName(),
63-
fleetv1beta1.CRPTrackingLabel: resourceBinding.GetLabels()[fleetv1beta1.CRPTrackingLabel],
62+
fleetv1beta1.ParentBindingLabel: binding.GetName(),
63+
fleetv1beta1.CRPTrackingLabel: binding.GetLabels()[fleetv1beta1.CRPTrackingLabel],
6464
fleetv1beta1.EnvelopeTypeLabel: envelopeReader.GetEnvelopeType(),
6565
fleetv1beta1.EnvelopeNameLabel: envelopeReader.GetName(),
6666
fleetv1beta1.EnvelopeNamespaceLabel: envelopeReader.GetNamespace(),
6767
}
6868
workList := &fleetv1beta1.WorkList{}
6969
if err = r.Client.List(ctx, workList, labelMatcher); err != nil {
7070
klog.ErrorS(err, "Failed to list work objects when finding the work object for an envelope",
71-
"resourceBinding", klog.KObj(resourceBinding),
71+
"resourceBinding", klog.KObj(binding),
7272
"resourceSnapshot", klog.KObj(resourceSnapshot),
7373
"envelope", envelopeReader.GetEnvelopeObjRef())
7474
wrappedErr := fmt.Errorf("failed to list work objects when finding the work object for an envelope %v: %w", envelopeReader.GetEnvelopeObjRef(), err)
@@ -81,25 +81,25 @@ func (r *Reconciler) createOrUpdateEnvelopeCRWorkObj(
8181
// Multiple matching work objects found; this should never occur under normal conditions.
8282
wrappedErr := fmt.Errorf("%d work objects found for the same envelope %v, only one expected", len(workList.Items), envelopeReader.GetEnvelopeObjRef())
8383
klog.ErrorS(wrappedErr, "Failed to create or update work object for envelope",
84-
"resourceBinding", klog.KObj(resourceBinding),
84+
"resourceBinding", klog.KObj(binding),
8585
"resourceSnapshot", klog.KObj(resourceSnapshot),
8686
"envelope", envelopeReader.GetEnvelopeObjRef())
8787
return nil, controller.NewUnexpectedBehaviorError(wrappedErr)
8888
case len(workList.Items) == 1:
8989
klog.V(2).InfoS("Found existing work object for the envelope; updating it",
9090
"work", klog.KObj(&workList.Items[0]),
91-
"resourceBinding", klog.KObj(resourceBinding),
91+
"resourceBinding", klog.KObj(binding),
9292
"resourceSnapshot", klog.KObj(resourceSnapshot),
9393
"envelope", envelopeReader.GetEnvelopeObjRef())
9494
work = &workList.Items[0]
95-
refreshWorkForEnvelopeCR(work, resourceBinding, resourceSnapshot, manifests, resourceOverrideSnapshotHash, clusterResourceOverrideSnapshotHash)
95+
refreshWorkForEnvelopeCR(work, binding, resourceSnapshot, manifests, resourceOverrideSnapshotHash, clusterResourceOverrideSnapshotHash)
9696
case len(workList.Items) == 0:
9797
// No matching work object found; create a new one.
9898
klog.V(2).InfoS("No existing work object found for the envelope; creating a new one",
99-
"resourceBinding", klog.KObj(resourceBinding),
99+
"resourceBinding", klog.KObj(binding),
100100
"resourceSnapshot", klog.KObj(resourceSnapshot),
101101
"envelope", envelopeReader.GetEnvelopeObjRef())
102-
work = buildNewWorkForEnvelopeCR(workNamePrefix, resourceBinding, resourceSnapshot, envelopeReader, manifests, resourceOverrideSnapshotHash, clusterResourceOverrideSnapshotHash)
102+
work = buildNewWorkForEnvelopeCR(workNamePrefix, binding, resourceSnapshot, envelopeReader, manifests, resourceOverrideSnapshotHash, clusterResourceOverrideSnapshotHash)
103103
}
104104

105105
return work, nil

pkg/controllers/workgenerator/override.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/kubefleet-dev/kubefleet/pkg/utils/overrider"
3737
)
3838

39+
// TODO: combine the following two functions into one, as they are very similar.
3940
func (r *Reconciler) fetchClusterResourceOverrideSnapshots(ctx context.Context, resourceBinding placementv1beta1.BindingObj) (map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ClusterResourceOverrideSnapshot, error) {
4041
croMap := make(map[placementv1beta1.ResourceIdentifier][]*placementv1alpha1.ClusterResourceOverrideSnapshot)
4142

@@ -49,7 +50,7 @@ func (r *Reconciler) fetchClusterResourceOverrideSnapshots(ctx context.Context,
4950
// It could be caused by that the user updates the override too frequently and the snapshot has been replaced
5051
// by the new one.
5152
// TODO: support customized revision history limit
52-
return nil, controller.NewUserError(fmt.Errorf("clusterResourceSnapshot %s is not found", name))
53+
return nil, controller.NewUserError(fmt.Errorf("clusterResourceOverrideSnapshot %s is not found", name))
5354
}
5455
klog.ErrorS(err, "Failed to get the clusterResourceOverrideSnapshot",
5556
"binding", klog.KObj(resourceBinding), "clusterResourceOverrideSnapshot", name)
@@ -83,7 +84,7 @@ func (r *Reconciler) fetchResourceOverrideSnapshots(ctx context.Context, resourc
8384
// by the new one.
8485
// TODO: support customized revision history limit
8586
klog.ErrorS(err, "The resourceOverrideSnapshot is deleted", "binding", klog.KObj(resourceBinding), "resourceOverrideSnapshot", namespacedName)
86-
return nil, controller.NewUserError(fmt.Errorf("resourceSnapshot %s is not found", namespacedName))
87+
return nil, controller.NewUserError(fmt.Errorf("resourceOverrideSnapshot %s is not found", namespacedName))
8788
}
8889
klog.ErrorS(err, "Failed to get the resourceOverrideSnapshot",
8990
"binding", klog.KObj(resourceBinding), "resourceOverrideSnapshot", namespacedName)

pkg/scheduler/queue/queue.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
// ClusterResourcePlacement's name in the form of "name".
3030
// If the Placement is a NamespaceResourcePlacement, the PlacementKey is the
3131
// NamespaceResourcePlacement's name in the form of "namespace/name".
32+
// TODO: rename this to be ObjectKey or something similar, as it is not specific to Placement.
3233
type PlacementKey string
3334

3435
// PlacementSchedulingQueueWriter is an interface which allows sources, such as controllers, to add

pkg/scheduler/scheduler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func (s *Scheduler) scheduleOnce(ctx context.Context, worker int) {
210210
// Note that the scheduler will enter this cycle as long as the placement is active and an active
211211
// policy snapshot has been produced.
212212
cycleStartTime := time.Now()
213-
res, err := s.framework.RunSchedulingCycleFor(ctx, controller.GetPlacementKeyFromObj(placement), latestPolicySnapshot)
213+
res, err := s.framework.RunSchedulingCycleFor(ctx, controller.GetObjectKeyFromObj(placement), latestPolicySnapshot)
214214
if err != nil {
215215
if errors.Is(err, controller.ErrUnexpectedBehavior) {
216216
// The placement is in an unexpected state; this is a scheduler-side error, and
@@ -299,7 +299,7 @@ func (s *Scheduler) cleanUpAllBindingsFor(ctx context.Context, placement fleetv1
299299
placementRef := klog.KObj(placement)
300300

301301
// Get the placement key which handles both cluster-scoped and namespaced placements
302-
placementKey := controller.GetPlacementKeyFromObj(placement)
302+
placementKey := controller.GetObjectKeyFromObj(placement)
303303

304304
// List all bindings derived from the placement.
305305
//

pkg/utils/controller/binding_resolver.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ import (
2727
"github.com/kubefleet-dev/kubefleet/pkg/scheduler/queue"
2828
)
2929

30-
// FetchBindingFromKey resolves a PlacementKey to a concrete binding object that implements BindingObj.
31-
func FetchBindingFromKey(ctx context.Context, c client.Reader, placementKey queue.PlacementKey) (placementv1beta1.BindingObj, error) {
30+
// FetchBindingFromKey resolves a bindingKey to a concrete binding object that implements BindingObj.
31+
func FetchBindingFromKey(ctx context.Context, c client.Reader, bindingKey queue.PlacementKey) (placementv1beta1.BindingObj, error) {
3232
// Extract namespace and name from the placement key
33-
namespace, name, err := ExtractNamespaceNameFromKey(placementKey)
33+
namespace, name, err := ExtractNamespaceNameFromKey(bindingKey)
3434
if err != nil {
3535
return nil, err
3636
}

pkg/utils/controller/binding_resolver_test.go

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,9 +368,32 @@ func TestFetchBindingFromKey(t *testing.T) {
368368
{
369369
name: "cluster-scoped placement key - ClusterResourceBinding not found",
370370
placementKey: queue.PlacementKey("test-placement"),
371-
objects: []client.Object{},
372-
wantErr: true,
373-
wantBinding: nil,
371+
objects: []client.Object{
372+
&placementv1beta1.ClusterResourceBinding{
373+
ObjectMeta: metav1.ObjectMeta{
374+
Name: "test-binding-1",
375+
Labels: map[string]string{
376+
placementv1beta1.CRPTrackingLabel: "test-placement",
377+
},
378+
},
379+
Spec: placementv1beta1.ResourceBindingSpec{
380+
TargetCluster: "cluster-1",
381+
},
382+
},
383+
&placementv1beta1.ClusterResourceBinding{
384+
ObjectMeta: metav1.ObjectMeta{
385+
Name: "other-binding",
386+
Labels: map[string]string{
387+
placementv1beta1.CRPTrackingLabel: "other-placement",
388+
},
389+
},
390+
Spec: placementv1beta1.ResourceBindingSpec{
391+
TargetCluster: "cluster-2",
392+
},
393+
},
394+
},
395+
wantErr: true,
396+
wantBinding: nil,
374397
},
375398
{
376399
name: "namespaced placement key - ResourceBinding found",
@@ -385,6 +408,24 @@ func TestFetchBindingFromKey(t *testing.T) {
385408
TargetCluster: "cluster-1",
386409
},
387410
},
411+
&placementv1beta1.ResourceBinding{
412+
ObjectMeta: metav1.ObjectMeta{
413+
Name: "test-placement",
414+
Namespace: "other-namespace",
415+
},
416+
Spec: placementv1beta1.ResourceBindingSpec{
417+
TargetCluster: "cluster-1",
418+
},
419+
},
420+
&placementv1beta1.ResourceBinding{
421+
ObjectMeta: metav1.ObjectMeta{
422+
Name: "other-placement",
423+
Namespace: "test-namespace",
424+
},
425+
Spec: placementv1beta1.ResourceBindingSpec{
426+
TargetCluster: "cluster-1",
427+
},
428+
},
388429
},
389430
wantErr: false,
390431
wantBinding: &placementv1beta1.ResourceBinding{
@@ -400,9 +441,28 @@ func TestFetchBindingFromKey(t *testing.T) {
400441
{
401442
name: "namespaced placement key - ResourceBinding not found",
402443
placementKey: queue.PlacementKey("test-namespace/test-placement"),
403-
objects: []client.Object{},
404-
wantErr: true,
405-
wantBinding: nil,
444+
objects: []client.Object{
445+
&placementv1beta1.ResourceBinding{
446+
ObjectMeta: metav1.ObjectMeta{
447+
Name: "test-placement",
448+
Namespace: "other-namespace",
449+
},
450+
Spec: placementv1beta1.ResourceBindingSpec{
451+
TargetCluster: "cluster-1",
452+
},
453+
},
454+
&placementv1beta1.ResourceBinding{
455+
ObjectMeta: metav1.ObjectMeta{
456+
Name: "other-placement",
457+
Namespace: "test-namespace",
458+
},
459+
Spec: placementv1beta1.ResourceBindingSpec{
460+
TargetCluster: "cluster-1",
461+
},
462+
},
463+
},
464+
wantErr: true,
465+
wantBinding: nil,
406466
},
407467
{
408468
name: "invalid placement key format - too many separators",

pkg/utils/controller/placement_resolver.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"strings"
2323

24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
"k8s.io/apimachinery/pkg/types"
2526
ctrl "sigs.k8s.io/controller-runtime"
2627
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -66,8 +67,8 @@ func FetchPlacementFromKey(ctx context.Context, c client.Reader, placementKey qu
6667
}
6768
}
6869

69-
// GetPlacementKeyFromObj generates a PlacementKey from a placement object.
70-
func GetPlacementKeyFromObj(obj client.Object) queue.PlacementKey {
70+
// GetObjectKeyFromObj generates a PlacementKey from an meta object.
71+
func GetObjectKeyFromObj(obj metav1.Object) queue.PlacementKey {
7172
if obj.GetNamespace() == "" {
7273
// Cluster-scoped placement
7374
return queue.PlacementKey(obj.GetName())
@@ -77,8 +78,8 @@ func GetPlacementKeyFromObj(obj client.Object) queue.PlacementKey {
7778
}
7879
}
7980

80-
// GetPlacementKeyFromObj generates a PlacementKey from a placement object.
81-
func GetPlacementKeyFromRequest(req ctrl.Request) queue.PlacementKey {
81+
// GetObjectKeyFromRequest generates an object key from a controller runtime request.
82+
func GetObjectKeyFromRequest(req ctrl.Request) queue.PlacementKey {
8283
if req.Namespace == "" {
8384
// Cluster-scoped placement
8485
return queue.PlacementKey(req.Name)
@@ -89,8 +90,8 @@ func GetPlacementKeyFromRequest(req ctrl.Request) queue.PlacementKey {
8990
}
9091

9192
// ExtractNamespaceNameFromKey resolves a PlacementKey to a (namespace, name) tuple of the placement object.
92-
func ExtractNamespaceNameFromKey(placementKey queue.PlacementKey) (string, string, error) {
93-
keyStr := string(placementKey)
93+
func ExtractNamespaceNameFromKey(key queue.PlacementKey) (string, string, error) {
94+
keyStr := string(key)
9495
// Check if the key contains a namespace separator
9596
if strings.Contains(keyStr, namespaceSeparator) {
9697
// This is a namespaced ResourcePlacement

pkg/utils/controller/placement_resolver_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func TestGetPlacementKeyFromObj(t *testing.T) {
194194
}
195195
for _, tt := range tests {
196196
t.Run(tt.name, func(t *testing.T) {
197-
key := GetPlacementKeyFromObj(tt.placement)
197+
key := GetObjectKeyFromObj(tt.placement)
198198
if key != tt.wantKey {
199199
t.Errorf("GetPlacementKeyFromObj() = %v, want %v", key, tt.wantKey)
200200
}

0 commit comments

Comments
 (0)