@@ -22,27 +22,28 @@ import (
2222 "path/filepath"
2323 "syscall"
2424
25- testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils"
26-
2725 "k8s.io/apimachinery/pkg/util/uuid"
26+ apimachineryversion "k8s.io/apimachinery/pkg/util/version"
2827 "k8s.io/klog"
28+ testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils"
2929)
3030
3131var (
3232 // 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'" )
4647
4748 // Test infrastructure flags
4849 boskosResourceType = flag .String ("boskos-resource-type" , "gce-project" , "name of the boskos resource type to reserve" )
@@ -51,10 +52,11 @@ var (
5152 inProw = flag .Bool ("run-in-prow" , false , "is the test running in PROW" )
5253
5354 // 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" )
5860
5961 // Test flags
6062 migrationTest = flag .Bool ("migration-test" , false , "sets the flag on the e2e binary signalling migration" )
@@ -75,12 +77,23 @@ func init() {
7577func main () {
7678 flag .Parse ()
7779
78- if ! * inProw {
80+ if ! * inProw && ! * useGKEManagedDriver {
7981 ensureVariable (stagingImage , true , "staging-image is a required flag, please specify the name of image to stage to" )
8082 }
8183
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+
8292 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+
8497 ensureVariable (testFocus , true , "test-focus is a required flag" )
8598 ensureVariable (imageType , true , "image type is a required flag. Available options include 'cos' and 'ubuntu'" )
8699
@@ -103,7 +116,8 @@ func main() {
103116 if * deploymentStrat == "gke" {
104117 ensureFlag (migrationTest , false , "Cannot set deployment strategy to 'gke' for migration tests." )
105118 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" )
107121 ensureVariable (kubeFeatureGates , false , "Cannot set feature gates when using deployment strategy 'gke'." )
108122 if len (* localK8sDir ) == 0 {
109123 ensureVariable (testVersion , true , "Must set either test-version or local k8s dir when using deployment strategy 'gke'." )
@@ -243,7 +257,7 @@ func handle() error {
243257 case "gce" :
244258 err = clusterUpGCE (k8sDir , * gceZone , * numNodes , * imageType )
245259 case "gke" :
246- err = clusterUpGKE (* gceZone , * gceRegion , * numNodes , * imageType )
260+ err = clusterUpGKE (* gceZone , * gceRegion , * numNodes , * imageType , * useGKEManagedDriver )
247261 default :
248262 err = fmt .Errorf ("deployment-strategy must be set to 'gce' or 'gke', but is: %s" , * deploymentStrat )
249263 }
@@ -272,21 +286,24 @@ func handle() error {
272286 }()
273287 }
274288
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+ }
287303 }
288304
289305 var cloudProviderArgs []string
306+ var err error
290307 switch * deploymentStrat {
291308 case "gke" :
292309 cloudProviderArgs , err = getGKEKubeTestArgs (* gceZone , * gceRegion , * imageType )
@@ -295,12 +312,20 @@ func handle() error {
295312 }
296313 }
297314
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+ var testSkip string
320+ switch * deploymentStrat {
321+ case "gce" :
322+ testSkip = generateGCETestSkip (clusterVersion )
323+ case "gke" :
324+ testSkip = generateGKETestSkip (clusterVersion , * useGKEManagedDriver )
325+ default :
326+ return fmt .Errorf ("Unknown deployment strategy %s" , * deploymentStrat )
301327 }
302328
303- testSkip := generateTestSkip (normalizedVersion )
304329 // Run the tests using the testDir kubernetes
305330 if len (* storageClassFile ) != 0 {
306331 err = runCSITests (pkgDir , testDir , * testFocus , testSkip , * storageClassFile , * snapshotClassFile , cloudProviderArgs , * deploymentStrat )
@@ -317,30 +342,40 @@ func handle() error {
317342 return nil
318343}
319344
320- func generateTestSkip ( normalizedVersion string ) string {
345+ func generateGCETestSkip ( clusterVersion string ) string {
321346 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)
347+ v := apimachineryversion .MustParseSemantic (clusterVersion )
348+
349+ // "volumeMode should not mount / map unused volumes in a pod" tests a
350+ // (https://github.com/kubernetes/kubernetes/pull/81163)
351+ // bug-fix introduced in 1.16
352+ if v .LessThan (apimachineryversion .MustParseSemantic ("1.16.0" )) {
335353 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 :
343354 }
355+
356+ if v .LessThan (apimachineryversion .MustParseSemantic ("1.17.0" )) {
357+ skipString = skipString + "|VolumeSnapshotDataSource"
358+ }
359+ return skipString
360+ }
361+
362+ func generateGKETestSkip (clusterVersion string , use_gke_managed_driver bool ) string {
363+ skipString := "\\ [Disruptive\\ ]|\\ [Serial\\ ]"
364+ curVer := mustParseVersion (clusterVersion )
365+
366+ // "volumeMode should not mount / map unused volumes in a pod" tests a
367+ // (https://github.com/kubernetes/kubernetes/pull/81163)
368+ // bug-fix introduced in 1.16
369+ if curVer .lessThan (mustParseVersion ("1.16.0" )) {
370+ skipString = skipString + "|volumeMode\\ sshould\\ snot\\ smount\\ s/\\ smap\\ sunused\\ svolumes\\ sin\\ sa\\ spod"
371+ }
372+
373+ // For GKE deployed PD CSI snapshot is enabled in 1.17.6-gke.4(and higher), 1.18.3-gke.0(and higher).
374+ if (use_gke_managed_driver && curVer .lessThan (mustParseVersion ("1.17.6-gke.4" ))) ||
375+ (! use_gke_managed_driver && (* curVer ).lessThan (mustParseVersion ("1.17.0" ))) {
376+ skipString = skipString + "|VolumeSnapshotDataSource"
377+ }
378+
344379 return skipString
345380}
346381
0 commit comments