@@ -37,12 +37,12 @@ var (
37
37
teardownDriver = flag .Bool ("teardown-driver" , true , "teardown the driver after the e2e test" )
38
38
bringupCluster = flag .Bool ("bringup-cluster" , true , "build kubernetes and bringup a cluster" )
39
39
gceZone = flag .String ("gce-zone" , "" , "zone that the gce k8s cluster is created/found in" )
40
- kubeVersion = flag .String ("kube-version" , "master" , "version of Kubernetes to download and use" )
40
+ kubeVersion = flag .String ("kube-version" , "" , "version of Kubernetes to download and use for the cluster" )
41
+ testVersion = flag .String ("test-version" , "" , "version of Kubernetes to download and use for tests" )
41
42
kubeFeatureGates = flag .String ("kube-feature-gates" , "" , "feature gates to set on new kubernetes cluster" )
42
- localK8sDir = flag .String ("local-k8s-dir" , "" , "local kubernetes/kubernetes directory to run e2e tests from" )
43
- deploymentStrat = flag .String ("deployment-strategy" , "gce" , "choose between deploying on gce or gke" )
44
- gkeClusterVer = flag .String ("gke-cluster-version" , "latest" , "version of Kubernetes master and node for gke" )
45
-
43
+ localK8sDir = flag .String ("local-k8s-dir" , "" , "local prebuilt kubernetes/kubernetes directory to use for cluster and test binaries" )
44
+ deploymentStrat = flag .String ("deployment-strategy" , "" , "choose between deploying on gce or gke" )
45
+ gkeClusterVer = flag .String ("gke-cluster-version" , "" , "version of Kubernetes master and node for gke" )
46
46
// Test infrastructure flags
47
47
boskosResourceType = flag .String ("boskos-resource-type" , "gce-project" , "name of the boskos resource type to reserve" )
48
48
storageClassFile = flag .String ("storageclass-file" , "" , "name of storageclass yaml file to use for test relative to test/k8s-integration/config" )
@@ -68,6 +68,7 @@ const (
68
68
func init () {
69
69
flag .Set ("logtostderr" , "true" )
70
70
}
71
+
71
72
func main () {
72
73
flag .Parse ()
73
74
@@ -101,10 +102,14 @@ func main() {
101
102
ensureVariable (kubeVersion , false , "Cannot set kube-version when using deployment strategy 'gke'. Use gke-cluster-version." )
102
103
ensureVariable (gkeClusterVer , true , "Must set gke-cluster-version when using deployment strategy 'gke'." )
103
104
ensureVariable (kubeFeatureGates , false , "Cannot set feature gates when using deployment strategy 'gke'." )
105
+ if len (* localK8sDir ) == 0 {
106
+ ensureVariable (testVersion , true , "Must set either test-version or local k8s dir when using deployment strategy 'gke'." )
107
+ }
104
108
}
105
109
106
110
if len (* localK8sDir ) != 0 {
107
111
ensureVariable (kubeVersion , false , "Cannot set a kube version when using a local k8s dir." )
112
+ ensureVariable (testVersion , false , "Cannot set a test version when using a local k8s dir." )
108
113
}
109
114
}
110
115
@@ -118,11 +123,10 @@ func handle() error {
118
123
if ! ok {
119
124
return fmt .Errorf ("Could not find env variable GOPATH" )
120
125
}
126
+
121
127
pkgDir := filepath .Join (goPath , "src" , "sigs.k8s.io" , "gcp-compute-persistent-disk-csi-driver" )
122
- k8sParentDir := generateUniqueTmpDir ()
123
- k8sDir := filepath .Join (k8sParentDir , "kubernetes" )
124
- defer removeDir (k8sParentDir )
125
128
129
+ // If running in Prow, then acquire and set up a project through Boskos
126
130
if * inProw {
127
131
project , _ := testutils .SetupProwConfig (* boskosResourceType )
128
132
@@ -154,69 +158,77 @@ func handle() error {
154
158
}
155
159
}
156
160
161
+ // Build and push the driver, if required. Defer the driver image deletion.
157
162
if * doDriverBuild {
158
163
err := pushImage (pkgDir , * stagingImage , stagingVersion )
159
164
if err != nil {
160
165
return fmt .Errorf ("failed pushing image: %v" , err )
161
166
}
162
167
defer func () {
163
168
if * teardownCluster {
164
- err = deleteImage (* stagingImage , stagingVersion )
169
+ err : = deleteImage (* stagingImage , stagingVersion )
165
170
if err != nil {
166
171
klog .Errorf ("failed to delete image: %v" , err )
167
172
}
168
173
}
169
174
}()
170
175
}
171
176
172
- if * bringupCluster {
177
+ // Create temporary directories for kubernetes builds
178
+ k8sParentDir := generateUniqueTmpDir ()
179
+ k8sDir := filepath .Join (k8sParentDir , "kubernetes" )
180
+ testParentDir := generateUniqueTmpDir ()
181
+ testDir := filepath .Join (testParentDir , "kubernetes" )
182
+ defer removeDir (k8sParentDir )
183
+ defer removeDir (testParentDir )
184
+
185
+ // If kube version is set, then download and build Kubernetes for cluster creation
186
+ // Otherwise, either GKE or a prebuild local K8s dir is being used
187
+ if len (* kubeVersion ) != 0 {
173
188
err := downloadKubernetesSource (pkgDir , k8sParentDir , * kubeVersion )
174
189
if err != nil {
175
190
return fmt .Errorf ("failed to download Kubernetes source: %v" , err )
176
191
}
177
-
178
- err = buildKubernetes (k8sDir )
192
+ err = buildKubernetes (k8sDir , "quick-release" )
179
193
if err != nil {
180
194
return fmt .Errorf ("failed to build Kubernetes: %v" , err )
181
195
}
196
+ } else {
197
+ k8sDir = * localK8sDir
198
+ }
182
199
183
- kshPath := filepath .Join (k8sDir , "cluster" , "kubectl.sh" )
184
- _ , err = os .Stat (kshPath )
185
- if err == nil {
186
- // Set kubectl to the one bundled in the k8s tar for versioning
187
- err = os .Setenv ("GCE_PD_KUBECTL" , kshPath )
188
- if err != nil {
189
- return fmt .Errorf ("failed to set cluster specific kubectl: %v" , err )
190
- }
191
- } else {
192
- klog .Errorf ("could not find cluster kubectl at %s, falling back to default kubectl" , kshPath )
200
+ // If test version is set, then download and build Kubernetes to run K8s tests
201
+ // Otherwise, either kube version is set (which implies GCE) or a local K8s dir is being used
202
+ if len (* testVersion ) != 0 && * testVersion != * kubeVersion {
203
+ err := downloadKubernetesSource (pkgDir , testParentDir , * testVersion )
204
+ if err != nil {
205
+ return fmt .Errorf ("failed to download Kubernetes source: %v" , err )
193
206
}
194
-
195
- if len (* kubeFeatureGates ) != 0 {
196
- err = os .Setenv ("KUBE_FEATURE_GATES" , * kubeFeatureGates )
197
- if err != nil {
198
- return fmt .Errorf ("failed to set kubernetes feature gates: %v" , err )
199
- }
200
- klog .V (4 ).Infof ("Set Kubernetes feature gates: %v" , * kubeFeatureGates )
207
+ err = buildKubernetes (testDir , "WHAT=test/e2e/e2e.test" )
208
+ if err != nil {
209
+ return fmt .Errorf ("failed to build Kubernetes: %v" , err )
201
210
}
211
+ } else {
212
+ testDir = k8sDir
213
+ }
202
214
215
+ // Create a cluster either through GKE or GCE
216
+ if * bringupCluster {
217
+ var err error = nil
203
218
switch * deploymentStrat {
204
219
case "gce" :
205
220
err = clusterUpGCE (k8sDir , * gceZone )
206
- if err != nil {
207
- return fmt .Errorf ("failed to cluster up: %v" , err )
208
- }
209
221
case "gke" :
210
222
err = clusterUpGKE (* gceZone )
211
- if err != nil {
212
- return fmt .Errorf ("failed to cluster up: %v" , err )
213
- }
214
223
default :
215
- return fmt .Errorf ("deployment-strategy must be set to 'gce' or 'gke', but is: %s" , * deploymentStrat )
224
+ err = fmt .Errorf ("deployment-strategy must be set to 'gce' or 'gke', but is: %s" , * deploymentStrat )
225
+ }
226
+ if err != nil {
227
+ return fmt .Errorf ("failed to cluster up: %v" , err )
216
228
}
217
-
218
229
}
219
230
231
+ // Defer the tear down of the cluster through GKE or GCE
220
232
if * teardownCluster {
221
233
defer func () {
222
234
switch * deploymentStrat {
@@ -236,6 +248,7 @@ func handle() error {
236
248
}()
237
249
}
238
250
251
+ // Install the driver and defer its teardown
239
252
err := installDriver (goPath , pkgDir , * stagingImage , stagingVersion , * deployOverlayName , * doDriverBuild )
240
253
if * teardownDriver {
241
254
defer func () {
@@ -249,14 +262,11 @@ func handle() error {
249
262
return fmt .Errorf ("failed to install CSI Driver: %v" , err )
250
263
}
251
264
252
- if len (* localK8sDir ) != 0 {
253
- k8sDir = * localK8sDir
254
- }
255
-
265
+ // Run the tests using the testDir kubernetes
256
266
if len (* storageClassFile ) != 0 {
257
- err = runCSITests (pkgDir , k8sDir , * testFocus , * storageClassFile , * gceZone )
267
+ err = runCSITests (pkgDir , testDir , * testFocus , * storageClassFile , * gceZone )
258
268
} else if * migrationTest {
259
- err = runMigrationTests (pkgDir , k8sDir , * testFocus , * gceZone )
269
+ err = runMigrationTests (pkgDir , testDir , * testFocus , * gceZone )
260
270
} else {
261
271
return fmt .Errorf ("Did not run either CSI or Migration test" )
262
272
}
@@ -367,8 +377,8 @@ func clusterDownGKE(gceZone string) error {
367
377
return nil
368
378
}
369
379
370
- func buildKubernetes (k8sDir string ) error {
371
- cmd := exec .Command ("make" , "-C" , k8sDir , "quick-release" )
380
+ func buildKubernetes (k8sDir , command string ) error {
381
+ cmd := exec .Command ("make" , "-C" , k8sDir , command )
372
382
err := runCommand ("Building Kubernetes" , cmd )
373
383
if err != nil {
374
384
return fmt .Errorf ("failed to build Kubernetes: %v" , err )
@@ -377,7 +387,27 @@ func buildKubernetes(k8sDir string) error {
377
387
}
378
388
379
389
func clusterUpGCE (k8sDir , gceZone string ) error {
380
- err := os .Setenv ("KUBE_GCE_ZONE" , gceZone )
390
+ kshPath := filepath .Join (k8sDir , "cluster" , "kubectl.sh" )
391
+ _ , err := os .Stat (kshPath )
392
+ if err == nil {
393
+ // Set kubectl to the one bundled in the k8s tar for versioning
394
+ err = os .Setenv ("GCE_PD_KUBECTL" , kshPath )
395
+ if err != nil {
396
+ return fmt .Errorf ("failed to set cluster specific kubectl: %v" , err )
397
+ }
398
+ } else {
399
+ klog .Errorf ("could not find cluster kubectl at %s, falling back to default kubectl" , kshPath )
400
+ }
401
+
402
+ if len (* kubeFeatureGates ) != 0 {
403
+ err = os .Setenv ("KUBE_FEATURE_GATES" , * kubeFeatureGates )
404
+ if err != nil {
405
+ return fmt .Errorf ("failed to set kubernetes feature gates: %v" , err )
406
+ }
407
+ klog .V (4 ).Infof ("Set Kubernetes feature gates: %v" , * kubeFeatureGates )
408
+ }
409
+
410
+ err = os .Setenv ("KUBE_GCE_ZONE" , gceZone )
381
411
if err != nil {
382
412
return err
383
413
}
0 commit comments