@@ -22,27 +22,28 @@ import (
22
22
"path/filepath"
23
23
"syscall"
24
24
25
- testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils"
26
-
27
25
"k8s.io/apimachinery/pkg/util/uuid"
26
+ apimachineryversion "k8s.io/apimachinery/pkg/util/version"
28
27
"k8s.io/klog"
28
+ testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils"
29
29
)
30
30
31
31
var (
32
32
// Kubernetes cluster flags
33
- teardownCluster = flag .Bool ("teardown-cluster" , true , "teardown the cluster after the e2e test" )
34
- teardownDriver = flag .Bool ("teardown-driver" , true , "teardown the driver after the e2e test" )
35
- bringupCluster = flag .Bool ("bringup-cluster" , true , "build kubernetes and bringup a cluster" )
36
- gceZone = flag .String ("gce-zone" , "" , "zone that the gce k8s cluster is created/found in" )
37
- gceRegion = flag .String ("gce-region" , "" , "region that gke regional cluster should be created in" )
38
- kubeVersion = flag .String ("kube-version" , "" , "version of Kubernetes to download and use for the cluster" )
39
- testVersion = flag .String ("test-version" , "" , "version of Kubernetes to download and use for tests" )
40
- kubeFeatureGates = flag .String ("kube-feature-gates" , "" , "feature gates to set on new kubernetes cluster" )
41
- localK8sDir = flag .String ("local-k8s-dir" , "" , "local prebuilt kubernetes/kubernetes directory to use for cluster and test binaries" )
42
- deploymentStrat = flag .String ("deployment-strategy" , "gce" , "choose between deploying on gce or gke" )
43
- gkeClusterVer = flag .String ("gke-cluster-version" , "" , "version of Kubernetes master and node for gke" )
44
- numNodes = flag .Int ("num-nodes" , - 1 , "the number of nodes in the test cluster" )
45
- imageType = flag .String ("image-type" , "cos" , "the image type to use for the cluster" )
33
+ teardownCluster = flag .Bool ("teardown-cluster" , true , "teardown the cluster after the e2e test" )
34
+ teardownDriver = flag .Bool ("teardown-driver" , true , "teardown the driver after the e2e test" )
35
+ bringupCluster = flag .Bool ("bringup-cluster" , true , "build kubernetes and bringup a cluster" )
36
+ gceZone = flag .String ("gce-zone" , "" , "zone that the gce k8s cluster is created/found in" )
37
+ gceRegion = flag .String ("gce-region" , "" , "region that gke regional cluster should be created in" )
38
+ kubeVersion = flag .String ("kube-version" , "" , "version of Kubernetes to download and use for the cluster" )
39
+ testVersion = flag .String ("test-version" , "" , "version of Kubernetes to download and use for tests" )
40
+ kubeFeatureGates = flag .String ("kube-feature-gates" , "" , "feature gates to set on new kubernetes cluster" )
41
+ localK8sDir = flag .String ("local-k8s-dir" , "" , "local prebuilt kubernetes/kubernetes directory to use for cluster and test binaries" )
42
+ deploymentStrat = flag .String ("deployment-strategy" , "gce" , "choose between deploying on gce or gke" )
43
+ gkeClusterVer = flag .String ("gke-cluster-version" , "" , "version of Kubernetes master and node for gke" )
44
+ numNodes = flag .Int ("num-nodes" , - 1 , "the number of nodes in the test cluster" )
45
+ imageType = flag .String ("image-type" , "cos" , "the image type to use for the cluster" )
46
+ gkeReleaseChannel = flag .String ("gke-release-channel" , "" , "GKE release channel to be used for cluster deploy. One of 'rapid', 'stable' or 'regular'" )
46
47
47
48
// Test infrastructure flags
48
49
boskosResourceType = flag .String ("boskos-resource-type" , "gce-project" , "name of the boskos resource type to reserve" )
@@ -51,10 +52,11 @@ var (
51
52
inProw = flag .Bool ("run-in-prow" , false , "is the test running in PROW" )
52
53
53
54
// Driver flags
54
- stagingImage = flag .String ("staging-image" , "" , "name of image to stage to" )
55
- saFile = flag .String ("service-account-file" , "" , "path of service account file" )
56
- deployOverlayName = flag .String ("deploy-overlay-name" , "" , "which kustomize overlay to deploy the driver with" )
57
- doDriverBuild = flag .Bool ("do-driver-build" , true , "building the driver from source" )
55
+ stagingImage = flag .String ("staging-image" , "" , "name of image to stage to" )
56
+ saFile = flag .String ("service-account-file" , "" , "path of service account file" )
57
+ deployOverlayName = flag .String ("deploy-overlay-name" , "" , "which kustomize overlay to deploy the driver with" )
58
+ doDriverBuild = flag .Bool ("do-driver-build" , true , "building the driver from source" )
59
+ useGKEManagedDriver = flag .Bool ("use-gke-managed-driver" , false , "use GKE managed PD CSI driver for the tests" )
58
60
59
61
// Test flags
60
62
migrationTest = flag .Bool ("migration-test" , false , "sets the flag on the e2e binary signalling migration" )
@@ -75,12 +77,23 @@ func init() {
75
77
func main () {
76
78
flag .Parse ()
77
79
78
- if ! * inProw {
80
+ if ! * inProw && ! * useGKEManagedDriver {
79
81
ensureVariable (stagingImage , true , "staging-image is a required flag, please specify the name of image to stage to" )
80
82
}
81
83
84
+ if * useGKEManagedDriver {
85
+ ensureVariableVal (deploymentStrat , "gke" , "deployment strategy must be GKE for using managed driver" )
86
+ ensureFlag (doDriverBuild , false , "'do-driver-build' must be false when using GKE managed driver" )
87
+ ensureFlag (teardownDriver , false , "'teardown-driver' must be false when using GKE managed driver" )
88
+ ensureVariable (stagingImage , false , "'staging-image' must not be set when using GKE managed driver" )
89
+ ensureVariable (deployOverlayName , false , "'deploy-overlay-name' must not be set when using GKE managed driver" )
90
+ }
91
+
82
92
ensureVariable (saFile , true , "service-account-file is a required flag" )
83
- ensureVariable (deployOverlayName , true , "deploy-overlay-name is a required flag" )
93
+ if ! * useGKEManagedDriver {
94
+ ensureVariable (deployOverlayName , true , "deploy-overlay-name is a required flag" )
95
+ }
96
+
84
97
ensureVariable (testFocus , true , "test-focus is a required flag" )
85
98
ensureVariable (imageType , true , "image type is a required flag. Available options include 'cos' and 'ubuntu'" )
86
99
@@ -103,7 +116,8 @@ func main() {
103
116
if * deploymentStrat == "gke" {
104
117
ensureFlag (migrationTest , false , "Cannot set deployment strategy to 'gke' for migration tests." )
105
118
ensureVariable (kubeVersion , false , "Cannot set kube-version when using deployment strategy 'gke'. Use gke-cluster-version." )
106
- ensureVariable (gkeClusterVer , true , "Must set gke-cluster-version when using deployment strategy 'gke'." )
119
+ ensureExactlyOneVariableSet ([]* string {gkeClusterVer , gkeReleaseChannel },
120
+ "For GKE cluster deployment, exactly one of 'gke-cluster-version' or 'gke-release-channel' must be set" )
107
121
ensureVariable (kubeFeatureGates , false , "Cannot set feature gates when using deployment strategy 'gke'." )
108
122
if len (* localK8sDir ) == 0 {
109
123
ensureVariable (testVersion , true , "Must set either test-version or local k8s dir when using deployment strategy 'gke'." )
@@ -243,7 +257,7 @@ func handle() error {
243
257
case "gce" :
244
258
err = clusterUpGCE (k8sDir , * gceZone , * numNodes , * imageType )
245
259
case "gke" :
246
- err = clusterUpGKE (* gceZone , * gceRegion , * numNodes , * imageType )
260
+ err = clusterUpGKE (* gceZone , * gceRegion , * numNodes , * imageType , * useGKEManagedDriver )
247
261
default :
248
262
err = fmt .Errorf ("deployment-strategy must be set to 'gce' or 'gke', but is: %s" , * deploymentStrat )
249
263
}
@@ -272,21 +286,24 @@ func handle() error {
272
286
}()
273
287
}
274
288
275
- // Install the driver and defer its teardown
276
- err := installDriver (goPath , pkgDir , * stagingImage , stagingVersion , * deployOverlayName , * doDriverBuild )
277
- if * teardownDriver {
278
- defer func () {
279
- // TODO (#140): collect driver logs
280
- if teardownErr := deleteDriver (goPath , pkgDir , * deployOverlayName ); teardownErr != nil {
281
- klog .Errorf ("failed to delete driver: %v" , teardownErr )
282
- }
283
- }()
284
- }
285
- if err != nil {
286
- return fmt .Errorf ("failed to install CSI Driver: %v" , err )
289
+ if ! * useGKEManagedDriver {
290
+ // Install the driver and defer its teardown
291
+ err := installDriver (goPath , pkgDir , * stagingImage , stagingVersion , * deployOverlayName , * doDriverBuild )
292
+ if * teardownDriver {
293
+ defer func () {
294
+ // TODO (#140): collect driver logs
295
+ if teardownErr := deleteDriver (goPath , pkgDir , * deployOverlayName ); teardownErr != nil {
296
+ klog .Errorf ("failed to delete driver: %v" , teardownErr )
297
+ }
298
+ }()
299
+ }
300
+ if err != nil {
301
+ return fmt .Errorf ("failed to install CSI Driver: %v" , err )
302
+ }
287
303
}
288
304
289
305
var cloudProviderArgs []string
306
+ var err error
290
307
switch * deploymentStrat {
291
308
case "gke" :
292
309
cloudProviderArgs , err = getGKEKubeTestArgs (* gceZone , * gceRegion , * imageType )
@@ -295,12 +312,22 @@ func handle() error {
295
312
}
296
313
}
297
314
298
- normalizedVersion , err := getNormalizedVersion (* kubeVersion , * gkeClusterVer )
299
- if err != nil {
300
- return fmt .Errorf ("failed to get cluster minor version: %v" , err )
315
+ // Kubernetes version of GKE deployments are expected to be of the pattern x.y.z-gke.k,
316
+ // hence we use the main.Version utils to parse and compare GKE managed cluster versions.
317
+ // For clusters deployed on GCE, use the apimachinery version utils (which supports non-gke based semantic versioning).
318
+ clusterVersion := mustGetKubeClusterVersion ()
319
+ fmt .Printf ("Kubernetes cluster version %q\n " , clusterVersion )
320
+ var testSkip string
321
+ switch * deploymentStrat {
322
+ case "gce" :
323
+ testSkip = generateGCETestSkip (clusterVersion )
324
+ case "gke" :
325
+ testSkip = generateGKETestSkip (clusterVersion , * useGKEManagedDriver )
326
+ default :
327
+ return fmt .Errorf ("Unknown deployment strategy %s" , * deploymentStrat )
301
328
}
302
329
303
- testSkip := generateTestSkip ( normalizedVersion )
330
+ fmt . Printf ( "Test skip string %s \n " , testSkip )
304
331
// Run the tests using the testDir kubernetes
305
332
if len (* storageClassFile ) != 0 {
306
333
err = runCSITests (pkgDir , testDir , * testFocus , testSkip , * storageClassFile , * snapshotClassFile , cloudProviderArgs , * deploymentStrat )
@@ -317,30 +344,37 @@ func handle() error {
317
344
return nil
318
345
}
319
346
320
- func generateTestSkip ( normalizedVersion string ) string {
347
+ func generateGCETestSkip ( clusterVersion string ) string {
321
348
skipString := "\\ [Disruptive\\ ]|\\ [Serial\\ ]"
322
- switch normalizedVersion {
323
- // Fall-through versioning since all test cases we want to skip in 1.15
324
- // should also be skipped in 1.14
325
- case "1.13" :
326
- fallthrough
327
- case "1.14" :
328
- fallthrough
329
- case "1.15" :
330
- fallthrough
331
- case "1.16" :
332
- // "volumeMode should not mount / map unused volumes in a pod" tests a
333
- // bug-fix introduced in 1.17
334
- // (https://github.com/kubernetes/kubernetes/pull/81163)
349
+ v := apimachineryversion .MustParseSemantic (clusterVersion )
350
+
351
+ // "volumeMode should not mount / map unused volumes in a pod" tests a
352
+ // (https://github.com/kubernetes/kubernetes/pull/81163)
353
+ if v .LessThan (apimachineryversion .MustParseSemantic ("1.16.0" )) {
335
354
skipString = skipString + "|volumeMode\\ sshould\\ snot\\ smount\\ s/\\ smap\\ sunused\\ svolumes\\ sin\\ sa\\ spod"
336
- // Skip Snapshot tests pre 1.17
337
- skipString = skipString + "|snapshot"
338
- fallthrough
339
- case "1.17" :
340
- case "latest" :
341
- case "master" :
342
- default :
343
355
}
356
+
357
+ if v .LessThan (apimachineryversion .MustParseSemantic ("1.17.0" )) {
358
+ skipString = skipString + "|VolumeSnapshotDataSource"
359
+ }
360
+ return skipString
361
+ }
362
+
363
+ func generateGKETestSkip (clusterVersion string , use_gke_managed_driver bool ) string {
364
+ skipString := "\\ [Disruptive\\ ]|\\ [Serial\\ ]"
365
+ curVer := mustParseVersion (clusterVersion )
366
+ if curVer .lessThan (mustParseVersion ("1.16.0" )) {
367
+ skipString = skipString + "|volumeMode\\ sshould\\ snot\\ smount\\ s/\\ smap\\ sunused\\ svolumes\\ sin\\ sa\\ spod"
368
+ }
369
+
370
+ // For GKE deployed PD CSI snapshot is enabled in 1.17.5-gke.9(and higher), 1.17.6-gke.4(and higher), 1.18.3(and higher).
371
+ if (use_gke_managed_driver && curVer .lessThan (mustParseVersion ("1.17.5-gke.9" ))) ||
372
+ (use_gke_managed_driver && curVer .major () == 1 && curVer .minor () == 17 && curVer .patch () == 6 && curVer .lessThan (mustParseVersion ("1.17.6-gke.4" ))) ||
373
+ (use_gke_managed_driver && curVer .major () == 1 && curVer .minor () == 18 && curVer .lessThan (mustParseVersion ("1.18.3-gke.0" ))) ||
374
+ (! use_gke_managed_driver && (* curVer ).lessThan (mustParseVersion ("1.17.0" ))) {
375
+ skipString = skipString + "|VolumeSnapshotDataSource"
376
+ }
377
+
344
378
return skipString
345
379
}
346
380
0 commit comments