@@ -27,6 +27,7 @@ import (
27
27
"sort"
28
28
"strings"
29
29
"testing"
30
+ "text/template"
30
31
31
32
"github.com/lithammer/dedent"
32
33
"github.com/spf13/cobra"
@@ -45,13 +46,16 @@ const (
45
46
defaultNumberOfImages = 8
46
47
)
47
48
48
- // dummyKubernetesVersion is just used for unit testing, in order to not make
49
- // kubeadm lookup dl.k8s.io to resolve what the latest stable release is
50
- var dummyKubernetesVersion = constants .MinimumControlPlaneVersion .String ()
49
+ var (
50
+ // dummyKubernetesVersion and dummyKubernetesVersionStr are just used for unit testing, in order to not make
51
+ // kubeadm lookup dl.k8s.io to resolve what the latest stable release is
52
+ dummyKubernetesVersion = constants .MinimumControlPlaneVersion
53
+ dummyKubernetesVersionStr = dummyKubernetesVersion .String ()
54
+ )
51
55
52
56
func TestNewCmdConfigImagesList (t * testing.T ) {
53
57
var output bytes.Buffer
54
- mockK8sVersion := dummyKubernetesVersion
58
+ mockK8sVersion := dummyKubernetesVersionStr
55
59
images := NewCmdConfigImagesList (& output , & mockK8sVersion )
56
60
if err := images .RunE (nil , nil ); err != nil {
57
61
t .Fatalf ("Error from running the images command: %v" , err )
@@ -116,7 +120,7 @@ func TestImagesListRunWithCustomConfigPath(t *testing.T) {
116
120
}
117
121
118
122
i , err := NewImagesList (configFilePath , & kubeadmapiv1beta2.ClusterConfiguration {
119
- KubernetesVersion : dummyKubernetesVersion ,
123
+ KubernetesVersion : dummyKubernetesVersionStr ,
120
124
})
121
125
if err != nil {
122
126
t .Fatalf ("Failed getting the kubeadm images command: %v" , err )
@@ -149,7 +153,7 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
149
153
name : "empty config" ,
150
154
expectedImages : defaultNumberOfImages ,
151
155
cfg : kubeadmapiv1beta2.ClusterConfiguration {
152
- KubernetesVersion : dummyKubernetesVersion ,
156
+ KubernetesVersion : dummyKubernetesVersionStr ,
153
157
},
154
158
},
155
159
{
@@ -160,21 +164,21 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
160
164
Endpoints : []string {"https://some.etcd.com:2379" },
161
165
},
162
166
},
163
- KubernetesVersion : dummyKubernetesVersion ,
167
+ KubernetesVersion : dummyKubernetesVersionStr ,
164
168
},
165
169
expectedImages : defaultNumberOfImages - 1 ,
166
170
},
167
171
{
168
172
name : "coredns enabled" ,
169
173
cfg : kubeadmapiv1beta2.ClusterConfiguration {
170
- KubernetesVersion : dummyKubernetesVersion ,
174
+ KubernetesVersion : dummyKubernetesVersionStr ,
171
175
},
172
176
expectedImages : defaultNumberOfImages ,
173
177
},
174
178
{
175
179
name : "kube-dns enabled" ,
176
180
cfg : kubeadmapiv1beta2.ClusterConfiguration {
177
- KubernetesVersion : dummyKubernetesVersion ,
181
+ KubernetesVersion : dummyKubernetesVersionStr ,
178
182
DNS : kubeadmapiv1beta2.DNS {
179
183
Type : kubeadmapiv1beta2 .KubeDNS ,
180
184
},
@@ -210,6 +214,23 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
210
214
}
211
215
212
216
func TestConfigImagesListOutput (t * testing.T ) {
217
+
218
+ etcdVersion , ok := constants .SupportedEtcdVersion [uint8 (dummyKubernetesVersion .Minor ())]
219
+ if ! ok {
220
+ t .Fatalf ("cannot determine etcd version for Kubernetes version %s" , dummyKubernetesVersionStr )
221
+ }
222
+ versionMapping := struct {
223
+ EtcdVersion string
224
+ KubeVersion string
225
+ PauseVersion string
226
+ CoreDNSVersion string
227
+ }{
228
+ EtcdVersion : etcdVersion ,
229
+ KubeVersion : "v" + dummyKubernetesVersionStr ,
230
+ PauseVersion : constants .PauseVersion ,
231
+ CoreDNSVersion : constants .CoreDNSVersion ,
232
+ }
233
+
213
234
testcases := []struct {
214
235
name string
215
236
cfg kubeadmapiv1beta2.ClusterConfiguration
@@ -219,80 +240,80 @@ func TestConfigImagesListOutput(t *testing.T) {
219
240
{
220
241
name : "text output" ,
221
242
cfg : kubeadmapiv1beta2.ClusterConfiguration {
222
- KubernetesVersion : dummyKubernetesVersion ,
243
+ KubernetesVersion : dummyKubernetesVersionStr ,
223
244
},
224
245
outputFormat : "text" ,
225
- expectedOutput : `k8s.gcr.io/kube-apiserver:v1.16.0
226
- k8s.gcr.io/kube-controller-manager:v1.16.0
227
- k8s.gcr.io/kube-scheduler:v1.16.0
228
- k8s.gcr.io/kube-proxy:v1.16.0
229
- k8s.gcr.io/pause:3.2
230
- k8s.gcr.io/etcd:3.3.17-0
231
- k8s.gcr.io/coredns:1.6.5
246
+ expectedOutput : `k8s.gcr.io/kube-apiserver:{{.KubeVersion}}
247
+ k8s.gcr.io/kube-controller-manager:{{.KubeVersion}}
248
+ k8s.gcr.io/kube-scheduler:{{.KubeVersion}}
249
+ k8s.gcr.io/kube-proxy:{{.KubeVersion}}
250
+ k8s.gcr.io/pause:{{.PauseVersion}}
251
+ k8s.gcr.io/etcd:{{.EtcdVersion}}
252
+ k8s.gcr.io/coredns:{{.CoreDNSVersion}}
232
253
` ,
233
254
},
234
255
{
235
256
name : "JSON output" ,
236
257
cfg : kubeadmapiv1beta2.ClusterConfiguration {
237
- KubernetesVersion : dummyKubernetesVersion ,
258
+ KubernetesVersion : dummyKubernetesVersionStr ,
238
259
},
239
260
outputFormat : "json" ,
240
261
expectedOutput : `{
241
262
"kind": "Images",
242
263
"apiVersion": "output.kubeadm.k8s.io/v1alpha1",
243
264
"images": [
244
- "k8s.gcr.io/kube-apiserver:v1.16.0 ",
245
- "k8s.gcr.io/kube-controller-manager:v1.16.0 ",
246
- "k8s.gcr.io/kube-scheduler:v1.16.0 ",
247
- "k8s.gcr.io/kube-proxy:v1.16.0 ",
248
- "k8s.gcr.io/pause:3.2 ",
249
- "k8s.gcr.io/etcd:3.3.17-0 ",
250
- "k8s.gcr.io/coredns:1.6.5 "
265
+ "k8s.gcr.io/kube-apiserver:{{.KubeVersion}} ",
266
+ "k8s.gcr.io/kube-controller-manager:{{.KubeVersion}} ",
267
+ "k8s.gcr.io/kube-scheduler:{{.KubeVersion}} ",
268
+ "k8s.gcr.io/kube-proxy:{{.KubeVersion}} ",
269
+ "k8s.gcr.io/pause:{{.PauseVersion}} ",
270
+ "k8s.gcr.io/etcd:{{.EtcdVersion}} ",
271
+ "k8s.gcr.io/coredns:{{.CoreDNSVersion}} "
251
272
]
252
273
}
253
274
` ,
254
275
},
255
276
{
256
277
name : "YAML output" ,
257
278
cfg : kubeadmapiv1beta2.ClusterConfiguration {
258
- KubernetesVersion : dummyKubernetesVersion ,
279
+ KubernetesVersion : dummyKubernetesVersionStr ,
259
280
},
260
281
outputFormat : "yaml" ,
261
282
expectedOutput : `apiVersion: output.kubeadm.k8s.io/v1alpha1
262
283
images:
263
- - k8s.gcr.io/kube-apiserver:v1.16.0
264
- - k8s.gcr.io/kube-controller-manager:v1.16.0
265
- - k8s.gcr.io/kube-scheduler:v1.16.0
266
- - k8s.gcr.io/kube-proxy:v1.16.0
267
- - k8s.gcr.io/pause:3.2
268
- - k8s.gcr.io/etcd:3.3.17-0
269
- - k8s.gcr.io/coredns:1.6.5
284
+ - k8s.gcr.io/kube-apiserver:{{.KubeVersion}}
285
+ - k8s.gcr.io/kube-controller-manager:{{.KubeVersion}}
286
+ - k8s.gcr.io/kube-scheduler:{{.KubeVersion}}
287
+ - k8s.gcr.io/kube-proxy:{{.KubeVersion}}
288
+ - k8s.gcr.io/pause:{{.PauseVersion}}
289
+ - k8s.gcr.io/etcd:{{.EtcdVersion}}
290
+ - k8s.gcr.io/coredns:{{.CoreDNSVersion}}
270
291
kind: Images
271
292
` ,
272
293
},
273
294
{
274
295
name : "go-template output" ,
275
296
cfg : kubeadmapiv1beta2.ClusterConfiguration {
276
- KubernetesVersion : dummyKubernetesVersion ,
297
+ KubernetesVersion : dummyKubernetesVersionStr ,
277
298
},
278
299
outputFormat : `go-template={{range .images}}{{.}}{{"\n"}}{{end}}` ,
279
- expectedOutput : `k8s.gcr.io/kube-apiserver:v1.16.0
280
- k8s.gcr.io/kube-controller-manager:v1.16.0
281
- k8s.gcr.io/kube-scheduler:v1.16.0
282
- k8s.gcr.io/kube-proxy:v1.16.0
283
- k8s.gcr.io/pause:3.2
284
- k8s.gcr.io/etcd:3.3.17-0
285
- k8s.gcr.io/coredns:1.6.5
300
+ expectedOutput : `k8s.gcr.io/kube-apiserver:{{.KubeVersion}}
301
+ k8s.gcr.io/kube-controller-manager:{{.KubeVersion}}
302
+ k8s.gcr.io/kube-scheduler:{{.KubeVersion}}
303
+ k8s.gcr.io/kube-proxy:{{.KubeVersion}}
304
+ k8s.gcr.io/pause:{{.PauseVersion}}
305
+ k8s.gcr.io/etcd:{{.EtcdVersion}}
306
+ k8s.gcr.io/coredns:{{.CoreDNSVersion}}
286
307
` ,
287
308
},
288
309
{
289
310
name : "JSONPATH output" ,
290
311
cfg : kubeadmapiv1beta2.ClusterConfiguration {
291
- KubernetesVersion : dummyKubernetesVersion ,
312
+ KubernetesVersion : dummyKubernetesVersionStr ,
292
313
},
293
314
outputFormat : `jsonpath={range.images[*]}{@} {end}` ,
294
- expectedOutput : "k8s.gcr.io/kube-apiserver:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0 " +
295
- "k8s.gcr.io/kube-proxy:v1.16.0 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.3.17-0 k8s.gcr.io/coredns:1.6.5 " ,
315
+ expectedOutput : "k8s.gcr.io/kube-apiserver:{{.KubeVersion}} k8s.gcr.io/kube-controller-manager:{{.KubeVersion}} k8s.gcr.io/kube-scheduler:{{.KubeVersion}} " +
316
+ "k8s.gcr.io/kube-proxy:{{.KubeVersion}} k8s.gcr.io/pause:{{.PauseVersion}} k8s.gcr.io/etcd:{{.EtcdVersion}} k8s.gcr.io/coredns:{{.CoreDNSVersion}} " ,
296
317
},
297
318
}
298
319
@@ -309,13 +330,21 @@ k8s.gcr.io/coredns:1.6.5
309
330
t .Fatalf ("did not expect an error while creating the Images command: %v" , err )
310
331
}
311
332
312
- var output bytes.Buffer
333
+ var output , expectedOutput bytes.Buffer
313
334
314
335
if err = i .Run (& output , printer ); err != nil {
315
336
t .Fatalf ("did not expect an error running the Images command: %v" , err )
316
337
}
317
338
318
- if output .String () != tc .expectedOutput {
339
+ tmpl , err := template .New ("test" ).Parse (tc .expectedOutput )
340
+ if err != nil {
341
+ t .Fatalf ("could not create template: %v" , err )
342
+ }
343
+ if err = tmpl .Execute (& expectedOutput , versionMapping ); err != nil {
344
+ t .Fatalf ("could not execute template: %v" , err )
345
+ }
346
+
347
+ if output .String () != expectedOutput .String () {
319
348
t .Fatalf ("unexpected output:\n |%s|\n expected:\n |%s|\n " , output .String (), tc .expectedOutput )
320
349
}
321
350
})
0 commit comments