1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00
fog--fog/tests/openstack/authenticate_tests.rb
Dan Prince ba26129001 OpenStack auth updates to select by service name.
This patch updates the OpenStack auth implementation so that
it supports selecting API service by both 'name' and 'type'.

Previously the implementation was confusing because it
used a config param called :openstack_service_name to
select the service 'type' from the catalog. This patch
swaps it so that :openstack_service_name actually selects
by 'name'.

The previous logic to select service by type ('compute' for example)
has been preserved in a new :openstack_service_type parameter.
This option is used just as it was before for backwards compatability.

This change is potentially breaking for anyone previously using
:openstack_service_name (which I don't think is that common but is
possible). As such we should probably make a release note saying
that previous users of :openstack_service_name should migrate to
use :openstack_service_type instead.
2012-12-10 07:55:54 -05:00

142 lines
4.7 KiB
Ruby

Shindo.tests('OpenStack | authenticate', ['openstack']) do
begin
@old_mock_value = Excon.defaults[:mock]
Excon.defaults[:mock] = true
Excon.stubs.clear
expires = Time.now.utc + 600
token = Fog::Mock.random_numbers(8).to_s
tenant_token = Fog::Mock.random_numbers(8).to_s
body = {
"access" => {
"token" => {
"expires" => expires.iso8601,
"id" => token,
"tenant" => {
"enabled" => true,
"description" => nil,
"name" => "admin",
"id" => tenant_token,
}
},
"serviceCatalog" => [{
"endpoints" => [{
"adminURL" =>
"http://example:8774/v2/#{tenant_token}",
"region" => "RegionOne",
"internalURL" =>
"http://example:8774/v2/#{tenant_token}",
"id" => Fog::Mock.random_numbers(8).to_s,
"publicURL" =>
"http://example:8774/v2/#{tenant_token}"
}],
"endpoints_links" => [],
"type" => "compute",
"name" => "nova"
},
{ "endpoints" => [{
"adminURL" => "http://example:9292",
"region" => "RegionOne",
"internalURL" => "http://example:9292",
"id" => Fog::Mock.random_numbers(8).to_s,
"publicURL" => "http://example:9292"
}],
"endpoints_links" => [],
"type" => "image",
"name" => "glance"
}],
"user" => {
"username" => "admin",
"roles_links" => [],
"id" => Fog::Mock.random_numbers(8).to_s,
"roles" => [
{ "name" => "admin" },
{ "name" => "KeystoneAdmin" },
{ "name" => "KeystoneServiceAdmin" }
],
"name" => "admin"
},
"metadata" => {
"is_admin" => 0,
"roles" => [
Fog::Mock.random_numbers(8).to_s,
Fog::Mock.random_numbers(8).to_s,
Fog::Mock.random_numbers(8).to_s,]}}}
tests("v2") do
Excon.stub({ :method => 'POST', :path => "/v2.0/tokens" },
{ :status => 200, :body => Fog::JSON.encode(body) })
expected = {
:user => body['access']['user'],
:tenant => body['access']['token']['tenant'],
:identity_public_endpoint => nil,
:server_management_url =>
body['access']['serviceCatalog'].
first['endpoints'].first['publicURL'],
:token => token,
:expires => expires.iso8601,
:current_user_id => body['access']['user']['id'],
:unscoped_token => token,
}
returns(expected) do
Fog::OpenStack.authenticate_v2(
:openstack_auth_uri => URI('http://example/v2.0/tokens'),
:openstack_tenant => 'admin',
:openstack_service_type => %w[compute])
end
end
tests("v2 missing service") do
Excon.stub({ :method => 'POST', :path => "/v2.0/tokens" },
{ :status => 200, :body => Fog::JSON.encode(body) })
raises(Fog::Errors::NotFound,
'Could not find service network. Have compute, image') do
Fog::OpenStack.authenticate_v2(
:openstack_auth_uri => URI('http://example/v2.0/tokens'),
:openstack_tenant => 'admin',
:openstack_service_type => %w[network])
end
end
tests("v2 auth with two compute services") do
body_clone = body.clone
body_clone["access"]["serviceCatalog"] <<
{
"endpoints" => [{
"adminURL" =>
"http://example2:8774/v2/#{tenant_token}",
"region" => "RegionOne",
"internalURL" =>
"http://example2:8774/v2/#{tenant_token}",
"id" => Fog::Mock.random_numbers(8).to_s,
"publicURL" =>
"http://example2:8774/v2/#{tenant_token}"
}],
"endpoints_links" => [],
"type" => "compute",
"name" => "nova2"
}
Excon.stub({ :method => 'POST', :path => "/v2.0/tokens" },
{ :status => 200, :body => Fog::JSON.encode(body_clone) })
returns("http://example2:8774/v2/#{tenant_token}") do
Fog::OpenStack.authenticate_v2(
:openstack_auth_uri => URI('http://example/v2.0/tokens'),
:openstack_tenant => 'admin',
:openstack_service_type => %w[compute],
:openstack_service_name => 'nova2')[:server_management_url]
end
end
ensure
Excon.stubs.clear
Excon.defaults[:mock] = @old_mock_value
end
end