tools/integration_tests/util/mounting/dynamic_mounting/dynamic_mounting.go (81 lines of code) (raw):
//Copyright 2023 Google LLC
//
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
package dynamic_mounting
import (
"context"
"fmt"
"log"
"path"
"testing"
"cloud.google.com/go/compute/metadata"
"cloud.google.com/go/storage"
client_util "github.com/googlecloudplatform/gcsfuse/v2/tools/integration_tests/util/client"
"github.com/googlecloudplatform/gcsfuse/v2/tools/integration_tests/util/mounting"
"github.com/googlecloudplatform/gcsfuse/v2/tools/integration_tests/util/setup"
)
const PrefixBucketForDynamicMountingTest = "gcsfuse-dynamic-mounting-test-"
func MountGcsfuseWithDynamicMounting(flags []string) (err error) {
defaultArg := []string{"--log-severity=trace",
"--log-file=" + setup.LogFile(),
setup.MntDir()}
for i := 0; i < len(defaultArg); i++ {
flags = append(flags, defaultArg[i])
}
err = mounting.MountGcsfuse(setup.BinFile(), flags)
return err
}
func runTestsOnGivenMountedTestBucket(bucketName string, flags [][]string, rootMntDir string, m *testing.M) (successCode int) {
for i := 0; i < len(flags); i++ {
if err := MountGcsfuseWithDynamicMounting(flags[i]); err != nil {
setup.LogAndExit(fmt.Sprintf("mountGcsfuse: %v\n", err))
}
// Changing mntDir to path of bucket mounted in mntDir for testing.
mntDirOfTestBucket := path.Join(setup.MntDir(), bucketName)
setup.SetMntDir(mntDirOfTestBucket)
log.Printf("Running dynamic mounting tests with flags: %s", flags[i])
// Running tests on flags.
successCode = setup.ExecuteTest(m)
// Currently mntDir is mntDir/bucketName.
// Unmounting can happen on rootMntDir. Changing mntDir to rootMntDir for unmounting.
setup.SetMntDir(rootMntDir)
setup.UnMountAndThrowErrorInFailure(flags[i], successCode)
if successCode != 0 {
return
}
}
return
}
func executeTestsForDynamicMounting(flags [][]string, createdBucket string, m *testing.M) (successCode int) {
rootMntDir := setup.MntDir()
// In dynamic mounting all the buckets mounted in mntDir which user has permission.
// mntDir - bucket1, bucket2, bucket3, ...
// We will test on passed testBucket and one created bucket.
// SetDynamicBucketMounted to the passed test bucket.
setup.SetDynamicBucketMounted(setup.TestBucket())
// Test on testBucket
successCode = runTestsOnGivenMountedTestBucket(setup.TestBucket(), flags, rootMntDir, m)
// Test on created bucket.
// SetDynamicBucketMounted to the mounted bucket.
setup.SetDynamicBucketMounted(createdBucket)
if successCode == 0 {
successCode = runTestsOnGivenMountedTestBucket(createdBucket, flags, rootMntDir, m)
}
// Reset SetDynamicBucketMounted to empty after tests are done.
setup.SetDynamicBucketMounted("")
// Setting back the original mntDir after testing.
setup.SetMntDir(rootMntDir)
return
}
func CreateTestBucketForDynamicMounting(ctx context.Context, client *storage.Client) (bucketName string, err error) {
projectID, err := metadata.ProjectIDWithContext(ctx)
if err != nil {
return "", fmt.Errorf("failed to get project ID of instance: %v", err)
}
// Create bucket handle and attributes
storageClassAndLocation := &storage.BucketAttrs{
Location: "us-west1",
}
bucketName = PrefixBucketForDynamicMountingTest + setup.GenerateRandomString(5)
bucket := client.Bucket(bucketName)
if err := bucket.Create(ctx, projectID, storageClassAndLocation); err != nil {
return "", fmt.Errorf("failed to create bucket: %v", err)
}
return
}
func RunTests(ctx context.Context, client *storage.Client, flags [][]string, m *testing.M) (successCode int) {
log.Println("Running dynamic mounting tests...")
createdBucket, err := CreateTestBucketForDynamicMounting(ctx, client)
if err != nil {
log.Fatalf("Failed to create bucket for dynamic mounting test: %v", err)
}
successCode = executeTestsForDynamicMounting(flags, createdBucket, m)
log.Printf("Test log: %s\n", setup.LogFile())
if err := client_util.DeleteBucket(ctx, client, createdBucket); err != nil {
log.Fatalf("Failed to delete the created bucket for dynamic mounting test: %s. Error: %v", createdBucket, err)
}
return successCode
}