github.com/gophercloud/gophercloud@v1.11.0/openstack/testing/client_test.go (about) 1 package testing 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 8 "github.com/gophercloud/gophercloud" 9 "github.com/gophercloud/gophercloud/openstack" 10 th "github.com/gophercloud/gophercloud/testhelper" 11 ) 12 13 const ID = "0123456789" 14 15 func TestAuthenticatedClientV3(t *testing.T) { 16 th.SetupHTTP() 17 defer th.TeardownHTTP() 18 19 th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 20 fmt.Fprintf(w, ` 21 { 22 "versions": { 23 "values": [ 24 { 25 "status": "stable", 26 "id": "v3.0", 27 "links": [ 28 { "href": "%s", "rel": "self" } 29 ] 30 }, 31 { 32 "status": "stable", 33 "id": "v2.0", 34 "links": [ 35 { "href": "%s", "rel": "self" } 36 ] 37 } 38 ] 39 } 40 } 41 `, th.Endpoint()+"v3/", th.Endpoint()+"v2.0/") 42 }) 43 44 th.Mux.HandleFunc("/v3/auth/tokens", func(w http.ResponseWriter, r *http.Request) { 45 w.Header().Add("X-Subject-Token", ID) 46 47 w.WriteHeader(http.StatusCreated) 48 fmt.Fprintf(w, `{ "token": { "expires_at": "2013-02-02T18:30:59.000000Z" } }`) 49 }) 50 51 options := gophercloud.AuthOptions{ 52 Username: "me", 53 Password: "secret", 54 DomainName: "default", 55 TenantName: "project", 56 IdentityEndpoint: th.Endpoint(), 57 } 58 client, err := openstack.AuthenticatedClient(options) 59 th.AssertNoErr(t, err) 60 th.CheckEquals(t, ID, client.TokenID) 61 } 62 63 func TestAuthenticatedClientV2(t *testing.T) { 64 th.SetupHTTP() 65 defer th.TeardownHTTP() 66 67 th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 68 fmt.Fprintf(w, ` 69 { 70 "versions": { 71 "values": [ 72 { 73 "status": "experimental", 74 "id": "v3.0", 75 "links": [ 76 { "href": "%s", "rel": "self" } 77 ] 78 }, 79 { 80 "status": "stable", 81 "id": "v2.0", 82 "links": [ 83 { "href": "%s", "rel": "self" } 84 ] 85 } 86 ] 87 } 88 } 89 `, th.Endpoint()+"v3/", th.Endpoint()+"v2.0/") 90 }) 91 92 th.Mux.HandleFunc("/v2.0/tokens", func(w http.ResponseWriter, r *http.Request) { 93 fmt.Fprintf(w, ` 94 { 95 "access": { 96 "token": { 97 "id": "01234567890", 98 "expires": "2014-10-01T10:00:00.000000Z" 99 }, 100 "serviceCatalog": [ 101 { 102 "name": "Cloud Servers", 103 "type": "compute", 104 "endpoints": [ 105 { 106 "tenantId": "t1000", 107 "publicURL": "https://compute.north.host.com/v1/t1000", 108 "internalURL": "https://compute.north.internal/v1/t1000", 109 "region": "North", 110 "versionId": "1", 111 "versionInfo": "https://compute.north.host.com/v1/", 112 "versionList": "https://compute.north.host.com/" 113 }, 114 { 115 "tenantId": "t1000", 116 "publicURL": "https://compute.north.host.com/v1.1/t1000", 117 "internalURL": "https://compute.north.internal/v1.1/t1000", 118 "region": "North", 119 "versionId": "1.1", 120 "versionInfo": "https://compute.north.host.com/v1.1/", 121 "versionList": "https://compute.north.host.com/" 122 } 123 ], 124 "endpoints_links": [] 125 }, 126 { 127 "name": "Cloud Files", 128 "type": "object-store", 129 "endpoints": [ 130 { 131 "tenantId": "t1000", 132 "publicURL": "https://storage.north.host.com/v1/t1000", 133 "internalURL": "https://storage.north.internal/v1/t1000", 134 "region": "North", 135 "versionId": "1", 136 "versionInfo": "https://storage.north.host.com/v1/", 137 "versionList": "https://storage.north.host.com/" 138 }, 139 { 140 "tenantId": "t1000", 141 "publicURL": "https://storage.south.host.com/v1/t1000", 142 "internalURL": "https://storage.south.internal/v1/t1000", 143 "region": "South", 144 "versionId": "1", 145 "versionInfo": "https://storage.south.host.com/v1/", 146 "versionList": "https://storage.south.host.com/" 147 } 148 ] 149 } 150 ] 151 } 152 } 153 `) 154 }) 155 156 options := gophercloud.AuthOptions{ 157 Username: "me", 158 Password: "secret", 159 IdentityEndpoint: th.Endpoint(), 160 } 161 client, err := openstack.AuthenticatedClient(options) 162 th.AssertNoErr(t, err) 163 th.CheckEquals(t, "01234567890", client.TokenID) 164 } 165 166 func TestIdentityAdminV3Client(t *testing.T) { 167 th.SetupHTTP() 168 defer th.TeardownHTTP() 169 170 th.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 171 fmt.Fprintf(w, ` 172 { 173 "versions": { 174 "values": [ 175 { 176 "status": "stable", 177 "id": "v3.0", 178 "links": [ 179 { "href": "%s", "rel": "self" } 180 ] 181 }, 182 { 183 "status": "stable", 184 "id": "v2.0", 185 "links": [ 186 { "href": "%s", "rel": "self" } 187 ] 188 } 189 ] 190 } 191 } 192 `, th.Endpoint()+"v3/", th.Endpoint()+"v2.0/") 193 }) 194 195 th.Mux.HandleFunc("/v3/auth/tokens", func(w http.ResponseWriter, r *http.Request) { 196 w.Header().Add("X-Subject-Token", ID) 197 198 w.WriteHeader(http.StatusCreated) 199 fmt.Fprintf(w, ` 200 { 201 "token": { 202 "audit_ids": ["VcxU2JYqT8OzfUVvrjEITQ", "qNUTIJntTzO1-XUk5STybw"], 203 "catalog": [ 204 { 205 "endpoints": [ 206 { 207 "id": "39dc322ce86c4111b4f06c2eeae0841b", 208 "interface": "public", 209 "region": "RegionOne", 210 "url": "http://localhost:5000" 211 }, 212 { 213 "id": "ec642f27474842e78bf059f6c48f4e99", 214 "interface": "internal", 215 "region": "RegionOne", 216 "url": "http://localhost:5000" 217 }, 218 { 219 "id": "c609fc430175452290b62a4242e8a7e8", 220 "interface": "admin", 221 "region": "RegionOne", 222 "url": "http://localhost:35357" 223 } 224 ], 225 "id": "4363ae44bdf34a3981fde3b823cb9aa2", 226 "type": "identity", 227 "name": "keystone" 228 } 229 ], 230 "expires_at": "2013-02-27T18:30:59.999999Z", 231 "is_domain": false, 232 "issued_at": "2013-02-27T16:30:59.999999Z", 233 "methods": [ 234 "password" 235 ], 236 "project": { 237 "domain": { 238 "id": "1789d1", 239 "name": "example.com" 240 }, 241 "id": "263fd9", 242 "name": "project-x" 243 }, 244 "roles": [ 245 { 246 "id": "76e72a", 247 "name": "admin" 248 }, 249 { 250 "id": "f4f392", 251 "name": "member" 252 } 253 ], 254 "service_providers": [ 255 { 256 "auth_url":"https://example.com:5000/v3/OS-FEDERATION/identity_providers/acme/protocols/saml2/auth", 257 "id": "sp1", 258 "sp_url": "https://example.com:5000/Shibboleth.sso/SAML2/ECP" 259 }, 260 { 261 "auth_url":"https://other.example.com:5000/v3/OS-FEDERATION/identity_providers/acme/protocols/saml2/auth", 262 "id": "sp2", 263 "sp_url": "https://other.example.com:5000/Shibboleth.sso/SAML2/ECP" 264 } 265 ], 266 "user": { 267 "domain": { 268 "id": "1789d1", 269 "name": "example.com" 270 }, 271 "id": "0ca8f6", 272 "name": "Joe", 273 "password_expires_at": "2016-11-06T15:32:17.000000" 274 } 275 } 276 } 277 `) 278 }) 279 280 options := gophercloud.AuthOptions{ 281 Username: "me", 282 Password: "secret", 283 DomainID: "12345", 284 IdentityEndpoint: th.Endpoint(), 285 } 286 pc, err := openstack.AuthenticatedClient(options) 287 th.AssertNoErr(t, err) 288 sc, err := openstack.NewIdentityV3(pc, gophercloud.EndpointOpts{ 289 Availability: gophercloud.AvailabilityAdmin, 290 }) 291 th.AssertNoErr(t, err) 292 th.CheckEquals(t, "http://localhost:35357/v3/", sc.Endpoint) 293 } 294 295 func testAuthenticatedClientFails(t *testing.T, endpoint string) { 296 options := gophercloud.AuthOptions{ 297 Username: "me", 298 Password: "secret", 299 DomainName: "default", 300 TenantName: "project", 301 IdentityEndpoint: endpoint, 302 } 303 _, err := openstack.AuthenticatedClient(options) 304 if err == nil { 305 t.Fatal("expected error but call succeeded") 306 } 307 } 308 309 func TestAuthenticatedClientV3Fails(t *testing.T) { 310 testAuthenticatedClientFails(t, "http://bad-address.example.com/v3") 311 } 312 313 func TestAuthenticatedClientV2Fails(t *testing.T) { 314 testAuthenticatedClientFails(t, "http://bad-address.example.com/v2.0") 315 }