From 28eb4db402279b83c3d10177f1e49fde421660fd Mon Sep 17 00:00:00 2001 From: Rodrigo Estebanez Date: Tue, 2 Jul 2013 12:49:47 +0200 Subject: [PATCH] experiment with dynamic requests based on links --- lib/fog/vcloudng/compute.rb | 18 ++++++++++++++++- lib/fog/vcloudng/models/compute/vm.rb | 16 +++++++++++++++ lib/fog/vcloudng/parsers/compute/vm.rb | 5 +++++ lib/fog/vcloudng/requests/compute/get_href.rb | 20 +++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lib/fog/vcloudng/requests/compute/get_href.rb diff --git a/lib/fog/vcloudng/compute.rb b/lib/fog/vcloudng/compute.rb index 50bdfbcfa..590469d74 100644 --- a/lib/fog/vcloudng/compute.rb +++ b/lib/fog/vcloudng/compute.rb @@ -19,6 +19,21 @@ class VcloudngParser < Fog::Parsers::Base end attributes end + + def extract_link(attributes_xml) + response = {} + link_attrs = extract_attributes(attributes_xml) + puts link_attrs["type"] + response[:type] = link_attrs["type"] + response[:rel] = link_attrs["rel"] + response[:href] = link_attrs["href"] + if response[:type] && response[:rel] + short_type = response[:type].scan(/.*\.(.*)\+/).first.first + snake_case_short_type = short_type.gsub(/([A-Z])/) { '_' + $1.downcase } + response[:method_name] = response[:rel] + '_' + snake_case_short_type + end + response + end end @@ -79,11 +94,12 @@ module Fog request :put_vm_cpu request :get_vm_memory request :put_vm_memory - request :get_request request :get_vm_disks request :put_vm_disks request :get_vm_network request :put_vm_network + request :get_request + request :get_href diff --git a/lib/fog/vcloudng/models/compute/vm.rb b/lib/fog/vcloudng/models/compute/vm.rb index 411350436..14e4cd047 100644 --- a/lib/fog/vcloudng/models/compute/vm.rb +++ b/lib/fog/vcloudng/models/compute/vm.rb @@ -19,6 +19,22 @@ module Fog attribute :cpu, :type => :integer attribute :memory attribute :hard_disks, :aliases => 'disks' + + def links + attributes["links"] + end + + def generate_methods + attributes["links"].each do |link| + next unless link[:method_name] + self.class.instance_eval do + define_method(link[:method_name]) do + puts link[:href] + service.get_href(link[:href]) + end + end + end + end def customization data = service.get_vm_customization(id).body diff --git a/lib/fog/vcloudng/parsers/compute/vm.rb b/lib/fog/vcloudng/parsers/compute/vm.rb index eed94b1f3..c0b7ee12e 100644 --- a/lib/fog/vcloudng/parsers/compute/vm.rb +++ b/lib/fog/vcloudng/parsers/compute/vm.rb @@ -13,6 +13,7 @@ module Fog @in_children = false @resource_type = nil @response = { 'vms' => [] } + @links = [] end def start_element(name, attributes) @@ -34,6 +35,8 @@ module Fog @in_children = true when 'HostResource' @current_host_resource = extract_attributes(attributes) + when 'Link' + @links << extract_link(attributes) end end @@ -63,6 +66,8 @@ module Fog @vm['disks'] ||= [] @vm['disks'] << { @element_name => @current_host_resource["capacity"].to_i } end + when 'Link' + @vm['links'] = @links when 'Vm' @response['vms'] << @vm @vm = {} diff --git a/lib/fog/vcloudng/requests/compute/get_href.rb b/lib/fog/vcloudng/requests/compute/get_href.rb new file mode 100644 index 000000000..681e6d1b8 --- /dev/null +++ b/lib/fog/vcloudng/requests/compute/get_href.rb @@ -0,0 +1,20 @@ +module Fog + module Compute + class Vcloudng + class Real + + def get_href(href) + request( + :expects => 200, + :headers => { 'Accept' => 'application/*+xml;version=1.5' }, + :method => 'GET', + :parser => Fog::ToHashDocument.new, + :override_path => true, + :path => URI.parse(href).path + ) + end + + end + end + end +end