Skip to content

Commit 6b674aa

Browse files
committed
Refactor parallel download testsuite for dynamic test generation
1 parent 29c9e25 commit 6b674aa

13 files changed

+806
-266
lines changed

test/e2e/e2e_test.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ limitations under the License.
1818
package main
1919

2020
import (
21-
"context"
2221
"flag"
2322
"fmt"
2423
"os"
@@ -33,6 +32,7 @@ import (
3332
"github.com/googlecloudplatform/gcs-fuse-csi-driver/pkg/cloud_provider/metadata"
3433
"github.com/onsi/ginkgo/v2"
3534
"github.com/onsi/gomega"
35+
3636
"k8s.io/client-go/tools/clientcmd"
3737
"k8s.io/klog/v2"
3838
"k8s.io/kubernetes/test/e2e/framework"
@@ -54,6 +54,7 @@ var (
5454

5555
var _ = func() bool {
5656
testing.Init()
57+
5758
if os.Getenv(clientcmd.RecommendedConfigPathEnvVar) == "" {
5859
kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
5960
os.Setenv(clientcmd.RecommendedConfigPathEnvVar, kubeconfig)
@@ -84,6 +85,8 @@ var _ = func() bool {
8485
if err != nil {
8586
klog.Fatalf("Failed to create fake meta data service: %v", err)
8687
}
88+
89+
testsuites.GCSFuseVersionStr = specs.GetGCSFuseVersion()
8790
return true
8891
}()
8992

@@ -102,13 +105,6 @@ func TestE2E(t *testing.T) {
102105
ginkgo.RunSpecs(t, "Cloud Storage FUSE CSI Driver", suiteConfig, reporterConfig)
103106
}
104107

105-
var _ = ginkgo.SynchronizedBeforeSuite(func(ctx context.Context) []byte {
106-
gcsfuseVersion := specs.GetGCSFuseVersion(ctx)
107-
return []byte(gcsfuseVersion)
108-
}, func(ctx context.Context, data []byte) {
109-
os.Setenv(specs.GcsfuseVersionVarName, string(data))
110-
})
111-
112108
var _ = ginkgo.Describe("E2E Test Suite", func() {
113109
GCSFuseCSITestSuites := func() []func() storageframework.TestSuite {
114110
suites := []func() storageframework.TestSuite{
@@ -156,6 +152,15 @@ var _ = ginkgo.Describe("E2E Test Suite", func() {
156152
testDriverHNS := specs.InitGCSFuseCSITestDriver(c, m, *bucketLocation, *skipGcpSaTest, true, *clientProtocol, *zbFlag)
157153

158154
ginkgo.Context(fmt.Sprintf("[Driver: %s HNS]", testDriverHNS.GetDriverInfo().Name), func() {
155+
// Skip HNS tests suites for ZB since enable ZB will automatically enable HNS
156+
// And the test cases in GCSFuseCSITestSuites already includes HNS tests
157+
if *zbFlag {
158+
ginkgo.It("should be skipped since ZB already enables HNS", func() {
159+
ginkgo.Skip("Skipping HNS tests suites for ZB since enable ZB will automatically enable HNS")
160+
})
161+
return
162+
}
163+
159164
storageframework.DefineTestSuites(testDriverHNS, GCSFuseCSITestSuitesHNS)
160165
})
161166
})

test/e2e/specs/specs.go

Lines changed: 6 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,8 @@ import (
3838
"k8s.io/apimachinery/pkg/fields"
3939
"k8s.io/apimachinery/pkg/util/version"
4040
"k8s.io/apimachinery/pkg/util/wait"
41-
"k8s.io/klog/v2"
4241

4342
clientset "k8s.io/client-go/kubernetes"
44-
"k8s.io/client-go/tools/clientcmd"
4543
"k8s.io/kubernetes/pkg/kubelet/events"
4644
"k8s.io/kubernetes/test/e2e/framework"
4745
e2eevents "k8s.io/kubernetes/test/e2e/framework/events"
@@ -120,8 +118,6 @@ const (
120118
driverDaemonsetLabel = "k8s-app=gcs-fuse-csi-driver"
121119

122120
IsOSSEnvVar = "IS_OSS"
123-
124-
GcsfuseVersionVarName = "gcsfuse-version"
125121
)
126122

127123
// Note to developers adding new testing methods - Please check the code path of newly added methods and ensure that those requiring
@@ -1080,107 +1076,14 @@ func (t *TestJob) Cleanup(ctx context.Context) {
10801076
framework.ExpectNoError(err)
10811077
}
10821078

1083-
func GetGCSFuseVersion(ctx context.Context) string {
1084-
config, err := clientcmd.BuildConfigFromFlags("", framework.TestContext.KubeConfig)
1085-
framework.ExpectNoError(err)
1086-
1087-
cs, err := clientset.NewForConfig(config)
1088-
framework.ExpectNoError(err)
1089-
1090-
versionData := os.Getenv(GcsfuseVersionVarName)
1091-
if versionData != "" {
1092-
return versionData
1093-
}
1094-
klog.Infof("GCSFuseVersion env var has not been set will retrieve it manually")
1095-
1096-
gcsfuseVersion, err := deployGCSFuseVersionFetcherPod(ctx, cs)
1097-
if err != nil {
1098-
klog.Errorf("Failed to deploy GCS Fuse version fetcher pod: %v", err)
1099-
framework.ExpectNoError(err)
1100-
}
1101-
1102-
return gcsfuseVersion
1103-
}
1104-
1105-
func deployGCSFuseVersionFetcherPod(ctx context.Context, clientset clientset.Interface) (string, error) {
1106-
configMaps, err := clientset.CoreV1().ConfigMaps("").List(ctx, metav1.ListOptions{
1107-
FieldSelector: "metadata.name=gcsfusecsi-image-config",
1108-
})
1109-
framework.ExpectNoError(err)
1110-
if len(configMaps.Items) != 1 {
1111-
framework.Failf("expected one config map `gcsfusecsi-image-config` but found %d", len(configMaps.Items))
1112-
}
1113-
1114-
sidecarImageConfig := configMaps.Items[0]
1115-
1116-
image := sidecarImageConfig.Data["sidecar-image"]
1117-
if image == "" {
1118-
framework.Failf("expected data for key `sidecar-image` in the config map `gcsfusecsi-image-config`")
1119-
}
1120-
1121-
pod := &corev1.Pod{
1122-
ObjectMeta: metav1.ObjectMeta{
1123-
GenerateName: "gcsfuse-version-fetcher-",
1124-
Namespace: utils.DefaultNamespace,
1125-
},
1126-
Spec: corev1.PodSpec{
1127-
TerminationGracePeriodSeconds: ptr.To(int64(0)),
1128-
Containers: []corev1.Container{
1129-
{
1130-
Name: webhook.GcsFuseSidecarName,
1131-
Image: image,
1132-
Command: []string{"/gcsfuse", "--version"},
1133-
},
1134-
{
1135-
Name: "sleeper",
1136-
Image: "busybox",
1137-
Command: []string{"sleep", "infinity"},
1138-
},
1139-
},
1140-
RestartPolicy: corev1.RestartPolicyNever,
1141-
Tolerations: []corev1.Toleration{
1142-
{Operator: corev1.TolerationOpExists},
1143-
},
1144-
},
1145-
}
1146-
1147-
createdPod, err := clientset.CoreV1().Pods(utils.DefaultNamespace).Create(ctx, pod, metav1.CreateOptions{})
1148-
if createdPod != nil {
1149-
defer clientset.CoreV1().Pods(utils.DefaultNamespace).Delete(context.Background(), createdPod.Name, metav1.DeleteOptions{})
1150-
}
1151-
framework.ExpectNoError(err,
1152-
"Pods.Create should succeed, but failed with error message: %v", err)
1153-
1154-
e2epod.WaitForPodRunningInNamespace(ctx, clientset, createdPod)
1155-
klog.Infof("Pod %s is running, waiting 60s before fetching GCSFuse version from logs", createdPod.Name)
1156-
time.Sleep(60 * time.Second)
1157-
1158-
var logs []byte
1159-
req := clientset.CoreV1().Pods(utils.DefaultNamespace).GetLogs(createdPod.Name, &corev1.PodLogOptions{Container: webhook.GcsFuseSidecarName})
1160-
err = wait.PollUntilContextTimeout(ctx, 30*time.Second, time.Minute*10, true, func(context.Context) (bool, error) {
1161-
logs, err = req.DoRaw(ctx)
1162-
if err != nil {
1163-
framework.Logf("failed to read pod logs, retrying: %v", err)
1164-
return false, nil
1165-
}
1166-
return true, nil
1167-
})
1168-
if err != nil {
1169-
return "", fmt.Errorf("failed to read pod logs: %w", err)
1170-
}
1171-
1172-
output := string(logs)
1173-
1174-
// Parse: "gcsfuse version 3.7.1-gke.0 ..."
1175-
l := strings.Split(strings.TrimSpace(output), " ")
1176-
if len(l) <= 2 {
1177-
return "", fmt.Errorf("unexpected version output format: %s", output)
1178-
}
1179-
return l[2], nil
1079+
// GetGCSFuseVersion returns the GCSFuse version to be tested.
1080+
// The env var is set by the handler.go before running the tests.
1081+
func GetGCSFuseVersion() string {
1082+
return os.Getenv(utils.GcsfuseVersionVarName)
11801083
}
11811084

1182-
func GCSFuseVersionAndBranch(ctx context.Context) (*version.Version, string) {
1183-
vStr := GetGCSFuseVersion(ctx)
1085+
func GCSFuseVersionAndBranch() (*version.Version, string) {
1086+
vStr := GetGCSFuseVersion()
11841087
v, branch := utils.GCSFuseBranch(vStr)
11851088
if v == nil {
11861089
// This happens for master branch builds. We still need to parse the version.

test/e2e/specs/testdriver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ func (n *GCSFuseCSITestDriver) CreateVolume(ctx context.Context, config *storage
248248
mountOptions += ",client-protocol=grpc"
249249
}
250250
if n.gcsfuseVersion == nil || n.gcsfuseBranch == "" {
251-
n.gcsfuseVersion, n.gcsfuseBranch = GCSFuseVersionAndBranch(ctx)
251+
n.gcsfuseVersion, n.gcsfuseBranch = GCSFuseVersionAndBranch()
252252
}
253253
kernelParamsSupported := n.gcsfuseBranch == utils.MasterBranchName || n.gcsfuseVersion.AtLeast(version.MustParseSemantic(utils.MinGCSFuseKernelParamsVersion))
254254

test/e2e/testsuites/failed_mount.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,7 @@ func (t *gcsFuseCSIFailedMountTestSuite) DefineTests(driver storageframework.Tes
153153
} else {
154154
tPod.WaitForFailedMountError(ctx, codes.NotFound.String())
155155
}
156-
if gcsfuseVersionStr == "" {
157-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx)
158-
}
159-
v, err := version.ParseSemantic(gcsfuseVersionStr)
156+
v, err := version.ParseSemantic(GCSFuseVersionStr)
160157
if configPrefix == specs.SkipCSIBucketAccessCheckAndFakeVolumePrefix && (err != nil || v.AtLeast(version.MustParseSemantic("v2.5.0-gke.0"))) {
161158
tPod.WaitForLog(ctx, webhook.GcsFuseSidecarName, "bucket does not exist")
162159
} else {
@@ -198,10 +195,10 @@ func (t *gcsFuseCSIFailedMountTestSuite) DefineTests(driver storageframework.Tes
198195

199196
ginkgo.By("Checking that the pod has failed mount error")
200197

201-
if gcsfuseVersionStr == "" {
202-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx)
198+
if GCSFuseVersionStr == "" {
199+
GCSFuseVersionStr = specs.GetGCSFuseVersion()
203200
}
204-
v, err := version.ParseSemantic(gcsfuseVersionStr)
201+
v, err := version.ParseSemantic(GCSFuseVersionStr)
205202
if configPrefix == specs.SkipCSIBucketAccessCheckAndInvalidVolumePrefix && (err != nil || v.AtLeast(version.MustParseSemantic("v2.9.0-gke.0"))) {
206203
if enableSidecarBucketAccessCheck {
207204
tPod.WaitForFailedContainerError(ctx, "Error: failed to reserve container name")

0 commit comments

Comments
 (0)