Swauth Support (#65)
* Swauth Support
Swauth is an internal authentication system for Swift. This commit adds
support for Swauth in a way that still enables the resulting
*gophercloud.ServiceClient to still be able to use the existing ObjectStorage
API calls.
* Swauth updates for consistency
* Marking required fields for Swauth
diff --git a/openstack/objectstorage/v1/swauth/requests.go b/openstack/objectstorage/v1/swauth/requests.go
new file mode 100644
index 0000000..ce4bf9a
--- /dev/null
+++ b/openstack/objectstorage/v1/swauth/requests.go
@@ -0,0 +1,70 @@
+package swauth
+
+import "github.com/gophercloud/gophercloud"
+
+// AuthOptsBuilder describes struct types that can be accepted by the Auth call.
+// The AuthOpts struct in this package does.
+type AuthOptsBuilder interface {
+ ToAuthOptsMap() (map[string]string, error)
+}
+
+// AuthOpts specifies an authentication request.
+type AuthOpts struct {
+ // User is an Swauth-based username in username:tenant format.
+ User string `h:"X-Auth-User" required:"true"`
+ // Key is a secret/password to authenticate the User with.
+ Key string `h:"X-Auth-Key" required:"true"`
+}
+
+// ToAuthOptsMap formats an AuthOpts structure into a request body.
+func (opts AuthOpts) ToAuthOptsMap() (map[string]string, error) {
+ return gophercloud.BuildHeaders(opts)
+}
+
+// Auth performs an authentication request for a Swauth-based user.
+func Auth(c *gophercloud.ProviderClient, opts AuthOptsBuilder) (r GetAuthResult) {
+ h := make(map[string]string)
+
+ if opts != nil {
+ headers, err := opts.ToAuthOptsMap()
+ if err != nil {
+ r.Err = err
+ return
+ }
+
+ for k, v := range headers {
+ h[k] = v
+ }
+ }
+
+ resp, err := c.Request("GET", getURL(c), &gophercloud.RequestOpts{
+ MoreHeaders: h,
+ OkCodes: []int{200},
+ })
+
+ if resp != nil {
+ r.Header = resp.Header
+ }
+
+ r.Err = err
+
+ return r
+}
+
+// NewObjectStorageV1 creates a Swauth-authenticated *gophercloud.ServiceClient
+// client that can issue ObjectStorage-based API calls.
+func NewObjectStorageV1(pc *gophercloud.ProviderClient, authOpts AuthOpts) (*gophercloud.ServiceClient, error) {
+ auth, err := Auth(pc, authOpts).Extract()
+ if err != nil {
+ return nil, err
+ }
+
+ swiftClient := &gophercloud.ServiceClient{
+ ProviderClient: pc,
+ Endpoint: auth.StorageURL,
+ }
+
+ swiftClient.TokenID = auth.Token
+
+ return swiftClient, nil
+}