From 1371c15dafca5bfd863fc90c02bf8ee1c21c4bac Mon Sep 17 00:00:00 2001 From: Rodrigo Estebanez Date: Wed, 3 Jul 2013 13:10:31 +0200 Subject: [PATCH] tags implemented --- lib/fog/vcloudng/compute.rb | 6 ++ .../vcloudng/generators/compute/metadata.rb | 73 +++++++++++++++++++ lib/fog/vcloudng/models/compute/tag.rb | 49 +++++++++++++ lib/fog/vcloudng/models/compute/tags.rb | 47 ++++++++++++ lib/fog/vcloudng/models/compute/vm.rb | 5 ++ lib/fog/vcloudng/parsers/compute/metadata.rb | 66 +++++++++++++++++ .../requests/compute/delete_vm_metadata.rb | 21 ++++++ .../requests/compute/get_vm_metadata.rb | 21 ++++++ .../requests/compute/post_vm_metadata.rb | 25 +++++++ .../requests/compute/put_vm_metadata_value.rb | 26 +++++++ 10 files changed, 339 insertions(+) create mode 100644 lib/fog/vcloudng/generators/compute/metadata.rb create mode 100644 lib/fog/vcloudng/models/compute/tag.rb create mode 100644 lib/fog/vcloudng/models/compute/tags.rb create mode 100644 lib/fog/vcloudng/parsers/compute/metadata.rb create mode 100644 lib/fog/vcloudng/requests/compute/delete_vm_metadata.rb create mode 100644 lib/fog/vcloudng/requests/compute/get_vm_metadata.rb create mode 100644 lib/fog/vcloudng/requests/compute/post_vm_metadata.rb create mode 100644 lib/fog/vcloudng/requests/compute/put_vm_metadata_value.rb diff --git a/lib/fog/vcloudng/compute.rb b/lib/fog/vcloudng/compute.rb index 590469d74..bc44db349 100644 --- a/lib/fog/vcloudng/compute.rb +++ b/lib/fog/vcloudng/compute.rb @@ -74,6 +74,8 @@ module Fog collection :disks model :vm_network collection :vm_networks + model :tag # this is called metadata in vcloud + collection :tags request_path 'fog/vcloudng/requests/compute' request :get_organizations @@ -98,6 +100,10 @@ module Fog request :put_vm_disks request :get_vm_network request :put_vm_network + request :get_vm_metadata + request :post_vm_metadata + request :put_vm_metadata_value + request :delete_vm_metadata request :get_request request :get_href diff --git a/lib/fog/vcloudng/generators/compute/metadata.rb b/lib/fog/vcloudng/generators/compute/metadata.rb new file mode 100644 index 000000000..5f956b1b1 --- /dev/null +++ b/lib/fog/vcloudng/generators/compute/metadata.rb @@ -0,0 +1,73 @@ +# +# +# {:metadata=>{"buenas si"=>"no tanto ya", "hola"=>"adios"}, +# :type=>"application/vnd.vmware.vcloud.metadata+xml", +# :href=> +# "https://devlab.mdsol.com/api/vApp/vm-18545e82-d919-4071-ae7e-d1300d9d8112/metadata", +# :id=>"vm-18545e82-d919-4071-ae7e-d1300d9d8112"} +# +# +# +# buenas si +# no tanto ya +# +# +# hola +# adios +# +# + +module Fog + module Generators + module Compute + module Vcloudng + + class Metadata + + attr_reader :attrs + + def initialize(attrs={}) + @attrs = attrs + end + + def generate_xml + output = "" + output << header + attrs[:metadata].each_pair do |k,v| + output << metadata_entry(k,v) + end + output << tail + output + end + + def add_item(k,v) + @attrs[:metadata].merge!(Hash[k,v]) + end + + def header + ' + ' + end + + + def metadata_entry(key,value) + body = < + #{key} + #{value} + +EOF + end + + def tail + '' + end + + end + end + end + end +end \ No newline at end of file diff --git a/lib/fog/vcloudng/models/compute/tag.rb b/lib/fog/vcloudng/models/compute/tag.rb new file mode 100644 index 000000000..7a0bc3414 --- /dev/null +++ b/lib/fog/vcloudng/models/compute/tag.rb @@ -0,0 +1,49 @@ +require 'fog/core/model' + +module Fog + module Compute + class Vcloudng + + class Tag < Fog::Model + + + identity :id, :aliases => :key + attribute :value + + + def save + if value_changed? + puts "Debug: change the value from #{attributes[:old_value]} to #{attributes[:value]}" + set_value(value) + attributes[:value_task].wait_for { :ready? } + end + end + + def value=(new_value) + attributes[:old_value] ||= attributes[:value] + attributes[:value] = new_value + end + + def value_changed? + return false unless attributes[:old_value] + attributes[:value] != attributes[:old_value] + end + + def set_value(new_value) + response = service.put_vm_metadata_value(attributes[:vm_id], id, value) + task = response.body + task[:id] = task[:href].split('/').last + attributes[:value_task] = service.tasks.new(task) + end + + def destroy + response = service.delete_vm_metadata(attributes[:vm_id], id) + task = response.body + task[:id] = task[:href].split('/').last + attributes[:destroy_tag_task] = service.tasks.new(task) + end + + end + end + end +end diff --git a/lib/fog/vcloudng/models/compute/tags.rb b/lib/fog/vcloudng/models/compute/tags.rb new file mode 100644 index 000000000..35674f362 --- /dev/null +++ b/lib/fog/vcloudng/models/compute/tags.rb @@ -0,0 +1,47 @@ +require 'fog/core/collection' +require 'fog/vcloudng/models/compute/tag' + +module Fog + module Compute + class Vcloudng + + class Tags < Fog::Collection + model Fog::Compute::Vcloudng::Tag + + attribute :vm_id + + def index + tags.keys.map{ |key| new({key: key, value: tags[key] }.merge(vm_id: vm_id))} + end + + def all + index + end + + def get(tag_id) + tag = tags.detect{ |tag| tag.keys.first == tag_id } + return nil unless tag + new(tag.merge(vm_id: vm_id)) + end + + def create(key,value) + tags unless @tags + data = Fog::Generators::Compute::Vcloudng::Metadata.new(@tags) + data.add_item(key,value) + response = service.post_vm_metadata(vm_id, data.attrs) + task = response.body + task[:id] = task[:href].split('/').last + attributes[:crate_tag_task] = service.tasks.new(task) + end + +# private + + def tags + @tags = service.get_vm_metadata(vm_id).body + @tags[:metadata] + end + + end + end + end +end diff --git a/lib/fog/vcloudng/models/compute/vm.rb b/lib/fog/vcloudng/models/compute/vm.rb index 14e4cd047..1cb55d326 100644 --- a/lib/fog/vcloudng/models/compute/vm.rb +++ b/lib/fog/vcloudng/models/compute/vm.rb @@ -35,6 +35,11 @@ module Fog end end end + + def tags + requires :id + service.tags(:vm_id => id) + end def customization data = service.get_vm_customization(id).body diff --git a/lib/fog/vcloudng/parsers/compute/metadata.rb b/lib/fog/vcloudng/parsers/compute/metadata.rb new file mode 100644 index 000000000..42019c186 --- /dev/null +++ b/lib/fog/vcloudng/parsers/compute/metadata.rb @@ -0,0 +1,66 @@ +# +# +# +# +# +# +# +# +# buenas si +# no tanto ya +# +# +# +# +# +# hola +# adios +# +# +# +# +# {:metadata=>{"buenas si"=>"no tanto ya", "hola"=>"adios"}, +# :type=>"application/vnd.vmware.vcloud.metadata+xml", +# :href=> +# "https://devlab.mdsol.com/api/vApp/vm-18545e82-d919-4071-ae7e-d1300d9d8112/metadata", +# :id=>"vm-18545e82-d919-4071-ae7e-d1300d9d8112"} +# +module Fog + module Parsers + module Compute + module Vcloudng + + class Metadata < VcloudngParser + + def reset + @response = { :metadata => {} } + end + + def start_element(name, attributes) + super + case name + when 'Metadata' + metadata = extract_attributes(attributes) + @response[:type] = metadata['type'] + @response[:href] = metadata['href'] + @response[:id] = @response[:href].split('/')[-2] + end + end + + def end_element(name) + case name + when 'Key' + @key = value + when 'Value' + @val = value + when 'MetadataEntry' + @response[:metadata].merge!(Hash[@key, @val]) + end + end + + end + + end + end + end +end diff --git a/lib/fog/vcloudng/requests/compute/delete_vm_metadata.rb b/lib/fog/vcloudng/requests/compute/delete_vm_metadata.rb new file mode 100644 index 000000000..4f0f60587 --- /dev/null +++ b/lib/fog/vcloudng/requests/compute/delete_vm_metadata.rb @@ -0,0 +1,21 @@ +module Fog + module Compute + class Vcloudng + class Real + + def delete_vm_metadata(vm_id, metadata_key) + require 'fog/vcloudng/parsers/compute/metadata' + + request( + :expects => 202, + :headers => { 'Accept' => 'application/*+xml;version=1.5' }, + :method => 'DELETE', + :parser => Fog::ToHashDocument.new, + :path => "vApp/#{vm_id}/metadata/#{URI.escape(metadata_key)}" + ) + end + + end + end + end +end diff --git a/lib/fog/vcloudng/requests/compute/get_vm_metadata.rb b/lib/fog/vcloudng/requests/compute/get_vm_metadata.rb new file mode 100644 index 000000000..17808c495 --- /dev/null +++ b/lib/fog/vcloudng/requests/compute/get_vm_metadata.rb @@ -0,0 +1,21 @@ +module Fog + module Compute + class Vcloudng + class Real + + def get_vm_metadata(vm_id) + require 'fog/vcloudng/parsers/compute/metadata' + + request( + :expects => 200, + :headers => { 'Accept' => 'application/*+xml;version=1.5' }, + :method => 'GET', + :parser => Fog::Parsers::Compute::Vcloudng::Metadata.new, + :path => "vApp/#{vm_id}/metadata/" + ) + end + + end + end + end +end diff --git a/lib/fog/vcloudng/requests/compute/post_vm_metadata.rb b/lib/fog/vcloudng/requests/compute/post_vm_metadata.rb new file mode 100644 index 000000000..35342d0e6 --- /dev/null +++ b/lib/fog/vcloudng/requests/compute/post_vm_metadata.rb @@ -0,0 +1,25 @@ +module Fog + module Compute + class Vcloudng + class Real + + require 'fog/vcloudng/generators/compute/metadata' + + def post_vm_metadata(vm_id, metadata={}) + + data = Fog::Generators::Compute::Vcloudng::Metadata.new(metadata) + + request( + :body => data.generate_xml, + :expects => 202, + :headers => { 'Content-Type' => "application/vnd.vmware.vcloud.metadata+xml", + 'Accept' => 'application/*+xml;version=1.5' }, + :method => 'POST', + :parser => Fog::ToHashDocument.new, + :path => "vApp/#{vm_id}/metadata/" + ) + end + end + end + end +end diff --git a/lib/fog/vcloudng/requests/compute/put_vm_metadata_value.rb b/lib/fog/vcloudng/requests/compute/put_vm_metadata_value.rb new file mode 100644 index 000000000..e0757192c --- /dev/null +++ b/lib/fog/vcloudng/requests/compute/put_vm_metadata_value.rb @@ -0,0 +1,26 @@ +module Fog + module Compute + class Vcloudng + class Real + + def put_vm_metadata_value(vm_id, metadata_key, metadata_value) + body=" + + #{metadata_value} + " + + + request( + :body => body, + :expects => 202, + :headers => { 'Content-Type' => "application/vnd.vmware.vcloud.metadata.value+xml", + 'Accept' => 'application/*+xml;version=1.5' }, + :method => 'PUT', + :parser => Fog::ToHashDocument.new, + :path => "vApp/#{vm_id}/metadata/#{URI.escape(metadata_key)}" + ) + end + end + end + end +end