Add support for Openstack Identity v3 API

Signed-off-by: Li Wenquan <wenquan.li@hp.com>
This commit is contained in:
davidli 2015-06-08 16:37:11 +08:00 committed by Sylvain Baubeau
parent 3ff9f9b9cc
commit af99dbd6bf
4 changed files with 105 additions and 21 deletions

View file

@ -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 the list are mutually exclusive. So, make sure to read the detailed reference
information about each option that appears later in this page. information about each option that appears later in this page.
<<<<<<< HEAD
version: 0.1 version: 0.1
log: log:
level: debug level: debug
@ -96,8 +95,12 @@ information about each option that appears later in this page.
swift: swift:
username: username username: username
password: password 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 tenant: tenantname
tenantid: tenantid
domain: domain name for Openstack Identity v3 API
domainid: domain id for Openstack Identity v3 API
insecureskipverify: true
region: fr region: fr
container: containername container: containername
rootdirectory: /swift/object/name/prefix rootdirectory: /swift/object/name/prefix
@ -665,6 +668,50 @@ This storage backend uses Openstack Swift object storage.
Your Openstack tenant name. Your Openstack tenant name.
</td> </td>
</tr> </tr>
<tr>
<td>
<code>tenantid</code>
</td>
<td>
no
</td>
<td>
Your Openstack tenant id.
</td>
</tr>
<tr>
<td>
<code>domain</code>
</td>
<td>
no
</td>
<td>
Your Openstack domain name for Identity v3 API.
</td>
</tr>
<tr>
<td>
<code>domainid</code>
</td>
<td>
no
</td>
<td>
Your Openstack domain id for Identity v3 API.
</td>
</tr>
<tr>
<td>
<code>insecureskipverify</code>
</td>
<td>
no
</td>
true for skip TLS verification, false by default.
<td>
</td>
</tr>
<tr> <tr>
<td> <td>
<code>chunksize</code> <code>chunksize</code>

View file

@ -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 `<container>_segments` to store the data will be used. The driver will try to create both containers during its initialization. `container`: The name of your Swift container where you wish to store objects. An additional container - named `<container>_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`). `region`: (optional) The name of the Openstack region in which you would like to store objects (for example `fr`).

View file

@ -10,6 +10,7 @@ package swift
import ( import (
"bytes" "bytes"
"crypto/tls"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "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 //DriverParameters A struct that encapsulates all of the driver parameters after all values have been set
type DriverParameters struct { type DriverParameters struct {
Username string Username string
Password string Password string
AuthURL string AuthURL string
Tenant string Tenant string
Region string TenantID string
Container string Domain string
Prefix string DomainID string
ChunkSize int Region string
Container string
Prefix string
InsecureSkipVerify bool
ChunkSize int
} }
type swiftInfo map[string]interface{} type swiftInfo map[string]interface{}
@ -89,7 +94,8 @@ type Driver struct {
// - container // - container
func FromParameters(parameters map[string]interface{}) (*Driver, error) { func FromParameters(parameters map[string]interface{}) (*Driver, error) {
params := DriverParameters{ params := DriverParameters{
ChunkSize: defaultChunkSize, ChunkSize: defaultChunkSize,
InsecureSkipVerify: false,
} }
if err := mapstructure.Decode(parameters, &params); err != nil { if err := mapstructure.Decode(parameters, &params); 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 // New constructs a new Driver with the given Openstack Swift credentials and container name
func New(params DriverParameters) (*Driver, error) { func New(params DriverParameters) (*Driver, error) {
transport := &http.Transport{
Proxy: http.ProxyFromEnvironment,
MaxIdleConnsPerHost: 2048,
TLSClientConfig: &tls.Config{InsecureSkipVerify: params.InsecureSkipVerify},
}
ct := swift.Connection{ ct := swift.Connection{
UserName: params.Username, UserName: params.Username,
ApiKey: params.Password, ApiKey: params.Password,
@ -128,6 +140,10 @@ func New(params DriverParameters) (*Driver, error) {
Region: params.Region, Region: params.Region,
UserAgent: "distribution", UserAgent: "distribution",
Tenant: params.Tenant, Tenant: params.Tenant,
TenantId: params.TenantID,
Domain: params.Domain,
DomainId: params.DomainID,
Transport: transport,
ConnectTimeout: 60 * time.Second, ConnectTimeout: 60 * time.Second,
Timeout: 15 * 60 * time.Second, Timeout: 15 * 60 * time.Second,
} }

View file

@ -3,6 +3,7 @@ package swift
import ( import (
"io/ioutil" "io/ioutil"
"os" "os"
"strconv"
"testing" "testing"
"github.com/ncw/swift/swifttest" "github.com/ncw/swift/swifttest"
@ -21,15 +22,19 @@ type SwiftDriverConstructor func(rootDirectory string) (*Driver, error)
func init() { func init() {
var ( var (
username string username string
password string password string
authURL string authURL string
tenant string tenant string
container string tenantID string
region string domain string
prefix string domainID string
swiftServer *swifttest.SwiftServer container string
err error region string
prefix string
insecureSkipVerify bool
swiftServer *swifttest.SwiftServer
err error
) )
if username = os.Getenv("OS_USERNAME"); username == "" { if username = os.Getenv("OS_USERNAME"); username == "" {
username = os.Getenv("ST_USER") username = os.Getenv("ST_USER")
@ -41,9 +46,13 @@ func init() {
authURL = os.Getenv("ST_AUTH") authURL = os.Getenv("ST_AUTH")
} }
tenant = os.Getenv("OS_TENANT_NAME") 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") container = os.Getenv("OS_CONTAINER_NAME")
region = os.Getenv("OS_REGION_NAME") region = os.Getenv("OS_REGION_NAME")
prefix = os.Getenv("OS_CONTAINER_PREFIX") prefix = os.Getenv("OS_CONTAINER_PREFIX")
insecureSkipVerify, _ = strconv.ParseBool(os.Getenv("ST_INSECURESKIPVERIFY"))
if username == "" || password == "" || authURL == "" || container == "" { if username == "" || password == "" || authURL == "" || container == "" {
if swiftServer, err = swifttest.NewSwiftServer("localhost"); err != nil { if swiftServer, err = swifttest.NewSwiftServer("localhost"); err != nil {
@ -67,9 +76,13 @@ func init() {
password, password,
authURL, authURL,
tenant, tenant,
tenantID,
domain,
domainID,
region, region,
container, container,
prefix, prefix,
insecureSkipVerify,
defaultChunkSize, defaultChunkSize,
} }