Extract the new token from headers.
diff --git a/openstack/identity/v3/tokens/requests.go b/openstack/identity/v3/tokens/requests.go
index 121de43..b8f0d76 100644
--- a/openstack/identity/v3/tokens/requests.go
+++ b/openstack/identity/v3/tokens/requests.go
@@ -228,11 +228,18 @@
}
}
- var resp TokenCreateResult
- perigee.Post(getTokenURL(c), perigee.Options{
+ var result TokenCreateResult
+ response, err := perigee.Request("POST", getTokenURL(c), perigee.Options{
ReqBody: &req,
- Results: &resp,
+ Results: &result.response,
OkCodes: []int{201},
})
- return &resp, nil
+ if err != nil {
+ return nil, err
+ }
+
+ // Extract the token ID from the response, if present.
+ result.tokenID = response.HttpResponse.Header.Get("X-Subject-Token")
+
+ return &result, nil
}
diff --git a/openstack/identity/v3/tokens/requests_test.go b/openstack/identity/v3/tokens/requests_test.go
index 3ac49cd..6038f96 100644
--- a/openstack/identity/v3/tokens/requests_test.go
+++ b/openstack/identity/v3/tokens/requests_test.go
@@ -26,6 +26,7 @@
testhelper.TestHeader(t, r, "Accept", "application/json")
testhelper.TestJSONRequest(t, r, requestJSON)
+ w.WriteHeader(http.StatusCreated)
fmt.Fprintf(w, `{}`)
})
@@ -234,6 +235,33 @@
`)
}
+func TestCreateExtractsTokenFromResponse(t *testing.T) {
+ setup()
+ defer teardown()
+
+ client := gophercloud.ServiceClient{
+ Endpoint: endpoint(),
+ Options: gophercloud.AuthOptions{UserID: "me", Password: "shhh"},
+ }
+
+ mux.HandleFunc("/auth/tokens", func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Add("X-Subject-Token", "aaa111")
+
+ w.WriteHeader(http.StatusCreated)
+ fmt.Fprintf(w, `{}`)
+ })
+
+ result, err := Create(&client, nil)
+ if err != nil {
+ t.Errorf("Create returned an error: %v", err)
+ }
+
+ token, _ := result.TokenID()
+ if token != "aaa111" {
+ t.Errorf("Expected token to be aaa111, but was %s", token)
+ }
+}
+
func TestCreateFailureEmptyAuth(t *testing.T) {
authTokenPostErr(t, gophercloud.AuthOptions{}, nil, false, ErrMissingPassword)
}
diff --git a/openstack/identity/v3/tokens/results.go b/openstack/identity/v3/tokens/results.go
index ca727c3..0f44744 100644
--- a/openstack/identity/v3/tokens/results.go
+++ b/openstack/identity/v3/tokens/results.go
@@ -1,9 +1,12 @@
package tokens
// TokenCreateResult contains the document structure returned from a Create call.
-type TokenCreateResult map[string]interface{}
+type TokenCreateResult struct {
+ response map[string]interface{}
+ tokenID string
+}
// TokenID retrieves a token generated by a Create call from an token creation response.
-func (r TokenCreateResult) TokenID() (string, error) {
- return "", nil
+func (r *TokenCreateResult) TokenID() (string, error) {
+ return r.tokenID, nil
}
diff --git a/openstack/identity/v3/tokens/results_test.go b/openstack/identity/v3/tokens/results_test.go
new file mode 100644
index 0000000..ca0d563
--- /dev/null
+++ b/openstack/identity/v3/tokens/results_test.go
@@ -0,0 +1,12 @@
+package tokens
+
+import "testing"
+
+func TestTokenID(t *testing.T) {
+ result := TokenCreateResult{tokenID: "1234"}
+
+ token, _ := result.TokenID()
+ if token != "1234" {
+ t.Errorf("Expected tokenID of 1234, got %s", token)
+ }
+}