2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-25 06:07:44 +00:00

gs: support other regions than us

This commit is contained in:
sohalt 2023-02-27 07:53:25 +01:00 committed by Michael Eischer
parent 658aa4c0f7
commit ed5b2c2c9b
5 changed files with 20 additions and 2 deletions

View File

@ -0,0 +1,6 @@
Enhancement: Allow to specify region where a bucket should get created 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 ``-o gs.connections=10`` switch. By default, at most five parallel connections are
established. 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 .. _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 .. _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 .. _default authentication material: https://cloud.google.com/docs/authentication#service-accounts

View File

@ -16,13 +16,15 @@ type Config struct {
Bucket string Bucket string
Prefix 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. // NewConfig returns a new Config with the default values filled in.
func NewConfig() Config { func NewConfig() Config {
return Config{ return Config{
Connections: 5, Connections: 5,
Region: "us",
} }
} }

View File

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

View File

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