forked from TrueCloudLab/rclone
s3: S3 IPv6 support with option "use_dual_stack" (bool)
dualstack_endpoint=true enables IPv6 DNS lookup for S3 endpoints in s3.go, add Options.DualstackEndpoint to support IPv6 on S3
This commit is contained in:
parent
2f5685b405
commit
9fe343b725
2 changed files with 43 additions and 0 deletions
|
@ -2219,6 +2219,13 @@ If it is set then rclone will use v2 authentication.
|
||||||
Use this only if v4 signatures don't work, e.g. pre Jewel/v10 CEPH.`,
|
Use this only if v4 signatures don't work, e.g. pre Jewel/v10 CEPH.`,
|
||||||
Default: false,
|
Default: false,
|
||||||
Advanced: true,
|
Advanced: true,
|
||||||
|
}, {
|
||||||
|
Name: "use_dual_stack",
|
||||||
|
Help: `If true use AWS S3 dual-stack endpoint (IPv6 support).
|
||||||
|
|
||||||
|
See [AWS Docs on Dualstack Endpoints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html)`,
|
||||||
|
Default: false,
|
||||||
|
Advanced: true,
|
||||||
}, {
|
}, {
|
||||||
Name: "use_accelerate_endpoint",
|
Name: "use_accelerate_endpoint",
|
||||||
Provider: "AWS",
|
Provider: "AWS",
|
||||||
|
@ -2628,6 +2635,7 @@ type Options struct {
|
||||||
Region string `config:"region"`
|
Region string `config:"region"`
|
||||||
Endpoint string `config:"endpoint"`
|
Endpoint string `config:"endpoint"`
|
||||||
STSEndpoint string `config:"sts_endpoint"`
|
STSEndpoint string `config:"sts_endpoint"`
|
||||||
|
UseDualStack bool `config:"use_dual_stack"`
|
||||||
LocationConstraint string `config:"location_constraint"`
|
LocationConstraint string `config:"location_constraint"`
|
||||||
ACL string `config:"acl"`
|
ACL string `config:"acl"`
|
||||||
BucketACL string `config:"bucket_acl"`
|
BucketACL string `config:"bucket_acl"`
|
||||||
|
@ -2956,6 +2964,9 @@ func s3Connection(ctx context.Context, opt *Options, client *http.Client) (*s3.S
|
||||||
r.addService("sts", opt.STSEndpoint)
|
r.addService("sts", opt.STSEndpoint)
|
||||||
awsConfig.WithEndpointResolver(r)
|
awsConfig.WithEndpointResolver(r)
|
||||||
}
|
}
|
||||||
|
if opt.UseDualStack {
|
||||||
|
awsConfig.UseDualStackEndpoint = endpoints.DualStackEndpointStateEnabled
|
||||||
|
}
|
||||||
|
|
||||||
// awsConfig.WithLogLevel(aws.LogDebugWithSigning)
|
// awsConfig.WithLogLevel(aws.LogDebugWithSigning)
|
||||||
awsSessionOpts := session.Options{
|
awsSessionOpts := session.Options{
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
package s3
|
package s3
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/rclone/rclone/fs"
|
"github.com/rclone/rclone/fs"
|
||||||
|
@ -9,6 +12,13 @@ import (
|
||||||
"github.com/rclone/rclone/fstest/fstests"
|
"github.com/rclone/rclone/fstest/fstests"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func SetupS3Test(t *testing.T) (context.Context, *Options, *http.Client) {
|
||||||
|
ctx, opt := context.Background(), new(Options)
|
||||||
|
opt.Provider = "AWS"
|
||||||
|
client := getClient(ctx, opt)
|
||||||
|
return ctx, opt, client
|
||||||
|
}
|
||||||
|
|
||||||
// TestIntegration runs integration tests against the remote
|
// TestIntegration runs integration tests against the remote
|
||||||
func TestIntegration(t *testing.T) {
|
func TestIntegration(t *testing.T) {
|
||||||
fstests.Run(t, &fstests.Opt{
|
fstests.Run(t, &fstests.Opt{
|
||||||
|
@ -39,6 +49,28 @@ func TestIntegration2(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAWSDualStackOption(t *testing.T) {
|
||||||
|
{
|
||||||
|
// test enabled
|
||||||
|
ctx, opt, client := SetupS3Test(t)
|
||||||
|
opt.UseDualStack = true
|
||||||
|
s3Conn, _, _ := s3Connection(ctx, opt, client)
|
||||||
|
if !strings.Contains(s3Conn.Endpoint, "dualstack") {
|
||||||
|
t.Errorf("dualstack failed got: %s, wanted: dualstack", s3Conn.Endpoint)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// test default case
|
||||||
|
ctx, opt, client := SetupS3Test(t)
|
||||||
|
s3Conn, _, _ := s3Connection(ctx, opt, client)
|
||||||
|
if strings.Contains(s3Conn.Endpoint, "dualstack") {
|
||||||
|
t.Errorf("dualstack failed got: %s, NOT wanted: dualstack", s3Conn.Endpoint)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Fs) SetUploadChunkSize(cs fs.SizeSuffix) (fs.SizeSuffix, error) {
|
func (f *Fs) SetUploadChunkSize(cs fs.SizeSuffix) (fs.SizeSuffix, error) {
|
||||||
return f.setUploadChunkSize(cs)
|
return f.setUploadChunkSize(cs)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue