/
tracker.go
91 lines (76 loc) · 2.83 KB
/
tracker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
Copyright 2019 VMware, Inc.
SPDX-License-Identifier: Apache-2.0
*/
package testing
import (
"context"
"fmt"
"time"
"github.com/vmware-labs/reconciler-runtime/tracker"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// TrackRequest records that one object is tracking another object.
type TrackRequest struct {
// Tracker is the object doing the tracking
Tracker types.NamespacedName
// Tracked is the object being tracked
Tracked tracker.Key
}
type trackBy func(trackingObjNamespace, trackingObjName string) TrackRequest
func (t trackBy) By(trackingObjNamespace, trackingObjName string) TrackRequest {
return t(trackingObjNamespace, trackingObjName)
}
func CreateTrackRequest(trackedObjGroup, trackedObjKind, trackedObjNamespace, trackedObjName string) trackBy {
return func(trackingObjNamespace, trackingObjName string) TrackRequest {
return TrackRequest{
Tracked: tracker.Key{GroupKind: schema.GroupKind{Group: trackedObjGroup, Kind: trackedObjKind}, NamespacedName: types.NamespacedName{Namespace: trackedObjNamespace, Name: trackedObjName}},
Tracker: types.NamespacedName{Namespace: trackingObjNamespace, Name: trackingObjName},
}
}
}
func NewTrackRequest(t, b client.Object, scheme *runtime.Scheme) TrackRequest {
tracked, by := t.DeepCopyObject().(client.Object), b.DeepCopyObject().(client.Object)
gvks, _, err := scheme.ObjectKinds(tracked)
if err != nil {
panic(err)
}
return TrackRequest{
Tracked: tracker.Key{GroupKind: schema.GroupKind{Group: gvks[0].Group, Kind: gvks[0].Kind}, NamespacedName: types.NamespacedName{Namespace: tracked.GetNamespace(), Name: tracked.GetName()}},
Tracker: types.NamespacedName{Namespace: by.GetNamespace(), Name: by.GetName()},
}
}
const maxDuration = time.Duration(1<<63 - 1)
func createTracker() *mockTracker {
return &mockTracker{Tracker: tracker.New(maxDuration), reqs: []TrackRequest{}}
}
type mockTracker struct {
tracker.Tracker
reqs []TrackRequest
}
var _ tracker.Tracker = &mockTracker{}
func (t *mockTracker) Track(ctx context.Context, ref tracker.Key, obj types.NamespacedName) {
t.Tracker.Track(ctx, ref, obj)
t.reqs = append(t.reqs, TrackRequest{Tracked: ref, Tracker: obj})
}
func (t *mockTracker) TrackChild(ctx context.Context, parent, child client.Object, s *runtime.Scheme) error {
gvks, _, err := s.ObjectKinds(child)
if err != nil {
return err
}
if len(gvks) != 1 {
return fmt.Errorf("expected exactly one GVK, found: %s", gvks)
}
t.Track(
ctx,
tracker.NewKey(gvks[0], types.NamespacedName{Namespace: child.GetNamespace(), Name: child.GetName()}),
types.NamespacedName{Namespace: parent.GetNamespace(), Name: parent.GetName()},
)
return nil
}
func (t *mockTracker) getTrackRequests() []TrackRequest {
return append([]TrackRequest{}, t.reqs...)
}