Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 39 additions & 13 deletions tools/integration_tests/managed_folders/admin_permissions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,34 +54,26 @@ type managedFoldersAdminPermission struct {
func (s *managedFoldersAdminPermission) SetupSuite() {
setup.MountGCSFuseWithGivenMountWithConfigFunc(testEnv.cfg, s.flags, testEnv.mountFunc)
setup.SetMntDir(testEnv.mountDir)
testEnv.testDirPath = setup.SetupTestDirectory(TestDirForManagedFolderTest)
}

func (s *managedFoldersAdminPermission) TearDownSuite() {
setup.UnmountGCSFuseWithConfig(testEnv.cfg)
}

func (s *managedFoldersAdminPermission) SetupTest() {
testEnv.testDirPath = setup.SetupTestDirectory(TestDirForManagedFolderTest)
createDirectoryStructureForNonEmptyManagedFolders(testEnv.ctx, testEnv.storageClient, testEnv.controlClient, s.T())
if s.managedFoldersPermission != "nil" {
managedFolderRecreated := createDirectoryStructureForNonEmptyManagedFolders(testEnv.ctx, testEnv.storageClient, testEnv.controlClient, s.T())

if s.managedFoldersPermission != "nil" && managedFolderRecreated {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could reduce nesting by using short-return.

providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, s.managedFoldersPermission, s.T())
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, s.managedFoldersPermission, s.T())
// Waiting for 60 seconds for policy changes to propagate. This values we kept based on our experiments.
// Wait for policy propagation only when folders were recreated and IAM was reapplied.
time.Sleep(60 * time.Second)
}
}

func (s *managedFoldersAdminPermission) TearDownTest() {
setup.SaveGCSFuseLogFileInCaseOfFailure(s.T())
// Due to bucket view permissions, it prevents cleaning resources outside managed folders. So we are cleaning managed folders resources only.
if s.bucketPermission == ViewPermission {
revokePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, s.managedFoldersPermission, s.T())
setup.CleanUpDir(path.Join(setup.MntDir(), TestDirForManagedFolderTest, ManagedFolder1))
revokePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, s.managedFoldersPermission, s.T())
setup.CleanUpDir(path.Join(setup.MntDir(), TestDirForManagedFolderTest, ManagedFolder2))
return
}
setup.CleanUpDir(path.Join(setup.MntDir(), TestDirForManagedFolderTest))
}
Comment thread
raj-prince marked this conversation as resolved.

////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -128,6 +120,11 @@ func (s *managedFoldersAdminPermission) TestCopyObjectWithInManagedFolder() {
testDirPath := path.Join(testEnv.testDirPath, ManagedFolder1)
srcCopyFile := path.Join(testDirPath, FileInNonEmptyManagedFoldersTest)
destCopyFile := path.Join(testDirPath, DestFile)
defer func() {
if err := os.RemoveAll(destCopyFile); err != nil {
log.Printf("failed to remove scratch copy file: %v", err)
}
}()

err := operations.CopyFile(srcCopyFile, destCopyFile)
if err != nil {
Expand All @@ -143,6 +140,11 @@ func (s *managedFoldersAdminPermission) TestCopyObjectWithInManagedFolder() {
func (s *managedFoldersAdminPermission) TestCopyManagedFolder() {
srcDirPath := path.Join(testEnv.testDirPath, ManagedFolder1)
destDirPath := path.Join(testEnv.testDirPath, DestFolder)
defer func() {
if err := os.RemoveAll(destDirPath); err != nil {
log.Printf("failed to remove scratch copy folder: %v", err)
}
}()

err := operations.CopyDir(srcDirPath, destDirPath)

Expand All @@ -160,6 +162,11 @@ func (s *managedFoldersAdminPermission) TestMoveObjectWithInManagedFolder() {
testDirPath := path.Join(testEnv.testDirPath, ManagedFolder1)
srcMoveFile := path.Join(testDirPath, FileInNonEmptyManagedFoldersTest)
destMoveFile := path.Join(testDirPath, DestFile)
defer func() {
if err := os.RemoveAll(destMoveFile); err != nil {
log.Printf("failed to remove scratch move file: %v", err)
}
}()

err := operations.Move(srcMoveFile, destMoveFile)
if err != nil {
Expand All @@ -179,6 +186,11 @@ func (s *managedFoldersAdminPermission) TestMoveObjectWithInManagedFolder() {
func (s *managedFoldersAdminPermission) TestMoveManagedFolder() {
srcDirPath := path.Join(testEnv.testDirPath, ManagedFolder1)
destDirPath := path.Join(testEnv.testDirPath, DestFolder)
defer func() {
if err := os.RemoveAll(destDirPath); err != nil {
log.Printf("failed to remove scratch move folder: %v", err)
}
}()

err := operations.Move(srcDirPath, destDirPath)

Expand Down Expand Up @@ -223,7 +235,21 @@ func TestManagedFolders_FolderAdminPermission(t *testing.T) {
creds_tests.ApplyPermissionToServiceAccount(testEnv.ctx, testEnv.storageClient, testEnv.serviceAccount, ViewPermission, setup.TestBucket())
}
ts.managedFoldersPermission = permissions[i][1]

if ts.managedFoldersPermission != "nil" {
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, ts.managedFoldersPermission, t)
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, ts.managedFoldersPermission, t)
// Wait once per permission scenario for initial policy propagation.
time.Sleep(60 * time.Second)
}
Comment on lines +239 to +244

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The IAM policy configuration here is fragile because it assumes the managed folders already exist in the bucket. If the first scenario ("nil") is skipped, or if the order of scenarios is changed, providePermissionToManagedFolder will fail because the managed folders have not been created yet. Pre-creating the managed folders before setting their IAM policies makes the test suite robust and independent of scenario ordering.

Suggested change
if ts.managedFoldersPermission != "nil" {
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, ts.managedFoldersPermission, t)
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, ts.managedFoldersPermission, t)
// Wait once per permission scenario for initial policy propagation.
time.Sleep(60 * time.Second)
}
if ts.managedFoldersPermission != "nil" {
_ = client.CreateManagedFoldersInBucket(testEnv.ctx, testEnv.controlClient, path.Join(testEnv.testDir, ManagedFolder1), testEnv.bucket)
_ = client.CreateManagedFoldersInBucket(testEnv.ctx, testEnv.controlClient, path.Join(testEnv.testDir, ManagedFolder2), testEnv.bucket)
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, ts.managedFoldersPermission, t)
providePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, ts.managedFoldersPermission, t)
// Wait once per permission scenario for initial policy propagation.
time.Sleep(60 * time.Second)
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SetupTest creates the folder if not already exist, applies the iam permission and wait for propagation.


suite.Run(t, ts)

if ts.managedFoldersPermission != "nil" {
revokePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder1), testEnv.serviceAccount, ts.managedFoldersPermission, t)
revokePermissionToManagedFolder(testEnv.bucket, path.Join(testEnv.testDir, ManagedFolder2), testEnv.serviceAccount, ts.managedFoldersPermission, t)
}

if ts.bucketPermission == ViewPermission {
creds_tests.RevokePermission(testEnv.ctx, testEnv.storageClient, testEnv.serviceAccount, ViewPermission, setup.TestBucket())
}
Expand Down
8 changes: 5 additions & 3 deletions tools/integration_tests/managed_folders/test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func revokePermissionToManagedFolder(bucket, managedFolderPath, serviceAccount,
}
}

func createDirectoryStructureForNonEmptyManagedFolders(ctx context.Context, storageClient *storage.Client, controlClient *control.StorageControlClient, t *testing.T) {
func createDirectoryStructureForNonEmptyManagedFolders(ctx context.Context, storageClient *storage.Client, controlClient *control.StorageControlClient, t *testing.T) bool {
// testBucket/NonEmptyManagedFoldersTest/managedFolder1
// testBucket/NonEmptyManagedFoldersTest/managedFolder1/testFile
// testBucket/NonEmptyManagedFoldersTest/managedFolder2
Expand All @@ -122,12 +122,14 @@ func createDirectoryStructureForNonEmptyManagedFolders(ctx context.Context, stor
managedFolder2 := path.Join(testDir, ManagedFolder2)
simulatedFolderNonEmptyManagedFoldersTest := path.Join(testDir, SimulatedFolderNonEmptyManagedFoldersTest)

client.CreateManagedFoldersInBucket(ctx, controlClient, path.Join(testDir, ManagedFolder1), bucket)
managedFolder1Recreated := client.CreateManagedFoldersInBucket(ctx, controlClient, path.Join(testDir, ManagedFolder1), bucket)
client.CopyFileInBucket(ctx, storageClient, path.Join("/tmp", FileInNonEmptyManagedFoldersTest), path.Join(managedFolder1, FileInNonEmptyManagedFoldersTest), bucket)
client.CreateManagedFoldersInBucket(ctx, controlClient, path.Join(testDir, ManagedFolder2), bucket)
managedFolder2Recreated := client.CreateManagedFoldersInBucket(ctx, controlClient, path.Join(testDir, ManagedFolder2), bucket)
client.CopyFileInBucket(ctx, storageClient, path.Join("/tmp", FileInNonEmptyManagedFoldersTest), path.Join(managedFolder2, FileInNonEmptyManagedFoldersTest), bucket)
client.CopyFileInBucket(ctx, storageClient, path.Join("/tmp", FileInNonEmptyManagedFoldersTest), path.Join(simulatedFolderNonEmptyManagedFoldersTest, FileInNonEmptyManagedFoldersTest), bucket)
client.CopyFileInBucket(ctx, storageClient, path.Join("/tmp", FileInNonEmptyManagedFoldersTest), path.Join(testDir, FileInNonEmptyManagedFoldersTest), bucket)

return managedFolder1Recreated || managedFolder2Recreated
}

func cleanup(ctx context.Context, storageClient *storage.Client, controlClient *control.StorageControlClient, bucket, testDir, serviceAccount, iam_role string, t *testing.T) {
Expand Down
9 changes: 7 additions & 2 deletions tools/integration_tests/util/client/control_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"github.com/googlecloudplatform/gcsfuse/v3/internal/storage"
"github.com/googlecloudplatform/gcsfuse/v3/tools/integration_tests/util/setup"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)

func storageControlClientRetryOptions() []gax.CallOption {
Expand Down Expand Up @@ -96,16 +97,20 @@ func DeleteManagedFoldersInBucket(ctx context.Context, client *control.StorageCo
}
}

func CreateManagedFoldersInBucket(ctx context.Context, client *control.StorageControlClient, managedFolderPath, bucket string) {
func CreateManagedFoldersInBucket(ctx context.Context, client *control.StorageControlClient, managedFolderPath, bucket string) bool {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add doc string - it's unclear what "bool" return type actually stands for.

mf := &controlpb.ManagedFolder{}
req := &controlpb.CreateManagedFolderRequest{
Parent: fmt.Sprintf("projects/_/buckets/%v", bucket),
ManagedFolder: mf,
ManagedFolderId: managedFolderPath,
}
if _, err := client.CreateManagedFolder(ctx, req); err != nil && !strings.Contains(err.Error(), "The specified managed folder already exists") {
if _, err := client.CreateManagedFolder(ctx, req); err != nil {
if status.Code(err) == codes.AlreadyExists || strings.Contains(err.Error(), "The specified managed folder already exists") {
return false
}
log.Fatalf("Error while creating managed folder: %v", err)
}
return true
Comment on lines +107 to +113

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reduce code-complexity

Suggested change
if _, err := client.CreateManagedFolder(ctx, req); err != nil {
if status.Code(err) == codes.AlreadyExists || strings.Contains(err.Error(), "The specified managed folder already exists") {
return false
}
log.Fatalf("Error while creating managed folder: %v", err)
}
return true
err := client.CreateManagedFolder(ctx, req)
if err == nil {
return true
}
if status.Code(err) == codes.AlreadyExists || strings.Contains(err.Error(), "The specified managed folder already exists") {
return false
}
log.Fatalf("Error while creating managed folder: %v", err)
return true

}

func CreateFolderInBucket(ctx context.Context, client *control.StorageControlClient, folderPath string) (*controlpb.Folder, error) {
Expand Down
Loading