From af99dbd6bf23c0757137cf42f1d9c750a60fd305 Mon Sep 17 00:00:00 2001 From: davidli Date: Mon, 8 Jun 2015 16:37:11 +0800 Subject: [PATCH] Add support for Openstack Identity v3 API Signed-off-by: Li Wenquan --- docs/configuration.md | 51 ++++++++++++++++++++- docs/storage-drivers/swift.md | 10 +++- registry/storage/driver/swift/swift.go | 34 ++++++++++---- registry/storage/driver/swift/swift_test.go | 31 +++++++++---- 4 files changed, 105 insertions(+), 21 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index a997eb6a9..ebbde46df 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -49,7 +49,6 @@ This section lists all the registry configuration options. Some options in the list are mutually exclusive. So, make sure to read the detailed reference information about each option that appears later in this page. -<<<<<<< HEAD version: 0.1 log: level: debug @@ -96,8 +95,12 @@ information about each option that appears later in this page. swift: username: username password: password - authurl: https://storage.myprovider.com/v2.0 + authurl: https://storage.myprovider.com/v2.0 or https://storage.myprovider.com/v3/auth tenant: tenantname + tenantid: tenantid + domain: domain name for Openstack Identity v3 API + domainid: domain id for Openstack Identity v3 API + insecureskipverify: true region: fr container: containername rootdirectory: /swift/object/name/prefix @@ -665,6 +668,50 @@ This storage backend uses Openstack Swift object storage. Your Openstack tenant name. + + + tenantid + + + no + + + Your Openstack tenant id. + + + + + domain + + + no + + + Your Openstack domain name for Identity v3 API. + + + + + domainid + + + no + + + Your Openstack domain id for Identity v3 API. + + + + + insecureskipverify + + + no + + true for skip TLS verification, false by default. + + + chunksize diff --git a/docs/storage-drivers/swift.md b/docs/storage-drivers/swift.md index b2712db3c..da8b000e9 100644 --- a/docs/storage-drivers/swift.md +++ b/docs/storage-drivers/swift.md @@ -12,7 +12,15 @@ An implementation of the `storagedriver.StorageDriver` interface which uses [Ope `container`: The name of your Swift container where you wish to store objects. An additional container - named `_segments` to store the data will be used. The driver will try to create both containers during its initialization. -`tenant`: (optional) Your Openstack tenant name. +`tenant`: (optional) Your Openstack tenant name. You can either use `tenant` or `tenantid`. + +`tenantid`: (optional) Your Openstack tenant id. You can either use `tenant` or `tenantid`. + +`domain`: (Optional) Your Openstack domain name for Identity v3 API. You can either use `domain` or `domainid`. + +`domainid`: (Optional) Your Openstack domain id for Identity v3 API. You can either use `domain` or `domainid`. + +`insecureskipverify`: (Optional) insecureskipverify can be set to true to skip TLS verification for your openstack provider. Default is false. `region`: (optional) The name of the Openstack region in which you would like to store objects (for example `fr`). diff --git a/registry/storage/driver/swift/swift.go b/registry/storage/driver/swift/swift.go index 66c1a85b5..0875edefb 100644 --- a/registry/storage/driver/swift/swift.go +++ b/registry/storage/driver/swift/swift.go @@ -10,6 +10,7 @@ package swift import ( "bytes" + "crypto/tls" "encoding/json" "fmt" "io" @@ -40,14 +41,18 @@ const directoryMimeType = "application/directory" //DriverParameters A struct that encapsulates all of the driver parameters after all values have been set type DriverParameters struct { - Username string - Password string - AuthURL string - Tenant string - Region string - Container string - Prefix string - ChunkSize int + Username string + Password string + AuthURL string + Tenant string + TenantID string + Domain string + DomainID string + Region string + Container string + Prefix string + InsecureSkipVerify bool + ChunkSize int } type swiftInfo map[string]interface{} @@ -89,7 +94,8 @@ type Driver struct { // - container func FromParameters(parameters map[string]interface{}) (*Driver, error) { params := DriverParameters{ - ChunkSize: defaultChunkSize, + ChunkSize: defaultChunkSize, + InsecureSkipVerify: false, } if err := mapstructure.Decode(parameters, ¶ms); err != nil { @@ -121,6 +127,12 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) { // New constructs a new Driver with the given Openstack Swift credentials and container name func New(params DriverParameters) (*Driver, error) { + transport := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + MaxIdleConnsPerHost: 2048, + TLSClientConfig: &tls.Config{InsecureSkipVerify: params.InsecureSkipVerify}, + } + ct := swift.Connection{ UserName: params.Username, ApiKey: params.Password, @@ -128,6 +140,10 @@ func New(params DriverParameters) (*Driver, error) { Region: params.Region, UserAgent: "distribution", Tenant: params.Tenant, + TenantId: params.TenantID, + Domain: params.Domain, + DomainId: params.DomainID, + Transport: transport, ConnectTimeout: 60 * time.Second, Timeout: 15 * 60 * time.Second, } diff --git a/registry/storage/driver/swift/swift_test.go b/registry/storage/driver/swift/swift_test.go index 5ead8d15a..fc66aa268 100644 --- a/registry/storage/driver/swift/swift_test.go +++ b/registry/storage/driver/swift/swift_test.go @@ -3,6 +3,7 @@ package swift import ( "io/ioutil" "os" + "strconv" "testing" "github.com/ncw/swift/swifttest" @@ -21,15 +22,19 @@ type SwiftDriverConstructor func(rootDirectory string) (*Driver, error) func init() { var ( - username string - password string - authURL string - tenant string - container string - region string - prefix string - swiftServer *swifttest.SwiftServer - err error + username string + password string + authURL string + tenant string + tenantID string + domain string + domainID string + container string + region string + prefix string + insecureSkipVerify bool + swiftServer *swifttest.SwiftServer + err error ) if username = os.Getenv("OS_USERNAME"); username == "" { username = os.Getenv("ST_USER") @@ -41,9 +46,13 @@ func init() { authURL = os.Getenv("ST_AUTH") } tenant = os.Getenv("OS_TENANT_NAME") + tenantID = os.Getenv("OS_TENANT_ID") + domain = os.Getenv("OS_DOMAIN_NAME") + domainID = os.Getenv("OS_DOMAIN_ID") container = os.Getenv("OS_CONTAINER_NAME") region = os.Getenv("OS_REGION_NAME") prefix = os.Getenv("OS_CONTAINER_PREFIX") + insecureSkipVerify, _ = strconv.ParseBool(os.Getenv("ST_INSECURESKIPVERIFY")) if username == "" || password == "" || authURL == "" || container == "" { if swiftServer, err = swifttest.NewSwiftServer("localhost"); err != nil { @@ -67,9 +76,13 @@ func init() { password, authURL, tenant, + tenantID, + domain, + domainID, region, container, prefix, + insecureSkipVerify, defaultChunkSize, }