diff --git a/lib/fog/hp/models/network/router.rb b/lib/fog/hp/models/network/router.rb index d9eac914c..131e8a882 100644 --- a/lib/fog/hp/models/network/router.rb +++ b/lib/fog/hp/models/network/router.rb @@ -10,7 +10,7 @@ module Fog attribute :name attribute :tenant_id attribute :external_gateway_info - attribute :admin_state_up + attribute :admin_state_up, :type => :boolean attribute :status def destroy diff --git a/lib/fog/openstack/models/network/router.rb b/lib/fog/openstack/models/network/router.rb index 00ecc80c4..8ce6c37fb 100644 --- a/lib/fog/openstack/models/network/router.rb +++ b/lib/fog/openstack/models/network/router.rb @@ -32,15 +32,17 @@ module Fog def create requires :name - merge_attributes(service.create_router(self.name, - self.attributes).body['router']) + + response = service.create_router(self.name, options) + merge_attributes(response.body['router']) + self end def update requires :id - merge_attributes(service.update_router(self.id, - self.attributes).body['router']) + response = service.update_router(self.id, options) + merge_attributes(response.body['router']) self end @@ -50,6 +52,21 @@ module Fog true end + private + + def options + options = self.attributes.dup + + if options[:external_gateway_info] + if options[:external_gateway_info].is_a?(Fog::Network::OpenStack::Network) + options[:external_gateway_info] = { :network_id => options[:external_gateway_info].id } + else + options[:external_gateway_info] = { :network_id => options[:external_gateway_info]} + end + end + options + end + end end end diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index 38696abab..273212e90 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -14,15 +14,27 @@ module Fog :admin_state_up, :tenant_id, :network_id, - :external_gateway_info, :status, :subnet_id ] - vanilla_options.reject{ |o| options[o].nil? }.each do |key| data['router'][key] = options[key] end + # remove this in a future + egi = options[:external_gateway_info] + if egi + if egi.is_a?(Fog::Network::OpenStack::Network) + Fog::Logger.deprecation "Passing a model objects into options[:external_gateway_info] is deprecated. \ + Please pass external external gateway as follows options[:external_gateway_info] = { :network_id => NETWORK_ID }]" + data['router'][:external_gateway_info] = { :network_id => egi.id } + elsif egi.is_a?(Hash) && egi[:network_id] + data['router'][:external_gateway_info] = egi + else + raise ArgumentError.new('Invalid external_gateway_info attribute') + end + end + request( :body => Fog::JSON.encode(data), :expects => [201], @@ -36,17 +48,26 @@ module Fog def create_router(name, options = {}) response = Excon::Response.new response.status = 201 + + # remove this in a future + egi = options[:external_gateway_info] + if egi && egi.is_a?(Fog::Network::OpenStack::Network) + Fog::Logger.deprecation "Passing a model objects into options[:external_gateway_info] is deprecated. \ + Please pass external external gateway as follows options[:external_gateway_info] = { :network_id => NETWORK_ID }]" + egi = { :network_id => egi.id } + end + data = { 'router' => { - 'id' => Fog::Mock.random_numbers(6).to_s, - 'status' => options[:status] || 'ACTIVE', - 'external_gateway_info' => options[:external_gateway_info], - 'name' => name, - 'admin_state_up' => options[:admin_state_up], - 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3' + :id => Fog::Mock.random_numbers(6).to_s, + :status => options[:status] || 'ACTIVE', + :external_gateway_info => egi, + :name => name, + :admin_state_up => options[:admin_state_up], + :tenant_id => '6b96ff0cb17a4b859e1e575d221683d3' } } - self.data[:routers][data['router']['id']] = data['router'] + self.data[:routers][data['router'][:id]] = data['router'] response.body = data response end diff --git a/lib/fog/openstack/requests/network/delete_router.rb b/lib/fog/openstack/requests/network/delete_router.rb index 5f957aab3..5d8eabf15 100644 --- a/lib/fog/openstack/requests/network/delete_router.rb +++ b/lib/fog/openstack/requests/network/delete_router.rb @@ -15,7 +15,7 @@ module Fog class Mock def delete_router(router_id) response = Excon::Response.new - if list_routers.body['routers'].map { |r| r['id'] }.include? router_id + if list_routers.body['routers'].find { |r| r[:id] == router_id } self.data[:routers].delete(router_id) response.status = 204 response diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index 9045df751..b1e320e64 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -9,39 +9,28 @@ module Fog # Beyond the name and the administrative state, the only # parameter which can be updated with this operation is # the external gateway. - # - # router = Fog::Network[:openstack].routers.first - # net = Fog::Network[:openstack].networks.first - # - # # :external_gateway_info can be either a - # # Fog::Network::OpenStack::Network or a Hash - # # like { 'network_id' => network.id } - # Fog::Network[:openstack].update_router router.id, - # :name => 'foo', - # :external_gateway_info => net, - # :admin_state_up => true - # # @see http://docs.openstack.org/api/openstack-network/2.0/content/router_update.html def update_router(router_id, options = {}) data = { 'router' => {} } - vanilla_options = [:name, :admin_state_up] + [:name, :admin_state_up].each do |key| + data['router'][key] = options[key] if options[key] + end + # remove this in a future egi = options[:external_gateway_info] if egi if egi.is_a?(Fog::Network::OpenStack::Network) - data['router']['external_gateway_info'] = { 'network_id' => egi.id } - elsif egi.is_a?(Hash) and egi['network_id'] - data['router']['external_gateway_info'] = egi + Fog::Logger.deprecation "Passing a model objects into options[:external_gateway_info] is deprecated. \ + Please pass external external gateway as follows options[:external_gateway_info] = { :network_id => NETWORK_ID }]" + data['router'][:external_gateway_info] = { :network_id => egi.id } + elsif egi.is_a?(Hash) and egi[:network_id] + data['router'][:external_gateway_info] = egi else raise ArgumentError.new('Invalid external_gateway_info attribute') end end - vanilla_options.reject{ |o| options[o].nil? }.each do |key| - data['router'][key] = options[key] - end - request( :body => Fog::JSON.encode(data), :expects => 200, @@ -54,29 +43,27 @@ module Fog class Mock def update_router(router_id, options = {}) response = Excon::Response.new - router = list_routers.body['routers'].detect do |_| - _['id'] == router_id - end - if router - egi = options[:external_gateway_info] - if egi - if egi.is_a?(Fog::Network::OpenStack::Network) - router['external_gateway_info'] = { 'network_id' => egi.id } - elsif egi.is_a?(Hash) and egi['network_id'] - router['external_gateway_info'] = egi - else - raise ArgumentError.new('Invalid external_gateway_info attribute') - end + router = list_routers.body['routers'].find {|r| r[:id] == router_id} + + raise Fog::Network::OpenStack::NotFound unless router + + options.keys.each {|k| router[k] = options[k] } + + # remove this in a future + egi = options[:external_gateway_info] + if egi + if egi.is_a?(Fog::Network::OpenStack::Network) + Fog::Logger.deprecation "Passing a model objects into options[:external_gateway_info] is deprecated. \ + Please pass external external gateway as follows options[:external_gateway_info] = { :network_id => NETWORK_ID }]" + router[:external_gateway_info] = { :network_id => egi.id } + else egi.is_a?(Hash) && egi[:network_id] + router[:external_gateway_info] = egi end - options.keys.each do |k| - router[k.to_s] = options[k] - end - response.body = { 'router' => router } - response.status = 200 - response - else - raise Fog::Network::OpenStack::NotFound end + + response.body = { 'router' => router } + response.status = 200 + response end end diff --git a/tests/openstack/models/network/router_tests.rb b/tests/openstack/models/network/router_tests.rb index 9390fe8ee..268112695 100644 --- a/tests/openstack/models/network/router_tests.rb +++ b/tests/openstack/models/network/router_tests.rb @@ -11,9 +11,10 @@ Shindo.tests("Fog::Network[:openstack] | router", ['openstack']) do end tests('#update') do - test 'router name' do + test('router name') do @instance.name = 'new_name' - @instance.update.name == 'new_name' + @instance.update + @instance.name == 'new_name' end # Needs code from issue #1598 #test 'external_gateway_info' do diff --git a/tests/openstack/requests/network/router_tests.rb b/tests/openstack/requests/network/router_tests.rb index a0df1a6e2..75a3ea4c0 100644 --- a/tests/openstack/requests/network/router_tests.rb +++ b/tests/openstack/requests/network/router_tests.rb @@ -1,12 +1,12 @@ Shindo.tests('Fog::Network[:openstack] | router requests', ['openstack']) do @router_format = { - 'id' => String, - 'name' => String, - 'status' => String, - 'admin_state_up' => Fog::Boolean, - 'tenant_id' => String, - 'external_gateway_info' => Fog::Nullable::Hash, + :id => String, + :name => String, + :status => String, + :admin_state_up => Fog::Boolean, + :tenant_id => String, + :external_gateway_info => Fog::Nullable::Hash, } tests('success') do @@ -29,12 +29,11 @@ Shindo.tests('Fog::Network[:openstack] | router requests', ['openstack']) do tests('#update_router').formats({'router' => @router_format}) do router_id = Fog::Network[:openstack].routers.all.first.id - attributes = {} - { + attributes = { :name => 'net_name', :external_gateway_info => { :network_id => 'net_id' }, :status => 'ACTIVE', - :admin_state_up => 'true' + :admin_state_up => true } Fog::Network[:openstack].update_router(router_id, attributes).body end @@ -42,12 +41,11 @@ Shindo.tests('Fog::Network[:openstack] | router requests', ['openstack']) do tests('#update_router_with_network').formats({'router' => @router_format}) do router_id = Fog::Network[:openstack].routers.all.first.id net = Fog::Network[:openstack].networks.first - attributes = {} - { + attributes = { :name => 'net_name', :external_gateway_info => net, :status => 'ACTIVE', - :admin_state_up => 'true' + :admin_state_up => true } Fog::Network[:openstack].update_router(router_id, attributes).body end