@@ -28,6 +28,7 @@ import (
28
28
apimachineryversion "k8s.io/apimachinery/pkg/util/version"
29
29
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
30
30
"k8s.io/klog/v2"
31
+ "k8s.io/utils/strings/slices"
31
32
testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils"
32
33
)
33
34
36
37
teardownCluster = flag .Bool ("teardown-cluster" , true , "teardown the cluster after the e2e test" )
37
38
teardownDriver = flag .Bool ("teardown-driver" , true , "teardown the driver after the e2e test" )
38
39
bringupCluster = flag .Bool ("bringup-cluster" , true , "build kubernetes and bringup a cluster" )
39
- platform = flag .String ("platform" , "linux" , "platform that the tests will be run, either linux or windows" )
40
+ platform = flag .String ("platform" , "linux" , "platform that the tests will be run on, either linux or windows" )
41
+ arch = flag .String ("arch" , "amd64" , "architecture that the tests will be run on (eg: amd64/arm64)" )
40
42
gceZone = flag .String ("gce-zone" , "" , "zone that the gce k8s cluster is created/found in" )
41
43
gceRegion = flag .String ("gce-region" , "" , "region that gke regional cluster should be created in" )
42
44
kubeVersion = flag .String ("kube-version" , "" , "version of Kubernetes to download and use for the cluster" )
65
67
saFile = flag .String ("service-account-file" , "" , "path of service account file" )
66
68
deployOverlayName = flag .String ("deploy-overlay-name" , "" , "which kustomize overlay to deploy the driver with" )
67
69
doDriverBuild = flag .Bool ("do-driver-build" , true , "building the driver from source" )
70
+ doK8sBuild = flag .Bool ("do-k8s-build" , true , "building the driver from source. If false, will fetch precompiled artifacts" )
68
71
useGKEManagedDriver = flag .Bool ("use-gke-managed-driver" , false , "use GKE managed PD CSI driver for the tests" )
69
72
70
73
// Test flags
73
76
74
77
useKubeTest2 = flag .Bool ("use-kubetest2" , false , "use kubetest2 to run e2e tests" )
75
78
parallel = flag .Int ("parallel" , 4 , "the number of parallel tests setting for ginkgo parallelism" )
79
+
80
+ allowedVersionTags = []string {"master" , "stable" , "latest" }
76
81
)
77
82
78
83
const (
@@ -191,12 +196,48 @@ func main() {
191
196
klog .Fatalf ("num-windows-nodes must be set if the platform is windows" )
192
197
}
193
198
199
+ if * kubeVersion == "master" && ! * doK8sBuild {
200
+ klog .Fatalf ("must set do-k8s-build=true when kubeVersion=%s" , * kubeVersion )
201
+ }
202
+
203
+ if len (* kubeVersion ) != 0 {
204
+ if ! slices .Contains (allowedVersionTags , * kubeVersion ) {
205
+ if _ , err := parseVersion (* kubeVersion ); err != nil {
206
+ klog .Fatalf ("invalid kube-version %s" , * kubeVersion )
207
+ }
208
+ }
209
+ }
210
+
211
+ if len (* testVersion ) != 0 {
212
+ if ! slices .Contains (allowedVersionTags , * testVersion ) {
213
+ if _ , err := parseVersion (* testVersion ); err != nil {
214
+ klog .Fatalf ("invalid test-version %s" , * testVersion )
215
+ }
216
+ }
217
+ }
218
+
194
219
err := handle ()
195
220
if err != nil {
196
221
klog .Fatalf ("Failed to run integration test: %w" , err )
197
222
}
198
223
}
199
224
225
+ func buildTestingBinaries (k8sDir string ) error {
226
+ if err := buildKubernetes (k8sDir , "WHAT=test/e2e/e2e.test" ); err != nil {
227
+ return fmt .Errorf ("failed to build Kubernetes e2e: %v" , err .Error ())
228
+ }
229
+
230
+ // kubetest relies on ginkgo and kubectl already built in the test k8s directory
231
+ if err := buildKubernetes (k8sDir , "ginkgo" ); err != nil {
232
+ return fmt .Errorf ("failed to build gingko: %v" , err .Error ())
233
+ }
234
+
235
+ if err := buildKubernetes (k8sDir , "kubectl" ); err != nil {
236
+ return fmt .Errorf ("failed to build kubectl: %v" , err .Error ())
237
+ }
238
+ return nil
239
+ }
240
+
200
241
func handle () error {
201
242
oldmask := syscall .Umask (0000 )
202
243
defer syscall .Umask (oldmask )
@@ -266,21 +307,32 @@ func handle() error {
266
307
}()
267
308
}
268
309
269
- // Create temporary directories for kubernetes builds
310
+ // Create temporary directories for kubernetes source/build artifacts
270
311
testParams .testParentDir = generateUniqueTmpDir ()
271
312
defer removeDir (testParams .testParentDir )
272
313
273
314
// If kube version is set, then download and build Kubernetes for cluster creation
274
315
// Otherwise, either GKE or a prebuild local K8s dir is being used
275
316
if len (* kubeVersion ) != 0 {
276
317
testParams .k8sSourceDir = filepath .Join (testParams .testParentDir , "kubernetes" )
277
- err := downloadKubernetesSource ( testParams . pkgDir , testParams . testParentDir , * kubeVersion )
278
- if err != nil {
318
+ klog . Infof ( "Downloading Kubernetes source from: %s" , * kubeVersion )
319
+ if err := downloadKubernetesSource ( testParams . k8sSourceDir , * kubeVersion ); err != nil {
279
320
return fmt .Errorf ("failed to download Kubernetes source: %v" , err .Error ())
280
321
}
281
- err = buildKubernetes (testParams .k8sSourceDir , "quick-release" )
282
- if err != nil {
283
- return fmt .Errorf ("failed to build Kubernetes: %v" , err .Error ())
322
+
323
+ if * doK8sBuild {
324
+ klog .Info ("Building Kubernetes source" )
325
+ if err := buildKubernetes (testParams .k8sSourceDir , "quick-release" ); err != nil {
326
+ return fmt .Errorf ("failed to build Kubernetes: %v" , err .Error ())
327
+ }
328
+ } else {
329
+ klog .Info ("Fetching precompiled Kubernetes artifacts for %s/%s" , * platform , * arch )
330
+ if err := downloadKubernetesRelease (testParams .k8sSourceDir , * kubeVersion , * platform , * arch ); err != nil {
331
+ return fmt .Errorf ("failed to download Kubernetes release: %v" , err .Error ())
332
+ }
333
+ if err := buildTestingBinaries (testParams .k8sSourceDir ); err != nil {
334
+ return err
335
+ }
284
336
}
285
337
} else {
286
338
testParams .k8sSourceDir = * localK8sDir
@@ -290,22 +342,13 @@ func handle() error {
290
342
// Otherwise, either kube version is set (which implies GCE) or a local K8s dir is being used.
291
343
if ! * useKubeTest2 && len (* testVersion ) != 0 && * testVersion != * kubeVersion {
292
344
testParams .k8sSourceDir = filepath .Join (testParams .testParentDir , "kubernetes" )
293
- err := downloadKubernetesSource ( testParams . pkgDir , testParams . testParentDir , * testVersion )
294
- if err != nil {
345
+ // Overlay the Kubernetes source
346
+ if err := downloadKubernetesSource ( testParams . k8sSourceDir , * testVersion ); err != nil {
295
347
return fmt .Errorf ("failed to download Kubernetes source: %v" , err .Error ())
296
348
}
297
- err = buildKubernetes (testParams .k8sSourceDir , "WHAT=test/e2e/e2e.test" )
298
- if err != nil {
299
- return fmt .Errorf ("failed to build Kubernetes e2e: %v" , err .Error ())
300
- }
301
- // kubetest relies on ginkgo and kubectl already built in the test k8s directory
302
- err = buildKubernetes (testParams .k8sSourceDir , "ginkgo" )
303
- if err != nil {
304
- return fmt .Errorf ("failed to build gingko: %v" , err .Error ())
305
- }
306
- err = buildKubernetes (testParams .k8sSourceDir , "kubectl" )
307
- if err != nil {
308
- return fmt .Errorf ("failed to build kubectl: %v" , err .Error ())
349
+ klog .Infof ("Building Kubernetes Testing binaries: %s" , * kubeVersion )
350
+ if err := buildTestingBinaries (testParams .k8sSourceDir ); err != nil {
351
+ return err
309
352
}
310
353
}
311
354
@@ -779,7 +822,17 @@ func runTestsWithConfig(testParams *testParameters, testConfigArg, reportPrefix
779
822
}
780
823
kubeTest2Args = append (kubeTest2Args , "--use-built-binaries" )
781
824
} else {
782
- kubeTest2Args = append (kubeTest2Args , fmt .Sprintf ("--test-package-marker=latest-%s.txt" , * testVersion ))
825
+ testResourceVersion := * testVersion
826
+ if * testVersion != "stable" && * testVersion != "latest" {
827
+ // Find the minor version
828
+ v , err := parseVersion (* testVersion )
829
+ if err != nil {
830
+ // Note, this shouldn't happen, as we check flags in main().
831
+ return fmt .Errorf ("failed to parse --test-version" )
832
+ }
833
+ testResourceVersion = fmt .Sprintf ("stable-%s" , v .minorVersion ())
834
+ }
835
+ kubeTest2Args = append (kubeTest2Args , fmt .Sprintf ("--test-package-marker=%s.txt" , testResourceVersion ))
783
836
}
784
837
}
785
838
kubeTest2Args = append (kubeTest2Args , fmt .Sprintf ("--focus-regex=%s" , focus ))
0 commit comments