Merge pull request #4226 from Sohalt/gcs-region

gs: support other regions than us
This commit is contained in:
Michael Eischer 2023-05-26 20:28:52 +02:00 committed by GitHub
commit 3e287afdbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 21 additions and 2 deletions

View File

@ -0,0 +1,7 @@
Enhancement: Allow specifying the region of new buckets in the gcs backend
Buckets used by the Google Cloud Storage backend would always get created in
the "us" region. It is now possible to specify the region, where a bucket
should get created.
https://github.com/restic/restic/pull/4226

View File

@ -613,6 +613,8 @@ The number of concurrent connections to the GCS service can be set with the
``-o gs.connections=10`` switch. By default, at most five parallel connections are
established.
The region, where a bucket should be created, can be specified with the ``-o gs.region=us`` switch. By default, the region is set to ``us``.
.. _service account: https://cloud.google.com/iam/docs/service-account-overview
.. _create a service account key: https://cloud.google.com/iam/docs/keys-create-delete
.. _default authentication material: https://cloud.google.com/docs/authentication#service-accounts

View File

@ -16,13 +16,15 @@ type Config struct {
Bucket string
Prefix string
Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"`
Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"`
Region string `option:"region" help:"region to create the bucket in (default: us)"`
}
// NewConfig returns a new Config with the default values filled in.
func NewConfig() Config {
return Config{
Connections: 5,
Region: "us",
}
}

View File

@ -10,16 +10,19 @@ var configTests = []struct {
Bucket: "bucketname",
Prefix: "",
Connections: 5,
Region: "us",
}},
{"gs:bucketname:/prefix/directory", Config{
Bucket: "bucketname",
Prefix: "prefix/directory",
Connections: 5,
Region: "us",
}},
{"gs:bucketname:/prefix/directory/", Config{
Bucket: "bucketname",
Prefix: "prefix/directory",
Connections: 5,
Region: "us",
}},
}

View File

@ -37,6 +37,7 @@ type Backend struct {
projectID string
connections uint
bucketName string
region string
bucket *storage.BucketHandle
prefix string
listMaxItems int
@ -102,6 +103,7 @@ func open(cfg Config, rt http.RoundTripper) (*Backend, error) {
projectID: cfg.ProjectID,
connections: cfg.Connections,
bucketName: cfg.Bucket,
region: cfg.Region,
bucket: gcsClient.Bucket(cfg.Bucket),
prefix: cfg.Prefix,
Layout: &layout.DefaultLayout{
@ -142,8 +144,11 @@ func Create(ctx context.Context, cfg Config, rt http.RoundTripper) (restic.Backe
}
if !exists {
bucketAttrs := &storage.BucketAttrs{
Location: cfg.Region,
}
// Bucket doesn't exist, try to create it.
if err := be.bucket.Create(ctx, be.projectID, nil); err != nil {
if err := be.bucket.Create(ctx, be.projectID, bucketAttrs); err != nil {
// Always an error, as the bucket definitely doesn't exist.
return nil, errors.Wrap(err, "service.Buckets.Insert")
}