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

[vcloud_director] Add :put_network request

The put_network request updates OrgVdcNetwork details:

- name,
- dns properties,
- gateway

There appear to be some limitations with what the API will allow
to be changes (such as IpRanges) but the input/output of the method
is mapped as usual.

This also adds Mock support for the method.

Network tests have been adjusted so that they work in Mock and Real
mode (bar network_metadata, which is to be implemented in Mock).
This commit is contained in:
Mike Pountney 2014-06-02 22:12:08 +01:00
parent 4b55ee322b
commit 7f93dce98f
4 changed files with 242 additions and 14 deletions

View file

@ -245,6 +245,7 @@ module Fog
request :put_media_metadata_item_metadata
request :put_memory
request :put_metadata_value # deprecated
request :put_network
request :put_network_connection_system_section_vapp
request :put_vapp_metadata_item_metadata
request :put_vapp_name_and_description

View file

@ -0,0 +1,158 @@
module Fog
module Compute
class VcloudDirector
class Real
require 'fog/vcloud_director/generators/compute/org_vdc_network'
# Update an Org vDC network.
#
# This operation is asynchronous and returns a task that you can
# monitor to track the progress of the request.
#
# Produce media type(s):
# application/vnd.vmware.vcloud.orgVdcNetwork+xml
# Output type:
# TaskType
#
# @param [String] id Object identifier of the network
# @param [String] name The name of the entity.
# @param [Hash] options
# @option options [String] :Description Optional description.
# @option options [Hash] :Configuration Network configuration.
# @option options [Hash] :EdgeGateway EdgeGateway that connects this
# Org vDC network. Applicable only for routed networks.
# @option options [Hash] :ServiceConfig Specifies the service
# configuration for an isolated Org vDC networks.
# @option options [Boolean] :IsShared True if this network is shared
# to multiple Org vDCs.
# * :Configuration<~Hash>: NetworkConfigurationType
# * :IpScopes<~Hash>:
# * :IpScope<~Hash>:
# * :IsInherited<~Boolean>: ?
# * :Gateway<~String>: IP address of gw
# * :Netmask<~String>: Subnet mask of network
# * :Dns1<~String>: Primary DNS server.
# * :Dns2<~String>: Secondary DNS server.
# * :DnsSuffix<~String>: DNS suffix.
# * :IsEnabled<~String>: Indicates if subnet is enabled or not.
# Default value is True.
# * :IpRanges<~Array>: IP ranges used for static pool allocation
# in the network. Array of Hashes of:
# * :StartAddress - start IP in range
# * :EndAddress - end IP in range
# * :EdgeGateway<~Hash>: EdgeGateway that connects this Org vDC
# network. Applicable only for routed networks.
# * :ServiceConfig<~Hash>: Specifies the service configuration for an
# isolated network
#
# @return [Excon::Response]
# * body<~Hash>:
#
# @see http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/doc/operations/POST-CreateOrgVdcNetwork.html
# @since vCloud API version 5.1
def put_network(id, name, options={})
body = Fog::Generators::Compute::VcloudDirector::OrgVdcNetwork.new(options.merge(:name => name)).generate_xml
request(
:body => body,
:expects => 202,
:headers => {'Content-Type' => 'application/vnd.vmware.vcloud.orgVdcNetwork+xml'},
:method => 'PUT',
:parser => Fog::ToHashDocument.new,
:path => "admin/network/#{id}"
)
end
end
class Mock
def put_network(id, name, options={})
original_network = data[:networks][id]
unless original_network
raise Fog::Compute::VcloudDirector::Forbidden.new(
"No access to entity \"(com.vmware.vcloud.entity.orgVdcNetwork:#{id})\"."
)
end
type = 'network'
# Description
# Configuration
# IpScopes
# IpScope
# IsInherited
# Gateway
# Netmask
# Dns1
# Dns2
# DnsSuffix
# IsEnabled
# IpRanges
# IpRange
# StartAddress
# EndAddress
# FenceMode
# EdgeGateway
# IsShared
#
vdc_id = original_network[:vdc],
network_body = {
:name => name,
:vdc => vdc_id,
}
[:Description, :IsShared].each do |key|
network_body[key] = options[key] if options.key?(key)
end
if options.key?(:EdgeGateway)
network_body[:EdgeGateway] =
options[:EdgeGateway][:href].split('/').last
end
if configuration = options[:Configuration]
if ip_scopes = configuration[:IpScopes]
if ip_scope = ip_scopes[:IpScope]
[:IsInherited, :Gateway, :Netmask,
:Dns1, :Dns2, :DnsSuffix, :IsEnabled].each do |key|
network_body[key] = ip_scope[key] if ip_scope.key?(key)
end
if ip_ranges = ip_scope[:IpRanges]
network_body[:IpRanges] = []
ip_ranges.each do |ipr|
network_body[:IpRanges] << {
:StartAddress => ipr[:IpRange][:StartAddress],
:EndAddress => ipr[:IpRange][:EndAddress]
}
end
end
end
end
network_body[:FenceMode] = configuration[:FenceMode] if ip_scope.key?(:FenceMode)
end
owner = {:href => '', :name => nil, :type => nil} #known-bug: admin-api does not return owner.
task_id = enqueue_task(
"Updating #{type} #{name} (#{id})", 'networkUpdateNetwork', owner,
:on_success => lambda do
data[:networks][id] = network_body
end
)
body = {
:xmlns => xmlns,
:xmlns_xsi => xmlns_xsi,
:xsi_schemaLocation => xsi_schema_location,
}.merge(task_body(task_id))
Excon::Response.new(
:status => 202,
:headers => {'Content-Type' => "#{body[:type]};version=#{api_version}"},
:body => body
)
end
end
end
end
end

View file

@ -50,16 +50,6 @@ Shindo.tests('Compute::VcloudDirector | network requests', ['vclouddirector']) d
@service.get_network(@network_id).body
end
tests('#get_network_complete').data_matches_schema(VcloudDirector::Compute::Schema::NETWORK_TYPE) do
pending if Fog.mocking?
link = @org[:Link].find do |l|
l[:rel] == 'down' && l[:type] == 'application/vnd.vmware.vcloud.orgNetwork+xml'
end
pending unless link # nothing to test here cannot continue
@network_id = link[:href].split('/').last
@service.get_network_complete(@network_id).body
end
tests('#get_network_metadata').data_matches_schema(VcloudDirector::Compute::Schema::METADATA_TYPE) do
pending if Fog.mocking?
pending unless @network_id # nothing to test here cannot continue
@ -67,7 +57,7 @@ Shindo.tests('Compute::VcloudDirector | network requests', ['vclouddirector']) d
end
tests('#post_create_org_vdc_network') do
pending unless Fog.mocking?
#pending unless Fog.mocking?
link = @org[:Link].find do |l|
l[:rel] == 'down' && l[:type] == 'application/vnd.vmware.vcloud.vdc+xml'
end
@ -101,13 +91,91 @@ Shindo.tests('Compute::VcloudDirector | network requests', ['vclouddirector']) d
@service.process_task(body[:Tasks][:Task]) if body && body.key?(:Tasks)
tests('fetched name matches created name').returns(name) do
net = @service.get_network(@created_net_id).body
net = @service.get_network_complete(@created_net_id).body
net[:name]
end
end
tests('#get_network_complete schema').data_matches_schema(VcloudDirector::Compute::Schema::NETWORK_TYPE) do
link = @org[:Link].find do |l|
l[:rel] == 'down' && l[:type] == 'application/vnd.vmware.vcloud.orgNetwork+xml'
end
pending unless link # nothing to test here cannot continue
@network_id = link[:href].split('/').last
@service.get_network_complete(@network_id).body
end
tests('#get_network_complete') do
new_network = @service.get_network_complete(@created_net_id).body
tests('network has a :name') do
new_network.fetch(:name)
end
tests('network has a :Description') do
new_network.fetch(:Description)
end
tests('network has a :Gateway') do
new_network[:Configuration][:IpScopes][:IpScope][:Gateway]
end
tests('network has a several :IpRanges') do
new_network[:Configuration][:IpScopes][:IpScope][:IpRanges].size >= 1
end
end
tests('#put_network') do
new_options = {
:Description => "Testing put_network",
:Configuration => {
:IpScopes => {
:IpScope => {
:IsInherited => 'false',
:Gateway => '198.51.100.1',
:Netmask => '255.255.255.0',
:Dns1 => '198.51.100.2',
:Dns2 => '198.51.100.3',
:DnsSuffix => 'example.com',
:IpRanges => [
{ :IpRange => { :StartAddress => '198.51.100.10', :EndAddress => '198.51.100.20' } },
{ :IpRange => { :StartAddress => '198.51.100.30', :EndAddress => '198.51.100.40' } },
]
},
},
:FenceMode => 'isolated',
}
}
original_network = @service.get_network_complete(@created_net_id).body
name = original_network[:name]
task = @service.put_network(@created_net_id, name, new_options).body
@service.process_task(task)
tests('fetched :Gateway matches updated :Gateway').returns(
new_options[:Configuration][:IpScopes][:IpScope][:Gateway]
) do
net = @service.get_network_complete(@created_net_id).body
net[:Configuration][:IpScopes][:IpScope][:Gateway]
end
tests('fetched :IpRanges count is matches updated data').returns(
new_options[:Configuration][:IpScopes][:IpScope][:IpRanges].size
) do
net = @service.get_network_complete(@created_net_id).body
# dammit, the API returns with IpRange as a list, not IpRanges
net[:Configuration][:IpScopes][:IpScope][:IpRanges][:IpRange].size
end
tests('fetched :Network matches updated :Description').returns(
new_options[:Description]
) do
net = @service.get_network_complete(@created_net_id).body
net[:Description]
end
end
tests('#delete_network') do
pending unless Fog.mocking?
@delete_task = @service.delete_network(@created_net_id).body
@service.process_task(@delete_task)
tests('created network has been deleted').raises(Fog::Compute::VcloudDirector::Forbidden) do

View file

@ -619,7 +619,9 @@ class VcloudDirector
:Netmask => String,
:Dns1 => String,
:Dns2 => String,
:DnsSuffix => String,
:IsEnabled=> String,
:IpRanges=> IP_RANGES_TYPE,
}
},
:FenceMode => String,
@ -630,7 +632,6 @@ class VcloudDirector
:name => String,
:href => String,
:type => String,
:status => String,
:id => String,
:Description => String,
:Configuration => NETWORK_CONFIGURATION_TYPE,