Added support to specifiy custom endpoint

Signed-off-by: Keerthan Reddy Mala <keerthan.mala@gmail.com>
This commit is contained in:
Keerthan Mala 2016-03-05 11:46:44 -07:00 committed by Keerthan Reddy Mala
parent 46b2c3fadf
commit 2be1b4ef4f
4 changed files with 62 additions and 23 deletions

View File

@ -90,6 +90,7 @@ information about each option that appears later in this page.
accesskey: awsaccesskey
secretkey: awssecretkey
region: us-west-1
regionendpoint: http://myobjects.local
bucket: bucketname
encrypt: true
secure: true
@ -358,6 +359,7 @@ Permitted values are `error`, `warn`, `info` and `debug`. The default is
accesskey: awsaccesskey
secretkey: awssecretkey
region: us-west-1
regionendpoint: http://myobjects.local
bucket: bucketname
encrypt: true
secure: true
@ -435,7 +437,7 @@ You must configure one backend; if you configure more, the registry returns an e
</tr>
<tr>
<td><code>s3</code></td>
<td>Uses Amazon's Simple Storage Service (S3).
<td>Uses Amazon's Simple Storage Service (S3) and compatible Storage Services.
See the <a href="storage-drivers/s3.md">driver's reference documentation</a>.
</td>
</tr>

View File

@ -9,7 +9,7 @@ keywords = ["registry, service, driver, images, storage, S3"]
# S3 storage driver
An implementation of the `storagedriver.StorageDriver` interface which uses Amazon S3 for object storage.
An implementation of the `storagedriver.StorageDriver` interface which uses Amazon S3 or S3 compatible services for object storage.
## Parameters
@ -52,6 +52,17 @@ An implementation of the `storagedriver.StorageDriver` interface which uses Amaz
The AWS region in which your bucket exists. For the moment, the Go AWS
library in use does not use the newer DNS based bucket routing.
</td>
</tr>
<tr>
<td>
<code>regionendpoint</code>
</td>
<td>
no
</td>
<td>
Endpoint for S3 compatible storage services (Minio, etc)
</td>
</tr>
<tr>
<td>
@ -146,6 +157,8 @@ An implementation of the `storagedriver.StorageDriver` interface which uses Amaz
`region`: The name of the aws region in which you would like to store objects (for example `us-east-1`). For a list of regions, you can look at http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
`regionendpoint`: (optional) Endpoint URL for S3 compatible APIs. This should not be provided when using Amazon S3.
`bucket`: The name of your S3 bucket where you wish to store objects. The bucket must exist prior to the driver initialization.
`encrypt`: (optional) Whether you would like your data encrypted on the server side (defaults to false if not specified).

View File

@ -56,16 +56,17 @@ var validRegions = map[string]struct{}{}
//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set
type DriverParameters struct {
AccessKey string
SecretKey string
Bucket string
Region string
Encrypt bool
Secure bool
ChunkSize int64
RootDirectory string
StorageClass string
UserAgent string
AccessKey string
SecretKey string
Bucket string
Region string
RegionEndpoint string
Encrypt bool
Secure bool
ChunkSize int64
RootDirectory string
StorageClass string
UserAgent string
}
func init() {
@ -153,6 +154,11 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) {
return nil, fmt.Errorf("No bucket parameter provided")
}
regionEndpoint := parameters["regionendpoint"]
if regionEndpoint == nil {
regionEndpoint = ""
}
encryptBool := false
encrypt := parameters["encrypt"]
switch encrypt := encrypt.(type) {
@ -240,6 +246,7 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) {
fmt.Sprint(secretKey),
fmt.Sprint(bucket),
region,
fmt.Sprint(regionEndpoint),
encryptBool,
secureBool,
chunkSize,
@ -255,22 +262,37 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) {
// bucketName
func New(params DriverParameters) (*Driver, error) {
awsConfig := aws.NewConfig()
creds := credentials.NewChainCredentials([]credentials.Provider{
&credentials.StaticProvider{
Value: credentials.Value{
AccessKeyID: params.AccessKey,
SecretAccessKey: params.SecretKey,
var creds *credentials.Credentials
if params.RegionEndpoint == "" {
creds = credentials.NewChainCredentials([]credentials.Provider{
&credentials.StaticProvider{
Value: credentials.Value{
AccessKeyID: params.AccessKey,
SecretAccessKey: params.SecretKey,
},
},
},
&credentials.EnvProvider{},
&credentials.SharedCredentialsProvider{},
&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())},
})
&credentials.EnvProvider{},
&credentials.SharedCredentialsProvider{},
&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())},
})
} else {
creds = credentials.NewChainCredentials([]credentials.Provider{
&credentials.StaticProvider{
Value: credentials.Value{
AccessKeyID: params.AccessKey,
SecretAccessKey: params.SecretKey,
},
},
&credentials.EnvProvider{},
})
awsConfig.WithS3ForcePathStyle(true)
awsConfig.WithEndpoint(params.RegionEndpoint)
}
awsConfig.WithCredentials(creds)
awsConfig.WithRegion(params.Region)
awsConfig.WithDisableSSL(!params.Secure)
// awsConfig.WithMaxRetries(10)
if params.UserAgent != "" {
awsConfig.WithHTTPClient(&http.Client{

View File

@ -30,6 +30,7 @@ func init() {
secure := os.Getenv("S3_SECURE")
region := os.Getenv("AWS_REGION")
root, err := ioutil.TempDir("", "driver-")
regionEndpoint := os.Getenv("REGION_ENDPOINT")
if err != nil {
panic(err)
}
@ -57,6 +58,7 @@ func init() {
secretKey,
bucket,
region,
regionEndpoint,
encryptBool,
secureBool,
minChunkSize,