@@ -26,6 +26,7 @@ import (
26
26
corev1 "k8s.io/api/core/v1"
27
27
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
28
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
29
+ "k8s.io/client-go/tools/record"
29
30
"k8s.io/utils/ptr"
30
31
ctrl "sigs.k8s.io/controller-runtime"
31
32
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -34,13 +35,167 @@ import (
34
35
"sigs.k8s.io/controller-runtime/pkg/reconcile"
35
36
36
37
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
38
+ "sigs.k8s.io/cluster-api/api/v1beta1/index"
37
39
"sigs.k8s.io/cluster-api/controllers/remote"
38
40
"sigs.k8s.io/cluster-api/internal/test/builder"
39
41
"sigs.k8s.io/cluster-api/internal/topology/ownerrefs"
40
42
"sigs.k8s.io/cluster-api/util"
41
43
"sigs.k8s.io/cluster-api/util/kubeconfig"
42
44
)
43
45
46
+ func TestReconcileNode (t * testing.T ) {
47
+ defaultMachine := clusterv1.Machine {
48
+ ObjectMeta : metav1.ObjectMeta {
49
+ Name : "machine-test" ,
50
+ Namespace : metav1 .NamespaceDefault ,
51
+ Labels : map [string ]string {
52
+ clusterv1 .ClusterNameLabel : "test-cluster" ,
53
+ },
54
+ },
55
+ Spec : clusterv1.MachineSpec {
56
+ ProviderID : ptr .To ("aws://us-east-1/test-node-1" ),
57
+ },
58
+ }
59
+
60
+ defaultCluster := & clusterv1.Cluster {
61
+ ObjectMeta : metav1.ObjectMeta {
62
+ Name : "test-cluster" ,
63
+ Namespace : metav1 .NamespaceDefault ,
64
+ },
65
+ }
66
+
67
+ testCases := []struct {
68
+ name string
69
+ machine * clusterv1.Machine
70
+ node * corev1.Node
71
+ nodeGetErr bool
72
+ expectResult ctrl.Result
73
+ expectError bool
74
+ expected func (g * WithT , m * clusterv1.Machine )
75
+ }{
76
+ {
77
+ name : "No op if provider ID is not set" ,
78
+ machine : & clusterv1.Machine {},
79
+ node : nil ,
80
+ nodeGetErr : false ,
81
+ expectResult : ctrl.Result {},
82
+ expectError : false ,
83
+ },
84
+ {
85
+ name : "err reading node (something different than not found), it should return error" ,
86
+ machine : defaultMachine .DeepCopy (),
87
+ node : nil ,
88
+ nodeGetErr : true ,
89
+ expectResult : ctrl.Result {},
90
+ expectError : true ,
91
+ },
92
+ {
93
+ name : "waiting for the node to exist, no op" ,
94
+ machine : defaultMachine .DeepCopy (),
95
+ node : nil ,
96
+ nodeGetErr : false ,
97
+ expectResult : ctrl.Result {},
98
+ expectError : false ,
99
+ },
100
+ {
101
+ name : "node found, should surface info" ,
102
+ machine : defaultMachine .DeepCopy (),
103
+ node : & corev1.Node {
104
+ ObjectMeta : metav1.ObjectMeta {
105
+ Name : "test-node-1" ,
106
+ },
107
+ Spec : corev1.NodeSpec {
108
+ ProviderID : "aws://us-east-1/test-node-1" ,
109
+ },
110
+ Status : corev1.NodeStatus {
111
+ NodeInfo : corev1.NodeSystemInfo {
112
+ MachineID : "foo" ,
113
+ },
114
+ Addresses : []corev1.NodeAddress {
115
+ {
116
+ Type : corev1 .NodeInternalIP ,
117
+ Address : "1.1.1.1" ,
118
+ },
119
+ {
120
+ Type : corev1 .NodeInternalIP ,
121
+ Address : "2.2.2.2" ,
122
+ },
123
+ },
124
+ },
125
+ },
126
+ nodeGetErr : false ,
127
+ expectResult : ctrl.Result {},
128
+ expectError : false ,
129
+ expected : func (g * WithT , m * clusterv1.Machine ) {
130
+ g .Expect (m .Status .NodeRef ).ToNot (BeNil ())
131
+ g .Expect (m .Status .NodeRef .Name ).To (Equal ("test-node-1" ))
132
+ g .Expect (m .Status .NodeInfo ).ToNot (BeNil ())
133
+ g .Expect (m .Status .NodeInfo .MachineID ).To (Equal ("foo" ))
134
+ },
135
+ },
136
+ {
137
+ name : "node not found when already seen, should error" ,
138
+ machine : & clusterv1.Machine {
139
+ ObjectMeta : metav1.ObjectMeta {
140
+ Name : "machine-test" ,
141
+ Namespace : metav1 .NamespaceDefault ,
142
+ Labels : map [string ]string {
143
+ clusterv1 .ClusterNameLabel : "test-cluster" ,
144
+ },
145
+ },
146
+ Spec : clusterv1.MachineSpec {
147
+ ProviderID : ptr .To ("aws://us-east-1/test-node-1" ),
148
+ },
149
+ Status : clusterv1.MachineStatus {
150
+ NodeRef : & corev1.ObjectReference {
151
+ Kind : "Node" ,
152
+ Name : "test-node-1" ,
153
+ APIVersion : "v1" ,
154
+ },
155
+ },
156
+ },
157
+ node : nil ,
158
+ nodeGetErr : false ,
159
+ expectResult : ctrl.Result {},
160
+ expectError : true ,
161
+ },
162
+ }
163
+
164
+ for _ , tc := range testCases {
165
+ t .Run (tc .name , func (t * testing.T ) {
166
+ g := NewWithT (t )
167
+
168
+ c := fake .NewClientBuilder ().WithObjects (tc .machine ).WithIndex (& corev1.Node {}, "spec.providerID" , index .NodeByProviderID ).Build ()
169
+ if tc .nodeGetErr {
170
+ c = fake .NewClientBuilder ().WithObjects (tc .machine ).Build () // No Index
171
+ }
172
+
173
+ if tc .node != nil {
174
+ g .Expect (c .Create (ctx , tc .node )).To (Succeed ())
175
+ defer func () { _ = c .Delete (ctx , tc .node ) }()
176
+ }
177
+
178
+ r := & Reconciler {
179
+ Tracker : remote .NewTestClusterCacheTracker (ctrl .Log , c , c , fakeScheme , client .ObjectKeyFromObject (defaultCluster )),
180
+ Client : c ,
181
+ recorder : record .NewFakeRecorder (10 ),
182
+ }
183
+ s := & scope {cluster : defaultCluster , machine : tc .machine }
184
+ result , err := r .reconcileNode (ctx , s )
185
+ g .Expect (result ).To (BeComparableTo (tc .expectResult ))
186
+ if tc .expectError {
187
+ g .Expect (err ).To (HaveOccurred ())
188
+ } else {
189
+ g .Expect (err ).ToNot (HaveOccurred ())
190
+ }
191
+
192
+ if tc .expected != nil {
193
+ tc .expected (g , tc .machine )
194
+ }
195
+ })
196
+ }
197
+ }
198
+
44
199
func TestGetNode (t * testing.T ) {
45
200
g := NewWithT (t )
46
201
0 commit comments