1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

Merge pull request #2804 from rackspace/router_fix

[openstack|network] updated create_router and update_router use symbol based
This commit is contained in:
Kyle Rames 2014-04-02 14:13:55 -05:00
commit fef4d12e20
7 changed files with 94 additions and 70 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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