Skip to content

Commit

Permalink
br: clone backend options (#59549)
Browse files Browse the repository at this point in the history
close #59548
  • Loading branch information
Leavrth authored Feb 20, 2025
1 parent d20f300 commit 0ea19d4
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 12 deletions.
27 changes: 15 additions & 12 deletions br/pkg/storage/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,12 @@ func parseBackend(u *url.URL, rawURL string, options *BackendOptions) (*backuppb
}
prefix := strings.Trim(u.Path, "/")
s3 := &backuppb.S3{Bucket: u.Host, Prefix: prefix}
if options == nil {
options = &BackendOptions{S3: S3BackendOptions{ForcePathStyle: true}}
var s3Options S3BackendOptions = S3BackendOptions{ForcePathStyle: true}
if options != nil {
s3Options = options.S3
}
ExtractQueryParameters(u, &options.S3)
if err := options.S3.Apply(s3); err != nil {
ExtractQueryParameters(u, &s3Options)
if err := s3Options.Apply(s3); err != nil {
return nil, errors.Trace(err)
}
if u.Scheme == "ks3" {
Expand All @@ -104,11 +105,12 @@ func parseBackend(u *url.URL, rawURL string, options *BackendOptions) (*backuppb
}
prefix := strings.Trim(u.Path, "/")
gcs := &backuppb.GCS{Bucket: u.Host, Prefix: prefix}
if options == nil {
options = &BackendOptions{}
var gcsOptions GCSBackendOptions
if options != nil {
gcsOptions = options.GCS
}
ExtractQueryParameters(u, &options.GCS)
if err := options.GCS.apply(gcs); err != nil {
ExtractQueryParameters(u, &gcsOptions)
if err := gcsOptions.apply(gcs); err != nil {
return nil, errors.Trace(err)
}
return &backuppb.StorageBackend{Backend: &backuppb.StorageBackend_Gcs{Gcs: gcs}}, nil
Expand All @@ -119,11 +121,12 @@ func parseBackend(u *url.URL, rawURL string, options *BackendOptions) (*backuppb
}
prefix := strings.Trim(u.Path, "/")
azblob := &backuppb.AzureBlobStorage{Bucket: u.Host, Prefix: prefix}
if options == nil {
options = &BackendOptions{}
var azblobOptions AzblobBackendOptions
if options != nil {
azblobOptions = options.Azblob
}
ExtractQueryParameters(u, &options.Azblob)
if err := options.Azblob.apply(azblob); err != nil {
ExtractQueryParameters(u, &azblobOptions)
if err := azblobOptions.apply(azblob); err != nil {
return nil, errors.Trace(err)
}
return &backuppb.StorageBackend{Backend: &backuppb.StorageBackend_AzureBlobStorage{AzureBlobStorage: azblob}}, nil
Expand Down
107 changes: 107 additions & 0 deletions br/pkg/storage/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -309,3 +309,110 @@ func TestIsLocal(t *testing.T) {
})
}
}

func TestParseBackend(t *testing.T) {
{
backendOptions := &BackendOptions{
S3: S3BackendOptions{},
GCS: GCSBackendOptions{},
Azblob: AzblobBackendOptions{},
}
_, err := ParseBackend("s3://bucket3/prefix/path?endpoint=https://127.0.0.1:9000&force_path_style=0&sse-kms-key-id=TestKey&xyz=abc", backendOptions)
require.NoError(t, err)
require.Equal(t, "", backendOptions.S3.SseKmsKeyID)
_, err = ParseBackend("gcs://bucket?endpoint=http://127.0.0.1&predefined-acl=1234", backendOptions)
require.NoError(t, err)
require.Equal(t, "", backendOptions.GCS.PredefinedACL)
_, err = ParseBackend("azure://bucket1/prefix/path?account-name=user&account-key=cGFzc3dk&endpoint=http://127.0.0.1/user&encryption-scope=test", backendOptions)
require.NoError(t, err)
require.Equal(t, "", backendOptions.Azblob.EncryptionScope)
}
{
backendOptions := &BackendOptions{
S3: S3BackendOptions{StorageClass: "test"},
GCS: GCSBackendOptions{StorageClass: "test"},
Azblob: AzblobBackendOptions{AccessTier: "test"},
}
u, err := ParseBackend("s3://bucket3/prefix/path?endpoint=https://127.0.0.1:9000&force_path_style=0&sse-kms-key-id=TestKey&xyz=abc", backendOptions)
require.NoError(t, err)
require.Equal(t, S3BackendOptions{StorageClass: "test"}, backendOptions.S3)
retBackend1, ok := u.Backend.(*backuppb.StorageBackend_S3)
require.True(t, ok)
require.Equal(t, backuppb.S3{
Endpoint: "https://127.0.0.1:9000",
Bucket: "bucket3",
Prefix: "prefix/path",
StorageClass: "test",
SseKmsKeyId: "TestKey",
}, *retBackend1.S3)
u, err = ParseBackend("gcs://bucket?endpoint=http://127.0.0.1&predefined-acl=1234", backendOptions)
require.NoError(t, err)
require.Equal(t, GCSBackendOptions{StorageClass: "test"}, backendOptions.GCS)
retBackend2, ok := u.Backend.(*backuppb.StorageBackend_Gcs)
require.True(t, ok)
require.Equal(t, backuppb.GCS{
Endpoint: "http://127.0.0.1",
Bucket: "bucket",
StorageClass: "test",
PredefinedAcl: "1234",
}, *retBackend2.Gcs)
u, err = ParseBackend("azure://bucket1/prefix/path?account-name=user&account-key=cGFzc3dk&endpoint=http://127.0.0.1/user&encryption-scope=test", backendOptions)
require.NoError(t, err)
require.Equal(t, AzblobBackendOptions{AccessTier: "test"}, backendOptions.Azblob)
retBackend3, ok := u.Backend.(*backuppb.StorageBackend_AzureBlobStorage)
require.True(t, ok)
require.Equal(t, backuppb.AzureBlobStorage{
Endpoint: "http://127.0.0.1/user",
Bucket: "bucket1",
Prefix: "prefix/path",
StorageClass: "test",
AccountName: "user",
SharedKey: "cGFzc3dk",
EncryptionScope: "test",
}, *retBackend3.AzureBlobStorage)
}
{
u, err := ParseBackend("s3://bucket3/prefix/path?endpoint=https://127.0.0.1:9000&force_path_style=0&sse-kms-key-id=TestKey&xyz=abc", nil)
require.NoError(t, err)
retBackend1, ok := u.Backend.(*backuppb.StorageBackend_S3)
require.True(t, ok)
require.Equal(t, backuppb.S3{
Endpoint: "https://127.0.0.1:9000",
Bucket: "bucket3",
Prefix: "prefix/path",
SseKmsKeyId: "TestKey",
}, *retBackend1.S3)
u, err = ParseBackend("s3://bucket3/prefix/path?endpoint=https://127.0.0.1:9000&sse-kms-key-id=TestKey&xyz=abc", nil)
require.NoError(t, err)
retBackend1, ok = u.Backend.(*backuppb.StorageBackend_S3)
require.True(t, ok)
require.Equal(t, backuppb.S3{
Endpoint: "https://127.0.0.1:9000",
Bucket: "bucket3",
Prefix: "prefix/path",
ForcePathStyle: true,
SseKmsKeyId: "TestKey",
}, *retBackend1.S3)
u, err = ParseBackend("gcs://bucket?endpoint=http://127.0.0.1&predefined-acl=1234", nil)
require.NoError(t, err)
retBackend2, ok := u.Backend.(*backuppb.StorageBackend_Gcs)
require.True(t, ok)
require.Equal(t, backuppb.GCS{
Endpoint: "http://127.0.0.1",
Bucket: "bucket",
PredefinedAcl: "1234",
}, *retBackend2.Gcs)
u, err = ParseBackend("azure://bucket1/prefix/path?account-name=user&account-key=cGFzc3dk&endpoint=http://127.0.0.1/user&encryption-scope=test", nil)
require.NoError(t, err)
retBackend3, ok := u.Backend.(*backuppb.StorageBackend_AzureBlobStorage)
require.True(t, ok)
require.Equal(t, backuppb.AzureBlobStorage{
Endpoint: "http://127.0.0.1/user",
Bucket: "bucket1",
Prefix: "prefix/path",
AccountName: "user",
SharedKey: "cGFzc3dk",
EncryptionScope: "test",
}, *retBackend3.AzureBlobStorage)
}
}

0 comments on commit 0ea19d4

Please sign in to comment.