tools/integration_tests/util/client/control_client.go (88 lines of code) (raw):
// Copyright 2024 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.
// This code initializes a control client solely for the purpose of setting up test data for
// end-to-end tests.
// This client is not used in the application logic itself.
package client
import (
"context"
"fmt"
"log"
"path"
"strings"
"time"
control "cloud.google.com/go/storage/control/apiv2"
"cloud.google.com/go/storage/control/apiv2/controlpb"
"github.com/googleapis/gax-go/v2"
"github.com/googlecloudplatform/gcsfuse/v2/internal/storage"
"github.com/googlecloudplatform/gcsfuse/v2/tools/integration_tests/util/setup"
"google.golang.org/grpc/codes"
)
func storageControlClientRetryOptions() []gax.CallOption {
return []gax.CallOption{
gax.WithTimeout(300000 * time.Millisecond),
gax.WithRetry(func() gax.Retryer {
return gax.OnCodes([]codes.Code{
codes.ResourceExhausted,
codes.Unavailable,
codes.DeadlineExceeded,
codes.Internal,
codes.Unknown,
}, gax.Backoff{
Max: 30 * time.Second,
Multiplier: 2,
})
}),
}
}
func CreateControlClient(ctx context.Context) (client *control.StorageControlClient, err error) {
client, err = control.NewStorageControlClient(ctx)
client.CallOptions.CreateManagedFolder = storageControlClientRetryOptions()
client.CallOptions.DeleteManagedFolder = storageControlClientRetryOptions()
if err != nil {
return nil, fmt.Errorf("control.NewStorageControlClient: #{err}")
}
return client, nil
}
func CreateControlClientWithCancel(ctx *context.Context, controlClient **control.StorageControlClient) func() error {
var err error
var cancel context.CancelFunc
*ctx, cancel = context.WithCancel(*ctx)
*controlClient, err = CreateControlClient(*ctx)
if err != nil {
log.Fatalf("client.CreateControlClient: %v", err)
}
// Return func to close storage client and release resources.
return func() error {
err := (*controlClient).Close()
if err != nil {
return fmt.Errorf("failed to close control client: %v", err)
}
defer cancel()
return nil
}
}
func DeleteManagedFoldersInBucket(ctx context.Context, client *control.StorageControlClient, managedFolderPath, bucket string) {
folderPath := fmt.Sprintf("projects/_/buckets/%v/managedFolders/%v/", bucket, managedFolderPath)
req := &controlpb.DeleteManagedFolderRequest{
Name: folderPath,
AllowNonEmpty: true,
}
if err := client.DeleteManagedFolder(ctx, req); err != nil && !strings.Contains(err.Error(), "The following URLs matched no objects or files") {
log.Fatalf("Error while deleting managed folder: %v", err)
}
}
func CreateManagedFoldersInBucket(ctx context.Context, client *control.StorageControlClient, managedFolderPath, bucket string) {
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") {
log.Fatalf("Error while creating managed folder: %v", err)
}
}
func CreateFolderInBucket(ctx context.Context, client *control.StorageControlClient, folderPath string) (*controlpb.Folder, error) {
bucket, rootFolder := setup.GetBucketAndObjectBasedOnTypeOfMount("")
req := &controlpb.CreateFolderRequest{
Parent: fmt.Sprintf(storage.FullBucketPathHNS, bucket),
FolderId: path.Join(rootFolder, folderPath),
}
f, err := client.CreateFolder(ctx, req)
return f, err
}