Always set error on response in token create (#109) (#92)
If there was a network error, http response will be nil
but error needs to be propogated out.
diff --git a/openstack/identity/v3/tokens/requests.go b/openstack/identity/v3/tokens/requests.go
index b65de02..ba4363b 100644
--- a/openstack/identity/v3/tokens/requests.go
+++ b/openstack/identity/v3/tokens/requests.go
@@ -158,8 +158,8 @@
resp, err := c.Post(tokenURL(c), b, &r.Body, &gophercloud.RequestOpts{
MoreHeaders: map[string]string{"X-Auth-Token": ""},
})
+ r.Err = err
if resp != nil {
- r.Err = err
r.Header = resp.Header
}
return
diff --git a/openstack/testing/client_test.go b/openstack/testing/client_test.go
index 570b3a0..3fe768f 100644
--- a/openstack/testing/client_test.go
+++ b/openstack/testing/client_test.go
@@ -52,7 +52,7 @@
Username: "me",
Password: "secret",
DomainName: "default",
- TenantName: "project",
+ TenantName: "project",
IdentityEndpoint: th.Endpoint(),
}
client, err := openstack.AuthenticatedClient(options)
@@ -291,3 +291,25 @@
th.AssertNoErr(t, err)
th.CheckEquals(t, "http://localhost:35357/", sc.Endpoint)
}
+
+func testAuthenticatedClientFails(t *testing.T, endpoint string) {
+ options := gophercloud.AuthOptions{
+ Username: "me",
+ Password: "secret",
+ DomainName: "default",
+ TenantName: "project",
+ IdentityEndpoint: endpoint,
+ }
+ _, err := openstack.AuthenticatedClient(options)
+ if err == nil {
+ t.Fatal("expected error but call succeeded")
+ }
+}
+
+func TestAuthenticatedClientV3Fails(t *testing.T) {
+ testAuthenticatedClientFails(t, "http://bad-address.example.com/v3")
+}
+
+func TestAuthenticatedClientV2Fails(t *testing.T) {
+ testAuthenticatedClientFails(t, "http://bad-address.example.com/v2.0")
+}