@@ -20,101 +20,151 @@ import (
20
20
"testing"
21
21
22
22
. "github.com/onsi/gomega"
23
-
24
23
corev1 "k8s.io/api/core/v1"
25
24
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
- " k8s.io/client-go/tools/record "
25
+ clusterv1 "sigs. k8s.io/cluster-api/api/v1alpha4 "
27
26
"sigs.k8s.io/cluster-api/controllers/noderefutil"
27
+ "sigs.k8s.io/cluster-api/controllers/remote"
28
+ "sigs.k8s.io/cluster-api/util"
29
+ ctrl "sigs.k8s.io/controller-runtime"
28
30
"sigs.k8s.io/controller-runtime/pkg/client"
29
- "sigs.k8s.io/controller-runtime/pkg/client/fake"
31
+ "sigs.k8s.io/controller-runtime/pkg/handler"
32
+ "sigs.k8s.io/controller-runtime/pkg/reconcile"
30
33
)
31
34
32
- func TestGetNodeReference (t * testing.T ) {
35
+ func TestGetNode (t * testing.T ) {
33
36
g := NewWithT (t )
34
37
35
- r := & MachineReconciler {
36
- Client : fake .NewClientBuilder ().Build (),
37
- recorder : record .NewFakeRecorder (32 ),
38
- }
38
+ ns , err := env .CreateNamespace (ctx , "test-get-node" )
39
+ g .Expect (err ).ToNot (HaveOccurred ())
39
40
40
- nodeList := []client.Object {
41
- & corev1.Node {
42
- ObjectMeta : metav1.ObjectMeta {
43
- Name : "node-1" ,
44
- },
45
- Spec : corev1.NodeSpec {
46
- ProviderID : "aws://us-east-1/id-node-1" ,
47
- },
48
- },
49
- & corev1.Node {
50
- ObjectMeta : metav1.ObjectMeta {
51
- Name : "node-2" ,
52
- },
53
- Spec : corev1.NodeSpec {
54
- ProviderID : "aws://us-west-2/id-node-2" ,
55
- },
56
- },
57
- & corev1.Node {
58
- ObjectMeta : metav1.ObjectMeta {
59
- Name : "gce-node-2" ,
60
- },
61
- Spec : corev1.NodeSpec {
62
- ProviderID : "gce://us-central1/id-node-2" ,
63
- },
41
+ // Set up cluster to test against.
42
+ testCluster := & clusterv1.Cluster {
43
+ ObjectMeta : metav1.ObjectMeta {
44
+ GenerateName : "test-get-node-" ,
45
+ Namespace : ns .Name ,
64
46
},
65
47
}
66
48
67
- client := fake .NewClientBuilder ().WithObjects (nodeList ... ).Build ()
49
+ g .Expect (env .Create (ctx , testCluster )).To (BeNil ())
50
+ g .Expect (env .CreateKubeconfigSecret (ctx , testCluster )).To (Succeed ())
51
+ defer func (do ... client.Object ) {
52
+ g .Expect (env .Cleanup (ctx , do ... )).To (Succeed ())
53
+ }(ns , testCluster )
68
54
69
55
testCases := []struct {
70
- name string
71
- providerID string
72
- expected * corev1. ObjectReference
73
- err error
56
+ name string
57
+ node * corev1. Node
58
+ providerIDInput string
59
+ error error
74
60
}{
75
61
{
76
- name : "valid provider id, valid aws node" ,
77
- providerID : "aws:///id-node-1" ,
78
- expected : & corev1.ObjectReference {Name : "node-1" },
62
+ name : "full providerID matches" ,
63
+ node : & corev1.Node {
64
+ ObjectMeta : metav1.ObjectMeta {
65
+ Name : "test-get-node-node-1" ,
66
+ },
67
+ Spec : corev1.NodeSpec {
68
+ ProviderID : "aws://us-east-1/test-get-node-1" ,
69
+ },
70
+ },
71
+ providerIDInput : "aws://us-east-1/test-get-node-1" ,
79
72
},
80
73
{
81
- name : "valid provider id, valid aws node" ,
82
- providerID : "aws:///id-node-2" ,
83
- expected : & corev1.ObjectReference {Name : "node-2" },
74
+ name : "aws prefix: cloudProvider and ID matches" ,
75
+ node : & corev1.Node {
76
+ ObjectMeta : metav1.ObjectMeta {
77
+ Name : "test-get-node-node-2" ,
78
+ },
79
+ Spec : corev1.NodeSpec {
80
+ ProviderID : "aws://us-west-2/test-get-node-2" ,
81
+ },
82
+ },
83
+ providerIDInput : "aws:///test-get-node-2" ,
84
84
},
85
85
{
86
- name : "valid provider id, valid gce node" ,
87
- providerID : "gce:///id-node-2" ,
88
- expected : & corev1.ObjectReference {Name : "gce-node-2" },
86
+ name : "gce prefix, cloudProvider and ID matches" ,
87
+ node : & corev1.Node {
88
+ ObjectMeta : metav1.ObjectMeta {
89
+ Name : "test-get-node-gce-node-2" ,
90
+ },
91
+ Spec : corev1.NodeSpec {
92
+ ProviderID : "gce://us-central1/test-get-node-2" ,
93
+ },
94
+ },
95
+ providerIDInput : "gce:///test-get-node-2" ,
89
96
},
90
97
{
91
- name : "valid provider id, no node found" ,
92
- providerID : "aws:///id-node-100" ,
93
- expected : nil ,
94
- err : ErrNodeNotFound ,
98
+ name : "Node is not found" ,
99
+ node : & corev1.Node {
100
+ ObjectMeta : metav1.ObjectMeta {
101
+ Name : "test-get-node-not-found" ,
102
+ },
103
+ Spec : corev1.NodeSpec {
104
+ ProviderID : "gce://us-central1/anything" ,
105
+ },
106
+ },
107
+ providerIDInput : "gce://not-found" ,
108
+ error : ErrNodeNotFound ,
95
109
},
96
110
}
97
111
98
- for _ , test := range testCases {
99
- t .Run (test .name , func (t * testing.T ) {
100
- gt := NewWithT (t )
101
- providerID , err := noderefutil .NewProviderID (test .providerID )
102
- gt .Expect (err ).NotTo (HaveOccurred (), "Expected no error parsing provider id %q, got %v" , test .providerID , err )
103
-
104
- node , err := r .getNode (ctx , client , providerID )
105
- if test .err == nil {
106
- g .Expect (err ).To (BeNil ())
107
- } else {
108
- gt .Expect (err ).NotTo (BeNil ())
109
- gt .Expect (err ).To (Equal (test .err ), "Expected error %v, got %v" , test .err , err )
110
- }
112
+ nodesToCleanup := make ([]client.Object , 0 , len (testCases ))
113
+ for _ , tc := range testCases {
114
+ g .Expect (env .Create (ctx , tc .node )).To (BeNil ())
115
+ nodesToCleanup = append (nodesToCleanup , tc .node )
116
+ }
117
+ defer func (do ... client.Object ) {
118
+ g .Expect (env .Cleanup (ctx , do ... )).To (Succeed ())
119
+ }(nodesToCleanup ... )
120
+
121
+ tracker , err := remote .NewClusterCacheTracker (
122
+ env .Manager , remote.ClusterCacheTrackerOptions {
123
+ Indexes : []remote.Index {
124
+ {
125
+ Object : & corev1.Node {},
126
+ Field : noderefutil .NodeProviderIDIndex ,
127
+ ExtractValue : noderefutil .IndexNodeByProviderID ,
128
+ },
129
+ },
130
+ },
131
+ )
132
+ g .Expect (err ).ToNot (HaveOccurred ())
133
+
134
+ r := & MachineReconciler {
135
+ Tracker : tracker ,
136
+ Client : env ,
137
+ }
138
+
139
+ w , err := ctrl .NewControllerManagedBy (env .Manager ).For (& corev1.Node {}).Build (r )
140
+ g .Expect (err ).ToNot (HaveOccurred ())
141
+
142
+ g .Expect (tracker .Watch (ctx , remote.WatchInput {
143
+ Name : "TestGetNode" ,
144
+ Cluster : util .ObjectKey (testCluster ),
145
+ Watcher : w ,
146
+ Kind : & corev1.Node {},
147
+ EventHandler : handler .EnqueueRequestsFromMapFunc (func (client.Object ) []reconcile.Request {
148
+ return nil
149
+ }),
150
+ })).To (Succeed ())
151
+
152
+ for _ , tc := range testCases {
153
+ t .Run (tc .name , func (t * testing.T ) {
154
+ g := NewWithT (t )
155
+ remoteClient , err := r .Tracker .GetClient (ctx , util .ObjectKey (testCluster ))
156
+ g .Expect (err ).ToNot (HaveOccurred ())
111
157
112
- if test .expected == nil && node == nil {
158
+ providerID , err := noderefutil .NewProviderID (tc .providerIDInput )
159
+ g .Expect (err ).ToNot (HaveOccurred ())
160
+
161
+ node , err := r .getNode (ctx , remoteClient , providerID )
162
+ if tc .error != nil {
163
+ g .Expect (err ).To (Equal (tc .error ))
113
164
return
114
165
}
115
-
116
- gt .Expect (node .Name ).To (Equal (test .expected .Name ), "Expected NodeRef's name to be %v, got %v" , node .Name , test .expected .Name )
117
- gt .Expect (node .Namespace ).To (Equal (test .expected .Namespace ), "Expected NodeRef's namespace to be %v, got %v" , node .Namespace , test .expected .Namespace )
166
+ g .Expect (err ).ToNot (HaveOccurred ())
167
+ g .Expect (node .Name ).To (Equal (tc .node .Name ))
118
168
})
119
169
}
120
170
}
0 commit comments