Skip to content

Commit da333c5

Browse files
committed
Refactor GetGCSFuseVersion to bypass ginkgo framework assertions
1 parent e87f379 commit da333c5

7 files changed

Lines changed: 82 additions & 74 deletions

File tree

test/e2e/e2e_test.go

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"github.com/googlecloudplatform/gcs-fuse-csi-driver/pkg/cloud_provider/metadata"
3434
"github.com/onsi/ginkgo/v2"
3535
"github.com/onsi/gomega"
36+
3637
"k8s.io/client-go/tools/clientcmd"
3738
"k8s.io/klog/v2"
3839
"k8s.io/kubernetes/test/e2e/framework"
@@ -70,17 +71,6 @@ var _ = func() bool {
7071
klog.Fatalf("Failed to configure k8s client: %v", err)
7172
}
7273

73-
// klog.Info("Fetching GCSFuse version from cluster")
74-
// v := specs.GetGCSFuseVersion(context.Background(), c)
75-
// klog.Infof("Detected GCSFuse version: %v", v)
76-
77-
// klog.Info("Loading test config")
78-
// Load the integration test configurations before Ginkgo parses the test tree
79-
// if err := utils.LoadTestConfig(v); err != nil {
80-
// klog.Fatalf("Failed to load test_config.yaml for version %v: %v", v, err)
81-
// }
82-
// klog.Infof("Successfully loaded %d test packages from test_config.yaml", len(utils.LoadedTestPackages))
83-
8474
kubeConfig, err := clientcmd.LoadFromFile(framework.TestContext.KubeConfig)
8575
if err != nil {
8676
klog.Fatalf("Failed to load kube config: %v", err)
@@ -96,9 +86,38 @@ var _ = func() bool {
9686
if err != nil {
9787
klog.Fatalf("Failed to create fake meta data service: %v", err)
9888
}
89+
90+
testsuites.GCSFuseVersionStr = fetchGCSFuseVersion()
9991
return true
10092
}()
10193

94+
// fetchGCSFuseVersion initiates a minimal, standalone framework to query the cluster sidecar
95+
// during the init() phase. This enables dynamic test tree construction depending on the
96+
// version found in the remote cluster.
97+
func fetchGCSFuseVersion() string {
98+
config, err := framework.LoadConfig()
99+
if err != nil {
100+
klog.Fatalf("failed to load kube config for standalone version fetch: %v", err)
101+
}
102+
k8sClient, err := k8sclientset.NewForConfig(config)
103+
if err != nil {
104+
klog.Fatalf("failed to create client for standalone version fetch: %v", err)
105+
}
106+
107+
minimalFramework := &framework.Framework{
108+
ClientSet: k8sClient,
109+
Namespace: &corev1.Namespace{
110+
ObjectMeta: metav1.ObjectMeta{
111+
Name: "default",
112+
},
113+
},
114+
}
115+
ctx := context.Background()
116+
versionStr := specs.GetGCSFuseVersion(ctx, minimalFramework)
117+
klog.Infof("Fetched GCSFuse version globally: %s", versionStr)
118+
return versionStr
119+
}
120+
102121
func TestE2E(t *testing.T) {
103122
t.Parallel()
104123

@@ -146,25 +165,6 @@ var _ = ginkgo.Describe("E2E Test Suite", func() {
146165
suites = append(suites, testsuites.InitGcsFuseCSIProfilesTestSuite)
147166
}
148167

149-
suites = append(suites, []func() storageframework.TestSuite{
150-
testsuites.InitGcsFuseCSIVolumesTestSuite,
151-
testsuites.InitGcsFuseCSIFailedMountTestSuite,
152-
testsuites.InitGcsFuseCSIWorkloadsTestSuite,
153-
testsuites.InitGcsFuseCSIMultiVolumeTestSuite,
154-
testsuites.InitGcsFuseCSIGCSFuseIntegrationTestSuite,
155-
testsuites.InitGcsFuseCSIPerformanceTestSuite,
156-
testsuites.InitGcsFuseCSISubPathTestSuite,
157-
testsuites.InitGcsFuseCSIAutoTerminationTestSuite,
158-
testsuites.InitGcsFuseCSIFileCacheTestSuite,
159-
testsuites.InitGcsFuseCSIGCSFuseIntegrationFileCacheTestSuite,
160-
testsuites.InitGcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite,
161-
testsuites.InitGcsFuseCSIIstioTestSuite,
162-
testsuites.InitGcsFuseCSIMetricsTestSuite,
163-
testsuites.InitGcsFuseCSIMetadataPrefetchTestSuite,
164-
testsuites.InitGcsFuseMountTestSuite,
165-
testsuites.InitGcsFuseCSIOIDCTestSuite,
166-
}...)
167-
168168
if *kernelParamsFlag {
169169
suites = append(suites, testsuites.InitGcsFuseKernelParamsTestSuite)
170170
}

test/e2e/specs/specs.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,16 +1106,21 @@ func deployGCSFuseVersionFetcherPod(ctx context.Context, clientset clientset.Int
11061106
configMaps, err := clientset.CoreV1().ConfigMaps("").List(ctx, metav1.ListOptions{
11071107
FieldSelector: "metadata.name=gcsfusecsi-image-config",
11081108
})
1109-
framework.ExpectNoError(err)
1109+
if err != nil {
1110+
klog.Errorf("Expected no error when list configmaps, but found: %v", err)
1111+
return ""
1112+
}
11101113
if len(configMaps.Items) != 1 {
1111-
framework.Failf("expected one config map `gcsfusecsi-image-config` but found %d", len(configMaps.Items))
1114+
klog.Errorf("Expected 1 gcsfusecsi-image-config ConfigMap, found %d", len(configMaps.Items))
1115+
return ""
11121116
}
11131117

11141118
sidecarImageConfig := configMaps.Items[0]
11151119

11161120
image := sidecarImageConfig.Data["sidecar-image"]
11171121
if image == "" {
1118-
framework.Failf("expected data for key `sidecar-image` in the config map `gcsfusecsi-image-config`")
1122+
klog.Errorf("sidecar-image data is empty in configmap")
1123+
return ""
11191124
}
11201125

11211126
pod := &corev1.Pod{

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(ctx, f)
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")

test/e2e/testsuites/gcsfuse_integration.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const (
7070
gkeTempDir = "/gcsfuse-tmp"
7171
)
7272

73-
var gcsfuseVersionStr = ""
73+
var GCSFuseVersionStr = ""
7474

7575
const gcsfuseGoVersionLegacyCommand = `grep -o 'go[0-9]\+\.[0-9]\+\.[0-9]\+' ./gcsfuse/tools/cd_scripts/e2e_test.sh | cut -c3-`
7676
const gcsfuseCentralizedLocationGoVersionCommand = `cat ./gcsfuse/.go-version | tr -d '[:space:]'`
@@ -242,13 +242,15 @@ func (t *gcsFuseCSIGCSFuseIntegrationTestSuite) DefineTests(driver storageframew
242242
}
243243

244244
ginkgo.By("Checking GCSFuse version and skip test if needed")
245-
if gcsfuseVersionStr == "" {
246-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx)
245+
// Check if the GCSFuseVersion is already set, if not, we should set it.
246+
// This is for the case that we run this test suite individually.
247+
if GCSFuseVersionStr == "" {
248+
GCSFuseVersionStr = specs.GetGCSFuseVersion(ctx, f)
247249
}
248-
gcsfuseVersion := version.MustParseSemantic(gcsfuseVersionStr)
250+
gcsfuseVersion := version.MustParseSemantic(GCSFuseVersionStr)
249251

250-
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, gcsfuseVersionStr))
251-
gcsfuseTestBranch := skipTestOrProceedWithBranch(gcsfuseVersionStr, testName)
252+
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, GCSFuseVersionStr))
253+
gcsfuseTestBranch := skipTestOrProceedWithBranch(GCSFuseVersionStr, testName)
252254
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse branch %v", testName, gcsfuseTestBranch))
253255

254256
ginkgo.By("Configuring the test pod")
@@ -590,7 +592,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationTestSuite) DefineTests(driver storageframew
590592
init()
591593
defer cleanup()
592594

593-
v, err := version.ParseSemantic(gcsfuseVersionStr)
595+
v, err := version.ParseSemantic(GCSFuseVersionStr)
594596
// If error != nil, this means we've autogenerated a tag (meaning we run from HEAD)
595597
// Otherise, we have a valid tag, and we compare against the supported release.
596598
if (err != nil || v.AtLeast(version.MustParseSemantic("2.9.0-gke.0"))) && getClientProtocol(driver) != "grpc" {
@@ -610,7 +612,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationTestSuite) DefineTests(driver storageframew
610612
ginkgo.It(testNamePrefixSucceed+testNameLocalFile+testNameSuffix(1), func() {
611613
init()
612614
defer cleanup()
613-
v, err := version.ParseSemantic(gcsfuseVersionStr)
615+
v, err := version.ParseSemantic(GCSFuseVersionStr)
614616

615617
// If error != nil, this means we've autogenerated a tag (meaning we run from HEAD)
616618
// Otherise, we have a valid tag, and we compare against the supported release.
@@ -706,7 +708,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationTestSuite) DefineTests(driver storageframew
706708
init()
707709
defer cleanup()
708710

709-
v, err := version.ParseSemantic(gcsfuseVersionStr)
711+
v, err := version.ParseSemantic(GCSFuseVersionStr)
710712
// If error != nil, this means we've autogenerated a tag (meaning we run from HEAD)
711713
// Otherise, we have a valid tag, and we compare against the supported release.
712714
if err != nil || v.AtLeast(version.MustParseSemantic("2.7.0-gke.0")) {
@@ -722,7 +724,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationTestSuite) DefineTests(driver storageframew
722724
init()
723725
defer cleanup()
724726

725-
v, err := version.ParseSemantic(gcsfuseVersionStr)
727+
v, err := version.ParseSemantic(GCSFuseVersionStr)
726728
// If error != nil, this means we've autogenerated a tag (meaning we run from HEAD)
727729
// Otherise, we have a valid tag, and we compare against the supported release.
728730
if err != nil || v.AtLeast(version.MustParseSemantic("2.7.0-gke.0")) {

test/e2e/testsuites/gcsfuse_integration_file_cache.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheTestSuite) DefineTests(driver stor
112112

113113
gcsfuseIntegrationFileCacheTest := func(testName string, readOnly bool, fileCacheCapacity, fileCacheForRangeRead, metadataCacheTTLSeconds string, mountOptions ...string) {
114114
ginkgo.By("Checking GCSFuse version and skip test if needed")
115-
if gcsfuseVersionStr == "" {
116-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx)
115+
if GCSFuseVersionStr == "" {
116+
GCSFuseVersionStr = specs.GetGCSFuseVersion(ctx, f)
117117
}
118-
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, gcsfuseVersionStr))
119-
gcsfuseTestBranch := skipTestOrProceedWithBranch(gcsfuseVersionStr, testName)
118+
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, GCSFuseVersionStr))
119+
gcsfuseTestBranch := skipTestOrProceedWithBranch(GCSFuseVersionStr, testName)
120120
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse branch %v", testName, gcsfuseTestBranch))
121121

122122
ginkgo.By("Configuring the test pod")
@@ -134,7 +134,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheTestSuite) DefineTests(driver stor
134134

135135
tPod.SetupTmpVolumeMount("/tmp/gcsfuse_read_cache_test_logs")
136136
cacheDir := "cache-dir"
137-
gcsfuseVersion := version.MustParseSemantic(gcsfuseVersionStr)
137+
gcsfuseVersion := version.MustParseSemantic(GCSFuseVersionStr)
138138
if gcsfuseTestBranch == utils.MasterBranchName || gcsfuseVersion.AtLeast(version.MustParseSemantic("v2.4.1-gke.0")) {
139139
if hnsEnabled(driver) {
140140
cacheDir = "cache-dir-read-cache-hns-true"

test/e2e/testsuites/gcsfuse_integration_file_cache_parallel_downloads.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ import (
2626
"local/test/e2e/utils"
2727

2828
"github.com/onsi/ginkgo/v2"
29+
2930
utilerrors "k8s.io/apimachinery/pkg/util/errors"
3031
"k8s.io/apimachinery/pkg/util/version"
32+
"k8s.io/klog/v2"
3133
"k8s.io/kubernetes/test/e2e/framework"
3234
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
3335
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
@@ -112,11 +114,8 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
112114

113115
gcsfuseIntegrationFileCacheTest := func(testName string, readOnly bool, fileCacheCapacity, fileCacheForRangeRead, metadataCacheTTLSeconds string, mountOptions ...string) {
114116
ginkgo.By("Checking GCSFuse version and skip test if needed")
115-
if gcsfuseVersionStr == "" {
116-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx)
117-
}
118-
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, gcsfuseVersionStr))
119-
gcsfuseTestBranch := skipTestOrProceedWithBranch(gcsfuseVersionStr, testName)
117+
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, GCSFuseVersionStr))
118+
gcsfuseTestBranch := skipTestOrProceedWithBranch(GCSFuseVersionStr, testName)
120119
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse branch %v", testName, gcsfuseTestBranch))
121120

122121
ginkgo.By("Configuring the test pod")
@@ -134,7 +133,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
134133

135134
tPod.SetupTmpVolumeMount("/tmp/gcsfuse_read_cache_test_logs")
136135
cacheDir := "cache-dir"
137-
gcsfuseVersion := version.MustParseSemantic(gcsfuseVersionStr)
136+
gcsfuseVersion := version.MustParseSemantic(GCSFuseVersionStr)
138137
if gcsfuseTestBranch == utils.MasterBranchName || gcsfuseVersion.AtLeast(version.MustParseSemantic("v2.4.1-gke.0")) {
139138
if hnsEnabled(driver) {
140139
cacheDir = "cache-dir-read-cache-hns-true"
@@ -197,11 +196,8 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
197196
gcsfuseIntegrationFileCacheTestNew := func(testName string, config utils.ParsedConfig) {
198197

199198
ginkgo.By("Checking GCSFuse version and skip test if needed")
200-
if gcsfuseVersionStr == "" {
201-
gcsfuseVersionStr = specs.GetGCSFuseVersion(ctx, f)
202-
}
203-
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, gcsfuseVersionStr))
204-
gcsfuseTestBranch := skipTestOrProceedWithBranch(gcsfuseVersionStr, testName)
199+
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse version %v", testName, GCSFuseVersionStr))
200+
gcsfuseTestBranch := skipTestOrProceedWithBranch(GCSFuseVersionStr, testName)
205201
ginkgo.By(fmt.Sprintf("Running integration test %v with GCSFuse branch %v", testName, gcsfuseTestBranch))
206202

207203
ginkgo.By("Configuring the test pod")
@@ -218,7 +214,6 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
218214

219215
l.volumeResource.VolSource.CSI.VolumeAttributes["fileCacheCapacity"] = config.FileCacheCapacity
220216
tPod.SetupTmpVolumeMount(gkeTempDir)
221-
gcsfuseVersion := version.MustParseSemantic(gcsfuseVersionStr)
222217
framework.Logf("Cache file path: %v", config.CacheDir)
223218
tPod.SetupCacheVolumeMount(config.CacheDir, ".volumes/"+volumeName)
224219

@@ -257,6 +252,7 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
257252
tPod.VerifyExecInPodSucceed(f, specs.TesterContainerName, fmt.Sprintf("git clone --branch %v https://github.com/GoogleCloudPlatform/gcsfuse.git", gcsfuseTestBranch))
258253
tPod.VerifyExecInPodSucceed(f, specs.TesterContainerName, "ln -s /usr/bin/python3 /usr/bin/python")
259254

255+
gcsfuseVersion := version.MustParseSemantic(GCSFuseVersionStr)
260256
gcsfuseGoVersionCommand := getGoParsingCommand(*gcsfuseVersion, gcsfuseTestBranch)
261257

262258
commandArgs := []string{
@@ -475,9 +471,12 @@ func (t *gcsFuseCSIGCSFuseIntegrationFileCacheParallelDownloadsTestSuite) Define
475471
// The gcsfuse test_config.yaml is introduced from the gcsfuse v3.5+.
476472
// If the gcsfuse version is less than v3.5+, we will use the static tests.
477473
// We will remove the static tests in the future.
478-
if utils.IsReadFromTestConfig(gcsfuseVersionStr) {
479-
generateDynamicTests(gcsfuseVersionStr)
474+
475+
if utils.IsReadFromTestConfig(GCSFuseVersionStr) {
476+
klog.Info("Generating tests based on test config")
477+
generateDynamicTests(GCSFuseVersionStr)
480478
} else {
479+
klog.Info("Generating static tests")
481480
generateStaticTests()
482481
}
483482
}

test/e2e/utils/utils.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"strings"
2727
"time"
2828

29+
"github.com/onsi/ginkgo/v2"
2930
"k8s.io/apimachinery/pkg/util/version"
3031
"k8s.io/apimachinery/pkg/util/wait"
3132
"k8s.io/klog/v2"
@@ -75,9 +76,9 @@ func isVariableSet(v string) bool {
7576
}
7677

7778
func runCommand(action string, cmd *exec.Cmd) error {
78-
cmd.Stdout = os.Stdout
79+
cmd.Stdout = ginkgo.GinkgoWriter
7980
cmd.Stdin = os.Stdin
80-
cmd.Stderr = os.Stderr
81+
cmd.Stderr = ginkgo.GinkgoWriter
8182

8283
klog.Infof("%s", action)
8384
klog.Infof("cmd env=%v", cmd.Env)
@@ -278,11 +279,15 @@ func ParseConfigFlags(flagStr string) ParsedConfig {
278279
// Checks if the gcsfuse version supports test_config.yaml for integration tests.
279280
func IsReadFromTestConfig(gcsfuseVersionStr string) bool {
280281
if gcsfuseVersionStr == "" {
281-
// TODO: Remove this after implement the get gcsfuse version from the cluster during test tree init.
282+
return false
283+
}
284+
285+
v, branch := GCSFuseBranch(gcsfuseVersionStr)
286+
if branch == MasterBranchName {
282287
return true
283288
}
284-
gcsfuseVersion := version.MustParseSemantic(gcsfuseVersionStr)
285-
return gcsfuseVersion.AtLeast(version.MustParseSemantic(MinGCSFuseTestConfigVersion)) || gcsfuseVersionStr == MasterBranchName
289+
290+
return v.AtLeast(version.MustParseSemantic(MinGCSFuseTestConfigVersion))
286291
}
287292

288293
// Extracts the only-dir UUID from the mountOptions string.

0 commit comments

Comments
 (0)