diff --git a/lib/fog/openstack/requests/network/create_network.rb b/lib/fog/openstack/requests/network/create_network.rb index de0084b60..08902d2fd 100644 --- a/lib/fog/openstack/requests/network/create_network.rb +++ b/lib/fog/openstack/requests/network/create_network.rb @@ -10,16 +10,28 @@ module Fog :name, :shared, :admin_state_up, - :tenant_id, - :router_external, - :provider_network_type, - :provider_segmentation_id, - :provider_physical_network + :tenant_id ] + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['network'][key] = options[key] + end + # Advanced Features through API Extensions # + # Not strictly required but commonly found in OpenStack + # installs with Quantum networking. + # # @see http://docs.openstack.org/trunk/openstack-network/admin/content/provider_attributes.html + provider_options = [ + :router_external, + :provider_network_type, + :provider_segmentation_id, + :provider_physical_network + ] + + # Map Fog::Network::OpenStack::Network + # model attributes to OpenStack provider attributes aliases = { :provider_network_type => 'provider:network_type', # Not applicable to the "local" or "gre" network types @@ -28,7 +40,7 @@ module Fog :router_external => 'router:external' } - vanilla_options.reject{ |o| options[o].nil? }.each do |key| + provider_options.reject{ |o| options[o].nil? }.each do |key| aliased_key = aliases[key] || key data['network'][aliased_key] = options[key] end @@ -55,6 +67,27 @@ module Fog 'admin_state_up' => options[:admin_state_up], 'tenant_id' => options[:tenant_id], } + + # Add provider specific attributes when found + # + provider_options = [ + :router_external, + :provider_network_type, + :provider_segmentation_id, + :provider_physical_network + ] + aliases = { + :provider_network_type => 'provider:network_type', + # Not applicable to the "local" or "gre" network types + :provider_physical_network => 'provider:physical_network', + :provider_segmentation_id => 'provider:segmentation_id', + :router_external => 'router:external' + } + provider_options.reject{ |o| options[o].nil? }.each do |key| + aliased_key = aliases[key] || key + data[aliased_key] = options[key] + end + self.data[:networks][data['id']] = data response.body = { 'network' => data } response diff --git a/tests/openstack/requests/network/network_tests.rb b/tests/openstack/requests/network/network_tests.rb index adb9425f4..ad1c32337 100644 --- a/tests/openstack/requests/network/network_tests.rb +++ b/tests/openstack/requests/network/network_tests.rb @@ -7,11 +7,14 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do 'shared' => Fog::Boolean, 'status' => String, 'admin_state_up' => Fog::Boolean, - 'tenant_id' => String, + 'tenant_id' => String + } + + @network_format_extensions = { 'router:external' => Fog::Boolean, 'provider:network_type' => String, 'provider:physical_network' => Fog::Nullable::String, - 'provider:segmentation_id' => Integer, + 'provider:segmentation_id' => Integer } tests('success') do @@ -25,7 +28,7 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do Fog::Network[:openstack].create_network(attributes).body end tests('#create_network+provider extensions').formats( - {'network' => @network_format} + {'network' => @network_format.merge(@network_format_extensions)} ) do attributes = { :name => 'net_name', @@ -68,6 +71,8 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do tests('#create_network+provider extensions').raises( Excon::Errors::BadRequest ) do + pending if Fog.mocking? + attributes = { :name => 'net_name', :shared => false,