/
tracker.go
78 lines (64 loc) · 2.41 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
/*
Copyright 2019 VMware, Inc.
SPDX-License-Identifier: Apache-2.0
*/
package testing
import (
"time"
"github.com/go-logr/logr"
"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, logr.Discard()), reqs: []TrackRequest{}}
}
type mockTracker struct {
tracker.Tracker
reqs []TrackRequest
}
var _ tracker.Tracker = &mockTracker{}
func (t *mockTracker) Track(ref tracker.Key, obj types.NamespacedName) {
t.Tracker.Track(ref, obj)
t.reqs = append(t.reqs, TrackRequest{Tracked: ref, Tracker: obj})
}
func (t *mockTracker) getTrackRequests() []TrackRequest {
result := []TrackRequest{}
for _, req := range t.reqs {
result = append(result, req)
}
return result
}