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
Greg Blomquist a239227d2a Show failure for Openstack Storate service_type
The openstack_service_type for the Openstack Storage Service (Swift) currently
defaults to "object-store".  However, if the Swift service is unvailable, the
authenticate_v2 method attempts to call:

    service_type.join ", "

The problem is that the String "object-store" doesn't have a join method.

The new tests show that "object-store" is an invalid service_type, whereas
["object-store"] is a valid service_type.

https://github.com/fog/fog/issues/3112
2014-08-15 15:03:01 -04:00

183 lines
6.3 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 missing storage service") do
Excon.stub({ :method => 'POST', :path => "/v2.0/tokens" },
{ :status => 200, :body => Fog::JSON.encode(body) })
raises(NoMethodError,
"undefined method `join' for \"object-store\":String") do
Fog::OpenStack.authenticate_v2(
:openstack_auth_uri => URI('http://example/v2.0/tokens'),
:openstack_tenant => 'admin',
:openstack_service_type => 'object-store')
end
raises(Fog::Errors::NotFound,
"Could not find service object-store. Have compute, image") do
Fog::OpenStack.authenticate_v2(
:openstack_auth_uri => URI('http://example/v2.0/tokens'),
:openstack_tenant => 'admin',
:openstack_service_type => %w[object-store])
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
tests("legacy v1 auth") do
headers = {
"X-Storage-Url" => "https://swift.myhost.com/v1/AUTH_tenant",
"X-Auth-Token" => "AUTH_yui193bdc00c1c46c5858788yuio0e1e2p",
"X-Trans-Id" => "iu99nm9999f9b999c9b999dad9cd999e99",
"Content-Length" => "0",
"Date" => "Wed, 07 Aug 2013 11:11:11 GMT"
}
Excon.stub({:method => 'GET', :path => "/auth/v1.0"},
{:status => 200, :body => "", :headers => headers})
returns("https://swift.myhost.com/v1/AUTH_tenant") do
Fog::OpenStack.authenticate_v1(
:openstack_auth_uri => URI('https://swift.myhost.com/auth/v1.0'),
:openstack_username => 'tenant:dev',
:openstack_api_key => 'secret_key',
:openstack_service_type => %w[storage])[:server_management_url]
end
end
ensure
Excon.stubs.clear
Excon.defaults[:mock] = @old_mock_value
end
end