{"record":{"id":"2f0d632525429ab8","repo":"googleapis/mcp-toolbox","slug":"failed-to-delete-bucket-q-w","errorCode":null,"errorMessage":"failed to delete bucket %q: %w","messagePattern":"failed to delete bucket %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/cloudstorage/cloudstorage.go","lineNumber":612,"sourceCode":"\t}\n\tif err := s.client.Bucket(bucket).Object(object).Delete(ctx); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to delete object %q in bucket %q: %w\", object, bucket, err)\n\t}\n\n\treturn map[string]any{\n\t\t\"bucket\":  bucket,\n\t\t\"object\":  object,\n\t\t\"deleted\": true,\n\t}, nil\n}\n\n// DeleteBucket deletes an empty Cloud Storage bucket.\nfunc (s *Source) DeleteBucket(ctx context.Context, bucket string) (map[string]any, error) {\n\tif err := s.validateBucket(bucket); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := s.client.Bucket(bucket).Delete(ctx); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to delete bucket %q: %w\", bucket, err)\n\t}\n\n\treturn map[string]any{\n\t\t\"bucket\":  bucket,\n\t\t\"deleted\": true,\n\t}, nil\n}\n\nfunc initGCSClient(ctx context.Context, tracer trace.Tracer, name, project string) (*storage.Client, error) {\n\t//nolint:all // Reassigned ctx\n\tctx, span := sources.InitConnectionSpan(ctx, tracer, SourceType, name)\n\tdefer span.End()\n\n\tuserAgent, err := util.UserAgentFromContext(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n","sourceCodeStart":594,"sourceCodeEnd":630,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/cloudstorage/cloudstorage.go#L594-L630","documentation":"DeleteBucket wraps any error from the GCS client's Bucket.Delete call with the bucket name. The library throws it because GCS only allows deleting empty buckets and requires delete permission; the underlying cause (not empty, 403, not found) is preserved via %w.","triggerScenarios":"Calling Source.DeleteBucket(ctx, bucket) when the bucket still contains objects (including object versions/soft-deleted objects), the caller lacks storage.buckets.delete permission, the bucket does not exist, the bucket name fails validateBucket, or a transient API error occurs.","commonSituations":"Trying to delete a bucket that appears empty but holds non-current object versions or soft-deleted objects, service account missing roles/storage.admin, deleting a bucket with retention policy or public access prevention conflicts, environment pointing at a region where the bucket doesn't exist.","solutions":["Empty the bucket first: delete all objects (and object versions / soft-deleted copies, e.g. via gsutil rm -r or storage buckets objects list with versions)","Check the wrapped cause: storage.ErrBucketNotExist vs 403 vs 'bucket not empty' to pick the fix","Grant the service account roles/storage.admin or at minimum storage.buckets.delete","Remove or expire any retention policy/lifecycle locks before deletion","Retry transient 5xx errors with backoff"],"exampleFix":"// before\nif err := emptyBucketObjects(ctx, src, bucket); err != nil { return err }\n_, err := src.DeleteBucket(ctx, bucket)\n// after\nif err := emptyBucketObjects(ctx, src, bucket); err != nil { return err }\nif err := purgeObjectVersionsAndSoftDeleted(ctx, src, bucket); err != nil { return err }\n_, err := src.DeleteBucket(ctx, bucket)","handlingStrategy":"validation","validationCode":"// Before DeleteBucket, ensure bucket is empty (including versions/soft-deleted)\nfunc bucketIsEmpty(ctx context.Context, src *cloudstorage.Source, bucket string) (bool, error) {\n    it, err := src.ListObjects(ctx, bucket, \"\")\n    if err != nil { return false, err }\n    return len(it) == 0, nil\n}","typeGuard":null,"tryCatchPattern":"_, err := src.DeleteBucket(ctx, bucket)\nif err != nil {\n    switch {\n    case strings.Contains(err.Error(), \"not empty\"):\n        // purge remaining objects/versions then retry\n    case strings.Contains(err.Error(), \"403\"):\n        // fix IAM\n    default:\n        return err\n    }\n}","preventionTips":["Purge all object versions and soft-deleted objects before deleting a bucket","Require storage.admin for bucket lifecycle operations","Confirm the bucket has no retention policy or lock","Never assume a bucket is empty just because the UI listing looks empty"],"tags":["gcs","cloud-storage","delete","bucket","wrap-error"],"backgroundTag":"gcs-bucket-delete-failed","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}