diff --git a/lib/fog/rackspace/compute.rb b/lib/fog/rackspace/compute.rb index a79922e2b..6e2375cea 100644 --- a/lib/fog/rackspace/compute.rb +++ b/lib/fog/rackspace/compute.rb @@ -240,10 +240,7 @@ module Fog def endpoint_uri(service_endpoint_url=nil) return @uri if @uri - - @uri = super(@rackspace_endpoint || service_endpoint_url, :rackspace_compute_v1_url) - @uri.host = "snet-#{@uri.host}" if service_net? - @uri + super(@rackspace_endpoint || service_endpoint_url, :rackspace_compute_v1_url) end private diff --git a/lib/fog/rackspace/models/identity/service_catalog.rb b/lib/fog/rackspace/models/identity/service_catalog.rb index 0768d57c1..2b10512ee 100644 --- a/lib/fog/rackspace/models/identity/service_catalog.rb +++ b/lib/fog/rackspace/models/identity/service_catalog.rb @@ -8,36 +8,51 @@ module Fog def initialize(attributes) @service = attributes.delete(:service) - @catalog = {} + @catalog = attributes.delete(:catalog) || {} end def services - catalog.keys + catalog.collect {|s| s["name"]} end - - def get_endpoints(service_type) - service_type = service_type.is_a?(String) ? service_type.to_sym : service_type - catalog[service_type] - end - - def display_service_regions(service_type) - endpoints = get_endpoints(service_type) - endpoints.collect { |k,v| ":#{k}" }.join(", ") - end - - def get_endpoint(service_type, region=nil) - endpoint = get_endpoints(service_type) - raise "Unable to locate endpoint for service #{service_type}" unless endpoint - return endpoint if endpoint.is_a?(String) #There is only one endpoint for service + def get_endpoints(service_name, service_net=false) + h = catalog.find {|service| service["name"] == service_name.to_s} + return {} unless h + key = network_type_key(service_net) + h["endpoints"].select {|e| e[key]} + end - unless region - raise "There are multiple endpoints available for #{service_type}. Please specify one of the following regions: #{display_service_regions(service_type)}." + + def display_service_regions(service_name, service_net=false) + endpoints = get_endpoints(service_name, service_net) + regions = endpoints.collect do |e| + e["region"] ? ":#{e["region"].downcase}" : ":global" end - region = region.is_a?(String) ? region.to_sym : region - endpoint = get_endpoints(service_type)[region] - raise "Unknown region :#{region} for service #{service_type}. Please use one of the following regions: #{display_service_regions(service_type)}" unless endpoint - endpoint + regions.join(", ") + end + + def get_endpoint(service_name, region=nil, service_net=false) + service_region = region_key(region) + + network_type = network_type_key(service_net) + + endpoints = get_endpoints(service_name, service_net) + raise "Unable to locate endpoint for service #{service_name}" if endpoints.empty? + + if endpoints.size > 1 && region.nil? + raise "There are multiple endpoints available for #{service_name}. Please specify one of the following regions: #{display_service_regions(service_name)}." + end + + # select multiple endpoints + endpoint = endpoints.find {|e| matching_region?(e, service_region) } + return endpoint[network_type] if endpoint && endpoint[network_type] + + # endpoint doesnt have region + if endpoints.size == 1 && matching_region?(endpoints[0], "GLOBAL") + return endpoints[0][network_type] + end + + raise "Unknown region :#{region} for service #{service_name}. Please use one of the following regions: #{display_service_regions(service_name)}" end def reload @@ -47,52 +62,22 @@ module Fog end def self.from_response(service, hash) - service_catalog = ServiceCatalog.new :service => service - begin - services = hash["access"]["serviceCatalog"] - services.each do |serv| - name = serv["name"] ? serv["name"].to_sym : nil - next unless name - service_catalog.send(:add_endpoints, name, serv) - end - rescue => e - Logger.warning "Exception occurred while loading service catalog - #{e.inspect}" - Logger.warning "Unable to load service catalog. Please specify endpoints manually" - end - service_catalog + ServiceCatalog.new :service => service, :catalog => hash["access"]["serviceCatalog"] end private - def add_endpoints(service_name, hash) - begin - endpoints = hash["endpoints"] - if endpoints.size == 1 - catalog[service_name] = endpoints[0]["publicURL"].freeze - else - catalog[service_name] = endpoints_from_array(service_name, endpoints) - end - rescue => e - Logger.warning "Exception occurred while loading #{service_name} service endpoints - #{e.inspect}" - Logger.warning "Unable to load service endpoints for #{service_name}. Please specify #{service_name} endpoints manually." - end + def network_type_key(service_net) + service_net ? "internalURL" : "publicURL" + end + + def matching_region?(h, region) + region_key(h["region"]) == region end - def endpoints_from_array(service_name, endpoints) - hash = {} - endpoints.each do |endpoint| - begin - region_name = endpoint["region"] - region = region_name ? region_name.downcase.to_sym : :global - url = endpoint["publicURL"].freeze - hash[region] = url - rescue => e - Logger.warning "Exception occurred while loading #{service_name} service endpoints - #{e.inspect}" - Logger.warning "Unable to parse #{service_name} endpoint - #{endpoint}" - Logger.warning "You may need to specify #{service_name} endpoints manually." - end - end - hash + def region_key(region) + return region.to_s.upcase if region.is_a? Symbol + (region.nil? || region.empty?) ? "GLOBAL" : region.to_s.upcase end end diff --git a/lib/fog/rackspace/service.rb b/lib/fog/rackspace/service.rb index b2d3fbcd9..1e6b51cdc 100644 --- a/lib/fog/rackspace/service.rb +++ b/lib/fog/rackspace/service.rb @@ -52,6 +52,10 @@ module Fog response end + def service_net? + false + end + private def process_response(response) @@ -118,7 +122,7 @@ module Fog end def endpoint_uri_v2 - @uri = @identity_service.service_catalog.get_endpoint(service_name, region) + @uri = @identity_service.service_catalog.get_endpoint(service_name, region, service_net?) end def auth_token diff --git a/lib/fog/rackspace/storage.rb b/lib/fog/rackspace/storage.rb index b35496dea..8ad05ac85 100644 --- a/lib/fog/rackspace/storage.rb +++ b/lib/fog/rackspace/storage.rb @@ -191,10 +191,7 @@ module Fog def endpoint_uri(service_endpoint_url=nil) return @uri if @uri - - @uri = super(@rackspace_storage_url || service_endpoint_url, :rackspace_storage_url) - @uri.host = "snet-#{@uri.host}" if service_net? - @uri + super(@rackspace_storage_url || service_endpoint_url, :rackspace_storage_url) end private diff --git a/tests/rackspace/compute_tests.rb b/tests/rackspace/compute_tests.rb index ebfd21ac0..e15fd7c66 100644 --- a/tests/rackspace/compute_tests.rb +++ b/tests/rackspace/compute_tests.rb @@ -81,11 +81,6 @@ Shindo.tests('Rackspace | Compute', ['rackspace']) do returns(true, "auth token populated") { !@service.send(:auth_token).nil? } returns(true, "uses custom endpoint") { (@service.instance_variable_get("@uri").host =~ /my-custom-endpoint\.com/) != nil } end - tests('rackspace_servicenet') do - @service = Fog::Compute::Rackspace.new :rackspace_servicenet => true - returns(true, "auth token populated") { !@service.send(:auth_token).nil? } - returns(true, "uses custom endpoint") { (@service.instance_variable_get("@uri").host =~ /snet-/) != nil } - end end tests('reauthentication') do diff --git a/tests/rackspace/helper.rb b/tests/rackspace/helper.rb index 6319ee98c..0629df153 100644 --- a/tests/rackspace/helper.rb +++ b/tests/rackspace/helper.rb @@ -54,8 +54,12 @@ module Shindo until current_state == state current_state = service.get_server(server_id).body['server']['status'] if error_states - error_states = Array(error_states) - raise "ERROR! Server should have transitioned to '#{state}' not '#{current_state}'" if error_states.include?(current_state) + error_states = Array(error_states) + if error_states.include?(current_state) + Fog::Logger.warning caller + Fog::Logger.warning "ERROR! Server should have transitioned to '#{state}' not '#{current_state}'" + return + end end sleep 10 unless Fog.mocking? end diff --git a/tests/rackspace/models/identity/service_catalog_tests.rb b/tests/rackspace/models/identity/service_catalog_tests.rb index 421159a1e..821216d6f 100644 --- a/tests/rackspace/models/identity/service_catalog_tests.rb +++ b/tests/rackspace/models/identity/service_catalog_tests.rb @@ -2,30 +2,6 @@ require 'fog/rackspace/models/identity/service_catalog' Shindo.tests('Fog::Rackspace::ServiceCatalog | users', ['rackspace']) do - tests('#from_response') do - tests('missing serviceCatalog node') do - before_hash = {"access"=>{"token"=>{"expires"=>"2013-02-20T10:31:00.000-06:00", "tenant"=>{"name"=>"777", "id"=>"777"}, "id"=>"6ca10877-7c50-4a5c-b58f-004d835c39c3"}}} - after_hash = {} - service_catalog = Fog::Rackspace::Identity::ServiceCatalog.from_response(nil, before_hash) - returns(after_hash) { service_catalog.catalog } - end - - tests('missing serviceCatalog node') do - before_hash = {"access"=>{"token"=>{"expires"=>"2013-02-20T10:31:00.000-06:00", "tenant"=>{"name"=>"777", "id"=>"777"}, "id"=>"6ca10877-7c50-4a5c-b58f-004d835c39c3"}, "serviceCatalog"=>[{"type"=>"volume", "name"=>"cloudBlockStorage", "endpoints" =>[{"region"=>"DFW", "tenantId"=>"777" }]}, {"type"=>"rax:load-balancer","name"=>"cloudLoadBalancers", "endpoints"=>[{"region"=>"ORD", "tenantId"=>"777", "publicURL"=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"}] }] }} - - after_hash = {:cloudBlockStorage=>nil, :cloudLoadBalancers=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"} - service_catalog = Fog::Rackspace::Identity::ServiceCatalog.from_response(nil, before_hash) - returns(after_hash) { service_catalog.catalog } - end - - tests('missing region') do - before_hash = {"access"=>{"token"=>{"expires"=>"2013-02-20T10:31:00.000-06:00", "tenant"=>{"name"=>"777", "id"=>"777"}, "id"=>"6ca10877-7c50-4a5c-b58f-004d835c39c3"}, "serviceCatalog"=> [{"type"=>"rax:load-balancer","name"=>"cloudLoadBalancers", "endpoints"=>[{"region"=>"ORD", "tenantId"=>"777", "publicURL"=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"}, {"tenantId"=>"777", "publicURL"=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"}] }] }} - - after_hash = {:cloudLoadBalancers=>{:ord=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777", :global=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"}} - service_catalog = Fog::Rackspace::Identity::ServiceCatalog.from_response(nil, before_hash) - returns(after_hash) { service_catalog.catalog } - end - tests('successful') do before_hash = {"access"=>{"token"=>{"expires"=>"2013-02-20T10:31:00.000-06:00", "tenant"=>{"name"=>"777", "id"=>"777"}, "id"=>"6ca10877-7c50-4a5c-b58f-004d835c39c3"}, "serviceCatalog"=>[{"type"=>"volume", "endpoints"=>[{"region"=>"DFW", "tenantId"=>"777", "publicURL"=>"https://dfw.blockstorage.api.rackspacecloud.com/v1/777"}, @@ -46,47 +22,90 @@ Shindo.tests('Fog::Rackspace::ServiceCatalog | users', ['rackspace']) do "tenantId"=>"777", "versionList"=>"https://dfw.servers.api.rackspacecloud.com/", "versionInfo"=>"https://dfw.servers.api.rackspacecloud.com/v2", "publicURL"=>"https://dfw.servers.api.rackspacecloud.com/v2/777"}, {"region"=>"ORD", "versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://ord.servers.api.rackspacecloud.com/", "versionInfo"=>"https://ord.servers.api.rackspacecloud.com/v2", - "publicURL"=>"https://ord.servers.api.rackspacecloud.com/v2/777"}], "name"=>"cloudServersOpenStack"}, {"type"=>"rax:monitor", "endpoints"=>[{"tenantId"=>"777", + "publicURL"=>"https://ord.servers.api.rackspacecloud.com/v2/777"}, {"versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://servers.api.rackspacecloud.com/", "versionInfo"=>"https://servers.api.rackspacecloud.com/v2", "publicURL"=>"https://servers.api.rackspacecloud.com/v2/777"}], "name"=>"cloudServersOpenStack"}, {"type"=>"rax:monitor", "endpoints"=>[{"tenantId"=>"777", "publicURL"=>"https://monitoring.api.rackspacecloud.com/v1.0/777"}], "name"=>"cloudMonitoring"}, {"type"=>"rax:object-cdn", "endpoints"=>[{"region"=>"DFW", "tenantId"=>"Mosso777", "publicURL"=>"https://cdn1.clouddrive.com/v1/Mosso777"}, {"region"=>"ORD", "tenantId"=>"Mosso777", - "publicURL"=>"https://cdn2.clouddrive.com/v1/Mosso777"}], "name"=>"cloudFilesCDN"}], "user"=>{"roles"=>[{"description"=>"User Admin + "publicURL"=>"https://cdn2.clouddrive.com/v1/Mosso777"}], "name"=>"cloudFilesCDN"}, + + {"type"=>"not_here", "name" => "not_here", "endpoints"=>[{"tenantId"=>"777", "region" => "LON", + "publicURL"=>"https://monitoring.api.rackspacecloud.com/v1.0/777"}]} + ], + + "user"=>{"roles"=>[{"description"=>"User Admin Role.", "name"=>"identity:user-admin", "id"=>"3"}], "name"=>"joe-racker", "RAX-AUTH:defaultRegion"=>"", "id"=>"TK421"}}} - after_hash = {:cloudServers=>"https://servers.api.rackspacecloud.com/v1.0/777", :cloudServersOpenStack=>{:dfw=>"https://dfw.servers.api.rackspacecloud.com/v2/777", :ord=>"https://ord.servers.api.rackspacecloud.com/v2/777"}, :cloudFiles=>{:dfw=>"https://storage101.dfw1.clouddrive.com/v1/Mosso777", :ord=>"https://storage101.ord1.clouddrive.com/v1/Mosso777"}, :cloudBlockStorage=>{:dfw=>"https://dfw.blockstorage.api.rackspacecloud.com/v1/777", :ord=>"https://ord.blockstorage.api.rackspacecloud.com/v1/777"}, :cloudMonitoring=>"https://monitoring.api.rackspacecloud.com/v1.0/777", :cloudLoadBalancers=>{:dfw=>"https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/777", :ord=>"https://ord.loadbalancers.api.rackspacecloud.com/v1.0/777"}, :cloudFilesCDN=>{:dfw=>"https://cdn1.clouddrive.com/v1/Mosso777", :ord=>"https://cdn2.clouddrive.com/v1/Mosso777"}, :cloudDatabases=>{:dfw=>"https://dfw.databases.api.rackspacecloud.com/v1.0/777", :ord=>"https://ord.databases.api.rackspacecloud.com/v1.0/777"}, :cloudDNS=>"https://dns.api.rackspacecloud.com/v1.0/777"} @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.from_response(nil, before_hash) - returns(after_hash) { @service_catalog.catalog } end - end - tests('services') do - services = ["cloudBlockStorage", "cloudDNS", "cloudDatabases", "cloudFiles", "cloudFilesCDN", "cloudLoadBalancers", "cloudMonitoring", "cloudServers", "cloudServersOpenStack"] - returns(services) { @service_catalog.services.collect {|s| s.to_s }.sort } - end + tests('services') do + services = ["cloudBlockStorage", "cloudDNS", "cloudDatabases", "cloudFiles", "cloudFilesCDN", "cloudLoadBalancers", "cloudMonitoring", "cloudServers", "cloudServersOpenStack", "not_here"] + + returns(services) { @service_catalog.services.collect {|s| s.to_s }.sort } + end tests('get_endpoints') do - endpoints = {:dfw=>"https://dfw.servers.api.rackspacecloud.com/v2/777", :ord=>"https://ord.servers.api.rackspacecloud.com/v2/777"} + endpoints = [{"region"=>"DFW", "versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://dfw.servers.api.rackspacecloud.com/", "versionInfo"=>"https://dfw.servers.api.rackspacecloud.com/v2", "publicURL"=>"https://dfw.servers.api.rackspacecloud.com/v2/777"}, {"region"=>"ORD", "versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://ord.servers.api.rackspacecloud.com/", "versionInfo"=>"https://ord.servers.api.rackspacecloud.com/v2", "publicURL"=>"https://ord.servers.api.rackspacecloud.com/v2/777"}, {"versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://servers.api.rackspacecloud.com/", "versionInfo"=>"https://servers.api.rackspacecloud.com/v2", "publicURL"=>"https://servers.api.rackspacecloud.com/v2/777"}] returns(endpoints) { @service_catalog.get_endpoints(:cloudServersOpenStack) } returns(endpoints) { @service_catalog.get_endpoints('cloudServersOpenStack') } - returns(nil) { @service_catalog.get_endpoints('non-existent') } + returns({}) { @service_catalog.get_endpoints('non-existent') } end tests('get_endpoint') do tests('service with mulitple endpoints') do returns("https://dfw.servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint(:cloudServersOpenStack, :dfw) } - returns("https://ord.servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint(:cloudServersOpenStack, :ord) } + returns("https://ord.servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint(:cloudServersOpenStack, :ord) } returns("https://dfw.servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint(:cloudServersOpenStack, 'dfw') } returns("https://dfw.servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint('cloudServersOpenStack', 'dfw') } + returns("https://servers.api.rackspacecloud.com/v2/777") { @service_catalog.get_endpoint('cloudServersOpenStack', :global) } end tests('with one endpoint') do - returns("https://monitoring.api.rackspacecloud.com/v1.0/777") { @service_catalog.get_endpoint(:cloudMonitoring, 'dfw') } + tests('catalog contains global endpoint') do + catalog_hash = [{"type"=>"volume", "endpoints"=>[{"tenantId"=>"777", "publicURL"=>"https://blockstorage.api.rackspacecloud.com/v1/777"}], "name"=>"cloudBlockStorage"}] + @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.new(:service => nil, :catalog => catalog_hash) + + tests('no region specifed').returns("https://blockstorage.api.rackspacecloud.com/v1/777") do + @service_catalog.get_endpoint(:cloudBlockStorage) + end + tests('region specifed').returns("https://blockstorage.api.rackspacecloud.com/v1/777") do + @service_catalog.get_endpoint(:cloudBlockStorage, :ord) + end + end + tests('catalog does not contain global endpoint') do + catalog_hash = [{"type"=>"volume", "endpoints"=>[{"region" => "ORD", "tenantId"=>"777", "publicURL"=>"https://ord.blockstorage.api.rackspacecloud.com/v1/777"}], "name"=>"cloudBlockStorage"}] + @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.new(:service => nil, :catalog => catalog_hash) + + tests('non-existing region') do + raises(RuntimeError) { @service_catalog.get_endpoint(:cloudBlockStorage, :dfw) } + end + tests('existing region').returns("https://ord.blockstorage.api.rackspacecloud.com/v1/777") do + @service_catalog.get_endpoint(:cloudBlockStorage, :ord) + end + end + end + + tests('endpoint type') do + catalog_hash = [{"type"=>"object-store", "endpoints"=>[{"internalURL"=>"https://snet-storage101.dfw1.clouddrive.com/v1/Mosso777", "region"=>"DFW", + "tenantId"=>"Mosso777", + "publicURL"=>"https://storage101.dfw1.clouddrive.com/v1/Mosso777"}, + {"internalURL"=>"https://snet-storage101.ord1.clouddrive.com/v1/Mosso777", "region"=>"ORD", + "tenantId"=>"Mosso777", + "publicURL"=>"https://storage101.ord1.clouddrive.com/v1/Mosso777"}], "name"=>"cloudFiles"}] + @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.new(:service => nil, :catalog => catalog_hash) + + returns("https://storage101.ord1.clouddrive.com/v1/Mosso777") { @service_catalog.get_endpoint(:cloudFiles, :ord) } + returns("https://snet-storage101.ord1.clouddrive.com/v1/Mosso777") { @service_catalog.get_endpoint(:cloudFiles, :ord, true) } + returns("https://storage101.ord1.clouddrive.com/v1/Mosso777") { @service_catalog.get_endpoint(:cloudFiles, :ord, false) } end tests('error conditions') do raises(RuntimeError) { @service_catalog.get_endpoint(:cloudServersOpenStack) } raises(RuntimeError) { @service_catalog.get_endpoint(:cloudServersOpenStack, :sat) } + raises(RuntimeError) { @service_catalog.get_endpoint(:cloudServersOpenStack, :sat, true) } + raises(RuntimeError) { @service_catalog.get_endpoint(:not_here, :dfw) } raises(RuntimeError) { @service_catalog.get_endpoint('non-existent') } + raises(RuntimeError) { @service_catalog.get_endpoint(:cloudServersOpenStack, :ord, true) } end end @@ -95,12 +114,41 @@ Shindo.tests('Fog::Rackspace::ServiceCatalog | users', ['rackspace']) do service = Fog::Identity[:rackspace] service_catalog = service.service_catalog - service_catalog.catalog[:fakeService] = "http:///fake-endpoint.com" + service_catalog.catalog << {"name"=>"fakeService", "endpoints"=>[{ "publicURL"=>"http:///fake-endpoint.com"}]} returns("http:///fake-endpoint.com") { service_catalog.get_endpoint :fakeService } returns("http:///fake-endpoint.com") { service.service_catalog.get_endpoint :fakeService } service_catalog.reload raises(RuntimeError) { service_catalog.get_endpoint :fakeService } raises(RuntimeError) { service.service_catalog.get_endpoint :fakeService } + end - end + tests('display_service_regions') do + + tests('with global endpoint').returns(":dfw, :ord, :global") do + catalog_hash = [{"type"=>"compute", "endpoints"=>[{"region"=>"DFW", "versionId"=>"2", + "tenantId"=>"777", "versionList"=>"https://dfw.servers.api.rackspacecloud.com/", "versionInfo"=>"https://dfw.servers.api.rackspacecloud.com/v2", + "publicURL"=>"https://dfw.servers.api.rackspacecloud.com/v2/777"}, {"region"=>"ORD", "versionId"=>"2", "tenantId"=>"777", + "versionList"=>"https://ord.servers.api.rackspacecloud.com/", "versionInfo"=>"https://ord.servers.api.rackspacecloud.com/v2", + "publicURL"=>"https://ord.servers.api.rackspacecloud.com/v2/777"}, {"versionId"=>"2", "tenantId"=>"777", "versionList"=>"https://servers.api.rackspacecloud.com/", "versionInfo"=>"https://servers.api.rackspacecloud.com/v2", "publicURL"=>"https://servers.api.rackspacecloud.com/v2/777"}], "name"=>"cloudServersOpenStack"}] + @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.new(:service => nil, :catalog => catalog_hash) + + @service_catalog.display_service_regions(:cloudServersOpenStack) + end + + tests('endpoint types') do + catalog_hash = [{"type"=>"object-store", "endpoints"=>[{"internalURL"=>"https://snet-storage101.dfw1.clouddrive.com/v1/Mosso777", "region"=>"DFW", + "tenantId"=>"Mosso777", + "publicURL"=>"https://storage101.dfw1.clouddrive.com/v1/Mosso777"}, + { "region"=>"ORD", + "tenantId"=>"Mosso777", + "publicURL"=>"https://storage101.ord1.clouddrive.com/v1/Mosso777"}], "name"=>"cloudFiles"},] + @service_catalog = Fog::Rackspace::Identity::ServiceCatalog.new(:service => nil, :catalog => catalog_hash) + tests('public').returns(":dfw, :ord") do + @service_catalog.display_service_regions(:cloudFiles) + end + tests('private').returns(":dfw") do + @service_catalog.display_service_regions(:cloudFiles, true) + end + end + end end \ No newline at end of file