Skip to content

Commit b42a3a9

Browse files
authored
Merge pull request #323 from hantaowang/separate-test-k8s
Separate test k8s
2 parents 0f9d43a + 430f291 commit b42a3a9

File tree

3 files changed

+114
-55
lines changed

3 files changed

+114
-55
lines changed

test/k8s-integration/main.go

+76-46
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ var (
3737
teardownDriver = flag.Bool("teardown-driver", true, "teardown the driver after the e2e test")
3838
bringupCluster = flag.Bool("bringup-cluster", true, "build kubernetes and bringup a cluster")
3939
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")
4142
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")
4646
// Test infrastructure flags
4747
boskosResourceType = flag.String("boskos-resource-type", "gce-project", "name of the boskos resource type to reserve")
4848
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 (
6868
func init() {
6969
flag.Set("logtostderr", "true")
7070
}
71+
7172
func main() {
7273
flag.Parse()
7374

@@ -101,10 +102,14 @@ func main() {
101102
ensureVariable(kubeVersion, false, "Cannot set kube-version when using deployment strategy 'gke'. Use gke-cluster-version.")
102103
ensureVariable(gkeClusterVer, true, "Must set gke-cluster-version when using deployment strategy 'gke'.")
103104
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+
}
104108
}
105109

106110
if len(*localK8sDir) != 0 {
107111
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.")
108113
}
109114
}
110115

@@ -118,11 +123,10 @@ func handle() error {
118123
if !ok {
119124
return fmt.Errorf("Could not find env variable GOPATH")
120125
}
126+
121127
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)
125128

129+
// If running in Prow, then acquire and set up a project through Boskos
126130
if *inProw {
127131
project, _ := testutils.SetupProwConfig(*boskosResourceType)
128132

@@ -154,69 +158,77 @@ func handle() error {
154158
}
155159
}
156160

161+
// Build and push the driver, if required. Defer the driver image deletion.
157162
if *doDriverBuild {
158163
err := pushImage(pkgDir, *stagingImage, stagingVersion)
159164
if err != nil {
160165
return fmt.Errorf("failed pushing image: %v", err)
161166
}
162167
defer func() {
163168
if *teardownCluster {
164-
err = deleteImage(*stagingImage, stagingVersion)
169+
err := deleteImage(*stagingImage, stagingVersion)
165170
if err != nil {
166171
klog.Errorf("failed to delete image: %v", err)
167172
}
168173
}
169174
}()
170175
}
171176

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 {
173188
err := downloadKubernetesSource(pkgDir, k8sParentDir, *kubeVersion)
174189
if err != nil {
175190
return fmt.Errorf("failed to download Kubernetes source: %v", err)
176191
}
177-
178-
err = buildKubernetes(k8sDir)
192+
err = buildKubernetes(k8sDir, "quick-release")
179193
if err != nil {
180194
return fmt.Errorf("failed to build Kubernetes: %v", err)
181195
}
196+
} else {
197+
k8sDir = *localK8sDir
198+
}
182199

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)
193206
}
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)
201210
}
211+
} else {
212+
testDir = k8sDir
213+
}
202214

215+
// Create a cluster either through GKE or GCE
216+
if *bringupCluster {
217+
var err error = nil
203218
switch *deploymentStrat {
204219
case "gce":
205220
err = clusterUpGCE(k8sDir, *gceZone)
206-
if err != nil {
207-
return fmt.Errorf("failed to cluster up: %v", err)
208-
}
209221
case "gke":
210222
err = clusterUpGKE(*gceZone)
211-
if err != nil {
212-
return fmt.Errorf("failed to cluster up: %v", err)
213-
}
214223
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)
216228
}
217-
218229
}
219230

231+
// Defer the tear down of the cluster through GKE or GCE
220232
if *teardownCluster {
221233
defer func() {
222234
switch *deploymentStrat {
@@ -236,6 +248,7 @@ func handle() error {
236248
}()
237249
}
238250

251+
// Install the driver and defer its teardown
239252
err := installDriver(goPath, pkgDir, *stagingImage, stagingVersion, *deployOverlayName, *doDriverBuild)
240253
if *teardownDriver {
241254
defer func() {
@@ -249,14 +262,11 @@ func handle() error {
249262
return fmt.Errorf("failed to install CSI Driver: %v", err)
250263
}
251264

252-
if len(*localK8sDir) != 0 {
253-
k8sDir = *localK8sDir
254-
}
255-
265+
// Run the tests using the testDir kubernetes
256266
if len(*storageClassFile) != 0 {
257-
err = runCSITests(pkgDir, k8sDir, *testFocus, *storageClassFile, *gceZone)
267+
err = runCSITests(pkgDir, testDir, *testFocus, *storageClassFile, *gceZone)
258268
} else if *migrationTest {
259-
err = runMigrationTests(pkgDir, k8sDir, *testFocus, *gceZone)
269+
err = runMigrationTests(pkgDir, testDir, *testFocus, *gceZone)
260270
} else {
261271
return fmt.Errorf("Did not run either CSI or Migration test")
262272
}
@@ -367,8 +377,8 @@ func clusterDownGKE(gceZone string) error {
367377
return nil
368378
}
369379

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)
372382
err := runCommand("Building Kubernetes", cmd)
373383
if err != nil {
374384
return fmt.Errorf("failed to build Kubernetes: %v", err)
@@ -377,7 +387,27 @@ func buildKubernetes(k8sDir string) error {
377387
}
378388

379389
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)
381411
if err != nil {
382412
return err
383413
}

test/run-k8s-integration-local.sh

+20-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ set -o nounset
44
set -o errexit
55

66
readonly PKGDIR=${GOPATH}/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver
7-
readonly deployment_strategy=${DEPLOYMENT_STRATEGY:-gce}
7+
readonly gke_cluster_version=${GKE_CLUSTER_VERSION:-latest}
8+
readonly kube_version=${KUBE_VERSION:-master}
9+
readonly test_version=${TEST_VERSION:-master}
810

911
source "${PKGDIR}/deploy/common.sh"
1012

@@ -13,15 +15,29 @@ ensure_var GCE_PD_SA_DIR
1315

1416
make -C ${PKGDIR} test-k8s-integration
1517

16-
# ${PKGDIR}/bin/k8s-integration-test --kube-version=master --run-in-prow=false \
18+
# This version of the command creates a GKE cluster. It also downloads and builds a k8s release
19+
# so that it can run the test specified
20+
21+
# ${PKGDIR}/bin/k8s-integration-test --run-in-prow=false \
1722
# --staging-image=${GCE_PD_CSI_STAGING_IMAGE} --service-account-file=${GCE_PD_SA_DIR}/cloud-sa.json \
1823
# --deploy-overlay-name=dev --storageclass-file=sc-standard.yaml \
1924
# --test-focus="External.Storage" --gce-zone="us-central1-b" \
20-
# --deployment-strategy=${deployment_strategy}
25+
# --deployment-strategy=gke --gke-cluster-version=${gke_cluster_version} \
26+
# --test-version=${test_version}
27+
28+
# This version of the command creates a GCE cluster. It downloads and builds two k8s releases,
29+
# one for the cluster and one for the tests, unless the cluster and test versioning is the same.
30+
31+
# ${PKGDIR}/bin/k8s-integration-test --run-in-prow=false \
32+
# --staging-image=${GCE_PD_CSI_STAGING_IMAGE} --service-account-file=${GCE_PD_SA_DIR}/cloud-sa.json \
33+
# --deploy-overlay-name=dev --storageclass-file=sc-standard.yaml \
34+
# --test-focus="External.Storage" --gce-zone="us-central1-b" \
35+
# --deployment-strategy=gce --kube-version=${kube_version} \
36+
# --test-version=${test_version}
2137

2238
# This version of the command does not build the driver or K8s, points to a
2339
# local K8s repo to get the e2e.test binary, and does not bring up or down the cluster
24-
#
40+
2541
${PKGDIR}/bin/k8s-integration-test --kube-version=master --run-in-prow=false \
2642
--staging-image=${GCE_PD_CSI_STAGING_IMAGE} --service-account-file=${GCE_PD_SA_DIR}/cloud-sa.json \
2743
--deploy-overlay-name=dev --bringup-cluster=false --teardown-cluster=false --local-k8s-dir=$KTOP \

test/run-k8s-integration.sh

+18-5
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,24 @@ readonly overlay_name="${GCE_PD_OVERLAY_NAME:-stable}"
1414
readonly boskos_resource_type="${GCE_PD_BOSKOS_RESOURCE_TYPE:-gce-project}"
1515
readonly do_driver_build="${GCE_PD_DO_DRIVER_BUILD:-true}"
1616
readonly deployment_strategy=${DEPLOYMENT_STRATEGY:-gce}
17+
readonly gke_cluster_version=${GKE_CLUSTER_VERSION:-latest}
18+
readonly kube_version=${GCE_PD_KUBE_VERSION:-master}
19+
readonly test_version=${TEST_VERSION:-master}
20+
1721
export GCE_PD_VERBOSITY=9
1822

1923
make -C ${PKGDIR} test-k8s-integration
20-
${PKGDIR}/bin/k8s-integration-test --kube-version=${GCE_PD_KUBE_VERSION:-master} \
21-
--run-in-prow=true --deploy-overlay-name=${overlay_name} --service-account-file=${E2E_GOOGLE_APPLICATION_CREDENTIALS} \
22-
--do-driver-build=${do_driver_build} --boskos-resource-type=${boskos_resource_type} \
23-
--storageclass-file=sc-standard.yaml --test-focus="External.Storage" --gce-zone="us-central1-b" \
24-
--deployment-strategy=${deployment_strategy}
24+
25+
base_cmd="${PKGDIR}/bin/k8s-integration-test \
26+
--run-in-prow=true --deploy-overlay-name=${overlay_name} --service-account-file=${E2E_GOOGLE_APPLICATION_CREDENTIALS} \
27+
--do-driver-build=${do_driver_build} --boskos-resource-type=${boskos_resource_type} \
28+
--storageclass-file=sc-standard.yaml --test-focus="External.Storage" --gce-zone="us-central1-b" \
29+
--deployment-strategy=${deployment_strategy} --test-version=${test_version}"
30+
31+
if [ "$deployment_strategy" = "gke" ]; then
32+
base_cmd="${base_cmd} --gke-cluster-version=${gke_cluster_version}"
33+
else
34+
base_cmd="${base_cmd} --kube-version=${kube_version}"
35+
fi
36+
37+
eval $base_cmd

0 commit comments

Comments
 (0)