From f11d18bc2a1689520d64b286df9624f4d1d18b05 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Mon, 29 Feb 2016 16:11:50 +0000 Subject: [PATCH 1/9] require builder --- fog.gemspec | 3 ++- .../requests/compute/instantiate_vapp_template.rb | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fog.gemspec b/fog.gemspec index 89b9d7d9c..9f9ccca04 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -49,6 +49,7 @@ Gem::Specification.new do |s| s.add_dependency("fog-xml", "~> 0.1.1") s.add_dependency("ipaddress", "~> 0.5") + s.add_dependenct("builder", ">=3.2.2") # Modular providers (please keep sorted) s.add_dependency("fog-aliyun",">= 0.1.0") @@ -75,7 +76,7 @@ Gem::Specification.new do |s| s.add_dependency("fog-voxel") s.add_dependency("fog-vsphere", ">= 0.4.0") s.add_dependency("fog-xenserver") - + s.add_development_dependency("docker-api", ">= 1.13.6") s.add_development_dependency("fission") s.add_development_dependency("mime-types") diff --git a/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb b/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb index d1c7bc31e..14243cfa1 100644 --- a/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb +++ b/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb @@ -1,3 +1,5 @@ +require 'builder' + module Fog module Compute class VcloudDirector From 989aadb3d7d51981c3a3e4e6871b6a894fb1ef19 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Tue, 1 Mar 2016 16:35:30 +0000 Subject: [PATCH 2/9] [vcloud director] access vApp Template Virtual Machines from Catalog Items --- fog.gemspec | 4 +- lib/fog/vcloud_director/README.md | 3 + lib/fog/vcloud_director/compute.rb | 6 ++ .../models/compute/catalog_item.rb | 7 ++ .../models/compute/template_vm.rb | 60 +++++++++++++++ .../models/compute/template_vms.rb | 41 ++++++++++ .../models/compute/vapp_template.rb | 26 +++++++ .../models/compute/vapp_templates.rb | 40 ++++++++++ lib/fog/vcloud_director/models/compute/vdc.rb | 5 ++ .../requests/compute/get_template_vm.rb | 74 +++++++++++++++++++ .../requests/compute/get_template_vms.rb | 41 ++++++++++ .../requests/compute/get_vdc.rb | 2 +- .../models/compute/catalog_items_tests.rb | 1 + .../models/compute/vapp_template_tests.rb | 29 ++++++++ 14 files changed, 336 insertions(+), 3 deletions(-) create mode 100644 lib/fog/vcloud_director/models/compute/template_vm.rb create mode 100644 lib/fog/vcloud_director/models/compute/template_vms.rb create mode 100644 lib/fog/vcloud_director/models/compute/vapp_template.rb create mode 100644 lib/fog/vcloud_director/models/compute/vapp_templates.rb create mode 100644 lib/fog/vcloud_director/requests/compute/get_template_vm.rb create mode 100644 lib/fog/vcloud_director/requests/compute/get_template_vms.rb create mode 100644 tests/vcloud_director/models/compute/vapp_template_tests.rb diff --git a/fog.gemspec b/fog.gemspec index 9f9ccca04..11fe7399b 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -49,8 +49,7 @@ Gem::Specification.new do |s| s.add_dependency("fog-xml", "~> 0.1.1") s.add_dependency("ipaddress", "~> 0.5") - s.add_dependenct("builder", ">=3.2.2") - + # Modular providers (please keep sorted) s.add_dependency("fog-aliyun",">= 0.1.0") s.add_dependency("fog-atmos") @@ -96,6 +95,7 @@ Gem::Specification.new do |s| s.add_development_dependency("rspec-expectations") s.add_development_dependency("vcr") s.add_development_dependency("webmock","~>1.22.2") + s.add_development_dependency("builder", ">=3.2.2") s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {spec,tests}/*`.split("\n") diff --git a/lib/fog/vcloud_director/README.md b/lib/fog/vcloud_director/README.md index 0d314c208..4cf91571c 100644 --- a/lib/fog/vcloud_director/README.md +++ b/lib/fog/vcloud_director/README.md @@ -12,8 +12,11 @@ organizations -> disks -> disk -> tags -> tag -> power_on + + vapp_templates -> vms -> vm networks -> network catalogs -> catalog -> catalog_items -> catalog_item -> instantiate_vapp + -> vapp_template -> vms -> vm medias -> media ``` diff --git a/lib/fog/vcloud_director/compute.rb b/lib/fog/vcloud_director/compute.rb index 6b4876134..78252205c 100644 --- a/lib/fog/vcloud_director/compute.rb +++ b/lib/fog/vcloud_director/compute.rb @@ -55,6 +55,10 @@ module Fog model :organization collection :organizations model :catalog_item + collection :vapp_templates + model :vapp_template + collection :template_vms + model :template_vm collection :catalog_items model :custom_field collection :custom_fields @@ -159,6 +163,8 @@ module Fog request :get_supported_versions request :get_task request :get_task_list + request :get_template_vm + request :get_template_vms request :get_thumbnail request :get_users_from_query request :get_vapp diff --git a/lib/fog/vcloud_director/models/compute/catalog_item.rb b/lib/fog/vcloud_director/models/compute/catalog_item.rb index 3e222ae4d..e99e945c8 100644 --- a/lib/fog/vcloud_director/models/compute/catalog_item.rb +++ b/lib/fog/vcloud_director/models/compute/catalog_item.rb @@ -12,6 +12,13 @@ module Fog attribute :description, :aliases => :Description attribute :vapp_template_id + + def vapp_template + requires :id + service.vapp_templates.get(self.vapp_template_id) + end + + def instantiate(vapp_name, options={}) response = service.instantiate_vapp_template(vapp_name, vapp_template_id, options) service.process_task(response.body[:Tasks][:Task]) diff --git a/lib/fog/vcloud_director/models/compute/template_vm.rb b/lib/fog/vcloud_director/models/compute/template_vm.rb new file mode 100644 index 000000000..33ed49a6f --- /dev/null +++ b/lib/fog/vcloud_director/models/compute/template_vm.rb @@ -0,0 +1,60 @@ +require 'fog/core/model' +require 'fog/vcloud_director/models/compute/vm_customization' + +module Fog + module Compute + class VcloudDirector + class TemplateVm < Model + identity :id + + attribute :vapp_template_id + attribute :vapp_template_name + attribute :name + attribute :type + attribute :href + #attribute :status + #attribute :deployed + #attribute :operating_system + #attribute :ip_address + #attribute :cpu, :type => :integer + #attribute :memory, :type => :integer + #attribute :hard_disks, :aliases => :disks + #attribute :network_adapters + + def reload + #Parent vapp_name & id are nil on a template_vm. Adding them from the collection parent + self.vapp_template_id = collection.vapp_template.id + self.vapp_template_name = collection.vapp_template.name + end + + + def tags + requires :id + service.tags(:vm => self) + end + + def customization + requires :id + data = service.get_vm_customization(id).body + service.vm_customizations.new(data) + end + + def network + requires :id + data = service.get_vm_network(id).body + service.vm_networks.new(data) + end + + def disks + requires :id + service.disks(:vm => self) + end + + + def vapp_template + service.vapp_templates.get(vapp_template_id) + end + end + end + end +end diff --git a/lib/fog/vcloud_director/models/compute/template_vms.rb b/lib/fog/vcloud_director/models/compute/template_vms.rb new file mode 100644 index 000000000..fe064828a --- /dev/null +++ b/lib/fog/vcloud_director/models/compute/template_vms.rb @@ -0,0 +1,41 @@ +require 'fog/core/collection' +require 'fog/vcloud_director/models/compute/vm' + +module Fog + module Compute + class VcloudDirector + class TemplateVms < Collection + + include Fog::VcloudDirector::Query + + model Fog::Compute::VcloudDirector::TemplateVm + + attribute :vapp_template + + + def get_single_vm(vm_id) + item = service.get_template_vm(vm_id).body + return nil unless item + new(item[:vm]) + end + + def query_type + "vm" + end + + private + + def get_by_id(item_id) + item = item_list.find{ |vm| vm[:id] == item_id } + item + end + + def item_list + data = service.get_template_vms(vapp_template.id).body # vapp.id + items = data[:vms] + items + end + end + end + end +end diff --git a/lib/fog/vcloud_director/models/compute/vapp_template.rb b/lib/fog/vcloud_director/models/compute/vapp_template.rb new file mode 100644 index 000000000..ca0bdf71c --- /dev/null +++ b/lib/fog/vcloud_director/models/compute/vapp_template.rb @@ -0,0 +1,26 @@ +require 'fog/core/model' + +module Fog + module Compute + class VcloudDirector + class VappTemplate < Model + identity :id + + attribute :name + attribute :type + attribute :href + attribute :description, :aliases => :Description + attribute :status + attribute :lease_settings, :aliases => :LeaseSettingsSection + attribute :network_section, :aliases => :"ovf:NetworkSection", :squash => :"ovf:Network" + attribute :network_config, :aliases => :NetworkConfigSection, :squash => :NetworkConfig + attribute :owner, :aliases => :Owner, :squash => :User + + def vms + requires :id + service.template_vms(:vapp_template => self) + end + end + end + end +end \ No newline at end of file diff --git a/lib/fog/vcloud_director/models/compute/vapp_templates.rb b/lib/fog/vcloud_director/models/compute/vapp_templates.rb new file mode 100644 index 000000000..24fcd5667 --- /dev/null +++ b/lib/fog/vcloud_director/models/compute/vapp_templates.rb @@ -0,0 +1,40 @@ +require 'fog/core/collection' +require 'fog/vcloud_director/models/compute/vapp' + +module Fog + module Compute + class VcloudDirector + class VappTemplates < Collection + + include Fog::VcloudDirector::Query + + model Fog::Compute::VcloudDirector::VappTemplate + + attribute :vdc + + def query_type + "vAppTemplate" + end + + private + + def get_by_id(item_id) + item = service.get_vapp_template(item_id).body + %w(:Link).each {|key_to_delete| item.delete(key_to_delete) } + service.add_id_from_href!(item) + item[:Description] ||= "" + item + end + + def item_list + data = service.get_vdc(vdc.id).body + return [] if data[:ResourceEntities].empty? + resource_entities = data[:ResourceEntities][:ResourceEntity] + items = resource_entities.select { |link| link[:type] == "application/vnd.vmware.vcloud.vAppTemplate+xml" } + items.each{|item| service.add_id_from_href!(item) } + items + end + end + end + end +end diff --git a/lib/fog/vcloud_director/models/compute/vdc.rb b/lib/fog/vcloud_director/models/compute/vdc.rb index bbf63560e..6b775f47f 100644 --- a/lib/fog/vcloud_director/models/compute/vdc.rb +++ b/lib/fog/vcloud_director/models/compute/vdc.rb @@ -30,6 +30,11 @@ module Fog service.vapps(:vdc => self) end + def vapp_templates + requires :id + service.vapp_templates(:vdc => self) + end + def networks requires :available_networks service.networks(:vdc => self) diff --git a/lib/fog/vcloud_director/requests/compute/get_template_vm.rb b/lib/fog/vcloud_director/requests/compute/get_template_vm.rb new file mode 100644 index 000000000..081cc2c79 --- /dev/null +++ b/lib/fog/vcloud_director/requests/compute/get_template_vm.rb @@ -0,0 +1,74 @@ +module Fog + module Compute + class VcloudDirector + class Real + require 'fog/vcloud_director/parsers/compute/vm' + + # Retrieve a vApp or VM. + # + # @note This should probably be deprecated. + # + # @param [String] id Object identifier of the vApp or VM. + # @return [Excon::Response] + # * body<~Hash>: + # + # @see #get_vapp + def get_vm(id) + request( + :expects => 200, + :idempotent => true, + :method => 'GET', + :parser => Fog::Parsers::Compute::VcloudDirector::Vm.new, + :path => "vAppTemplate/#{id}" + ) + end + end + class Mock + def get_vm(id) + vapp = get_vapp(id).body + vm = parse_vapp_to_vm(vapp) + body = {:type => vapp[:type], :vm => vm} + Excon::Response.new( + :status => 200, + :headers => {'Content-Type' => "#{body[:type]};version=#{api_version}"}, + :body => body + ) + end + + # Mock equivalent of Fog::Parsers::Compute::VcloudDirector::Vm + def parse_vapp_to_vm(vapp) + parser = Fog::Parsers::Compute::VcloudDirector::Vm.new + vm = vapp.select {|k| [:href, :name, :status, :type].include? k} + network = vapp[:NetworkConnectionSection] + vm.merge({ + :id => vapp[:href].split('/').last, + :status => parser.human_status(vapp[:status]), + :ip_address => network[:NetworkConnection][:IpAddress], + :description => vapp[:Description], + :cpu => get_hardware(vapp, 3), + :memory => get_hardware(vapp, 4), + :disks => get_disks(vapp), + :links => [vapp[:GuestCustomizationSection][:Link]], + }) + end + + def get_hardware(vapp, resource_type) + hardware = vapp[:"ovf:VirtualHardwareSection"][:"ovf:Item"] + item = hardware.find {|h| h[:"rasd:ResourceType"].to_i == resource_type} + if item and item.key? :"rasd:VirtualQuantity" + item[:"rasd:VirtualQuantity"].to_i + else + nil + end + end + + def get_disks(vapp) + hardware = vapp[:"ovf:VirtualHardwareSection"][:"ovf:Item"] + disks = hardware.select {|h| h[:"rasd:ResourceType"].to_i == 17} + disks.map {|d| {d[:"rasd:ElementName"] => d[:"rasd:HostResource"][:ns12_capacity].to_i}} + end + + end + end + end +end diff --git a/lib/fog/vcloud_director/requests/compute/get_template_vms.rb b/lib/fog/vcloud_director/requests/compute/get_template_vms.rb new file mode 100644 index 000000000..69be559ed --- /dev/null +++ b/lib/fog/vcloud_director/requests/compute/get_template_vms.rb @@ -0,0 +1,41 @@ +module Fog + module Compute + class VcloudDirector + class Real + require 'fog/vcloud_director/parsers/compute/vms' + + # Retrieve a vApp or VM. + # + # @note This should probably be deprecated. + # + # @param [String] id Object identifier of the vApp or VM. + # @return [Excon::Response] + # * body<~Hash>: + # + # @see #get_vapp + def get_template_vms(id) + request( + :expects => 200, + :idempotent => true, + :method => 'GET', + :parser => Fog::Parsers::Compute::VcloudDirector::Vms.new, + :path => "vAppTemplate/#{id}" + ) + end + end + class Mock + def get_vms(id) + vapptemplate = get_vapp(id).body + parser = Fog::Parsers::Compute::VcloudDirector::Vms.new + vms = vapp[:Children][:Vm].map {|child| parse_vapp_to_vm(child) } + body = {:type => vapp[:type], :vms => vms} + Excon::Response.new( + :status => 200, + :headers => {'Content-Type' => "#{body[:type]};version=#{api_version}"}, + :body => body + ) + end + end + end + end +end diff --git a/lib/fog/vcloud_director/requests/compute/get_vdc.rb b/lib/fog/vcloud_director/requests/compute/get_vdc.rb index 3a83fcc21..c88874bf4 100644 --- a/lib/fog/vcloud_director/requests/compute/get_vdc.rb +++ b/lib/fog/vcloud_director/requests/compute/get_vdc.rb @@ -135,7 +135,7 @@ module Fog {:type => "application/vnd.vmware.vcloud.vApp+xml", :name => vapp[:name], :href => make_href("vApp/#{vapp_id}")} - end + end body[:AvailableNetworks][:Network] = data[:networks].map do |id, network| diff --git a/tests/vcloud_director/models/compute/catalog_items_tests.rb b/tests/vcloud_director/models/compute/catalog_items_tests.rb index f707d4cf6..7782c0954 100644 --- a/tests/vcloud_director/models/compute/catalog_items_tests.rb +++ b/tests/vcloud_director/models/compute/catalog_items_tests.rb @@ -14,6 +14,7 @@ Shindo.tests("Compute::VcloudDirector | catalog_items", ['vclouddirector', 'all' tests("#name").returns(String){ catalog_item.name.class } tests("#href").returns(String){ catalog_item.href.class } tests("#type").returns("application/vnd.vmware.vcloud.catalogItem+xml"){ catalog_item.type } + tests("#vapp_template").returns(VappTemplate){ catalog_item.vapp_template.class } end tests("Compute::VcloudDirector | catalog_item", ['lazy load attrs']) do diff --git a/tests/vcloud_director/models/compute/vapp_template_tests.rb b/tests/vcloud_director/models/compute/vapp_template_tests.rb new file mode 100644 index 000000000..edd8bc03e --- /dev/null +++ b/tests/vcloud_director/models/compute/vapp_template_tests.rb @@ -0,0 +1,29 @@ +require File.expand_path(File.join(File.dirname(__FILE__), 'helper')) + +Shindo.tests("Compute::VcloudDirector | vapp_templates", ['vclouddirector', 'all']) do + + # unless there is atleast one vapp we cannot run these tests + pending if vdc.vapp_templates.empty? + + vapp_templates = vdc.vapp_templates + vapp = vapp_templates.first + + tests("Compute::VcloudDirector | vapp_template") do + tests("#id").returns(String){ vapp.id.class } + tests("#name").returns(String){ vapp.name.class } + tests("#href").returns(String){ vapp.href.class } + tests("#type").returns("application/vnd.vmware.vcloud.vAppTemplate+xml"){ vapp.type } + end + + tests("Compute::VcloudDirector | vapp_template vms") do + tests("#vms").returns(Fog::Compute::VcloudDirector::TemplateVms) { vapp.vms.class } + pending if Fog.mock? + vm = vapp.vms[0] + tests("#name").returns(String){ vm.name.class } + tests("#type").returns("application/vnd.vmware.vcloud.vm+xml"){ vm.type } + + end + + + +end From d44ec12a45e06dcc5588fbeefebe0b4e2fd48eda Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Fri, 11 Mar 2016 15:54:41 +0000 Subject: [PATCH 3/9] Added instantiate_vapp_template_params generator --- Rakefile | 6 ++ fog.gemspec | 1 - .../generators/compute/compose_common.rb | 9 +++ .../instantiate_vapp_template_params.rb | 30 ++++++++ .../compute/instantiate_vapp_template.rb | 65 ++++++++--------- .../instantiate_vapp_template_params_full.xml | 30 ++++++++ .../instantiate_vapp_template_params_spec.rb | 69 +++++++++++++++++++ .../compute/instantiate_vapp_template_spec.rb | 63 +++++++++++++++++ 8 files changed, 235 insertions(+), 38 deletions(-) create mode 100644 lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb create mode 100644 spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml create mode 100644 spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb create mode 100644 spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb diff --git a/Rakefile b/Rakefile index 6142868eb..cc3325cc3 100644 --- a/Rakefile +++ b/Rakefile @@ -92,6 +92,12 @@ namespace :test do task :vcloud_director do sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/vcloud_director") end + task :vcloud_director_specs do + puts "Running vCloud Minitest Suite" + Rake::TestTask.new do |t| + Dir.glob('./spec/vcloud_director/**/*_spec.rb').each { |file| require file} + end + end end desc 'Run mocked tests for a specific provider' diff --git a/fog.gemspec b/fog.gemspec index 11fe7399b..6fe5f17c7 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -95,7 +95,6 @@ Gem::Specification.new do |s| s.add_development_dependency("rspec-expectations") s.add_development_dependency("vcr") s.add_development_dependency("webmock","~>1.22.2") - s.add_development_dependency("builder", ">=3.2.2") s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {spec,tests}/*`.split("\n") diff --git a/lib/fog/vcloud_director/generators/compute/compose_common.rb b/lib/fog/vcloud_director/generators/compute/compose_common.rb index 9c874637f..e1f74a3c0 100644 --- a/lib/fog/vcloud_director/generators/compute/compose_common.rb +++ b/lib/fog/vcloud_director/generators/compute/compose_common.rb @@ -50,12 +50,21 @@ module Fog } } end + + def build_source_template(xml) + xml.Source(:href => @configuration[:Source]) + end def build_source_items(xml) vms = @configuration[:source_vms] vms.each do |vm| xml.SourcedItem { xml.Source(:name =>vm[:name], :href => vm[:href]) + xml.VmGeneralParams { + xml.Name vm[:name] + xml.Description vm[:Description] if vm[:Description] + xml.NeedsCustomization if vm[:NeedsCustomization] + } if vm[:name] xml.InstantiationParams { if vm[:networks] xml.NetworkConnectionSection(:href => "#{vm[:href]}/networkConnectionSection/", :type => "application/vnd.vmware.vcloud.networkConnectionSection+xml", 'xmlns:ovf' => "http://schemas.dmtf.org/ovf/envelope/1", "ovf:required" => "false") { diff --git a/lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb b/lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb new file mode 100644 index 000000000..347a47a4f --- /dev/null +++ b/lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb @@ -0,0 +1,30 @@ +require 'fog/vcloud_director/generators/compute/compose_common' + +module Fog + module Generators + module Compute + module VcloudDirector + # @see http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/doc/types/VAppType.html + class InstantiateVappTemplateParams + attr_reader :options + + include ComposeCommon + + def generate_xml + Nokogiri::XML::Builder.new do |xml| + + + xml.InstantiateVAppTemplateParams((vapp_attrs)) { + build_vapp_instantiation_params(xml) + build_source_template(xml) + build_source_items(xml) + } + end.to_xml + + end + + end + end + end + end +end diff --git a/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb b/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb index 14243cfa1..c5b21e88b 100644 --- a/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb +++ b/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb @@ -4,6 +4,7 @@ module Fog module Compute class VcloudDirector class Real + require 'fog/vcloud_director/generators/compute/instantiate_vapp_template_params' # Create a vApp from a vApp template. # # The response includes a Task element. You can monitor the task to to @@ -43,43 +44,33 @@ module Fog options end - def generate_instantiate_vapp_template_request(options ={}) - xml = Builder::XmlMarkup.new - xml.InstantiateVAppTemplateParams(xmlns.merge!(:name => options[:vapp_name], :"xml:lang" => "en")) { - xml.Description(options[:description]) - xml.InstantiationParams { - # This options are fully ignored - if options[:network_uri] - xml.NetworkConfigSection { - xml.tag!("ovf:Info"){ "Configuration parameters for logical networks" } - xml.NetworkConfig("networkName" => options[:network_name]) { - xml.Configuration { - xml.ParentNetwork(:href => options[:network_uri]) - xml.FenceMode("bridged") - } - } - } - end - } - # The template - xml.Source(:href => options[:template_uri]) - # Use of sourceItems for configuring VM's during instantiation. - # NOTE: Name and storage profile configuration supported so far. - # http://pubs.vmware.com/vca/index.jsp?topic=%2Fcom.vmware.vcloud.api.doc_56%2FGUID-BF9B790D-512E-4EA1-99E8-6826D4B8E6DC.html - (options[:vms_config] || []).each do |vm_config| - next unless vm_config[:href] - xml.SourcedItem { - xml.Source(:href => vm_config[:href]) - xml.VmGeneralParams{ - xml.Name(vm_config[:name]) if vm_config[:name] - } - if storage_href = vm_config[:storage_profile_href] - xml.StorageProfile(:href => storage_href) - end - } - end - xml.AllEULAsAccepted("true") - } + def generate_instantiate_vapp_template_request(options ={}) + + #overriding some params so they work with new standardised generator + options[:InstantiationParams] = + { + :NetworkConfig => + [{ + :networkName => options[:network_name], + :networkHref => options[:network_uri], + :fenceMode => 'bridged' + }] + } unless options[:InstantiationParams] + options[:name] = options.delete(:vapp_name) if options[:vapp_name] + options[:Description] = options.delete(:description) unless options[:Description] + if options[:vms_config] then + options[:source_vms] = options.delete(:vms_config) + options[:source_vms].each_with_index {|vm, i|options[:source_vms][i][:StorageProfileHref] = options[:source_vms][i].delete(:storage_profile_href) } + end + options[:Source] = options.delete(:template_uri) if options[:template_uri] + + + + + Fog::Generators::Compute::VcloudDirector::InstantiateVappTemplateParams.new(options).generate_xml + + + end def xmlns diff --git a/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml b/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml new file mode 100644 index 000000000..5397080ec --- /dev/null +++ b/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml @@ -0,0 +1,30 @@ + + MY VAPP + + + + + + + bridged + + + + + + + + + VM1 + + + + + + + VM2 + + + + true + \ No newline at end of file diff --git a/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb b/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb new file mode 100644 index 000000000..4df4199b9 --- /dev/null +++ b/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb @@ -0,0 +1,69 @@ +require 'minitest/autorun' +require 'nokogiri' +require './lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb' + +describe Fog::Generators::Compute::VcloudDirector::InstantiateVappTemplateParams do + + let(:xml) do + params = { + :name => 'VAPP_NAME', + :Description => 'MY VAPP', + :InstantiationParams => { + :NetworkConfig => [ + { + :networkName => 'NETWORK', + :networkHref => 'http://vcloud/api/network/123456789', + :fenceMode => 'bridged' + } + ] + }, + :Source => 'http://vcloud/vapp_template/1234', + :source_vms => [ + { + :name => 'VM1', + :href => 'http://vcloud/api/vm/12345', + :StorageProfileHref => 'http://vcloud/storage/123456789' + }, + { + :name => 'VM2', + :href => 'http://vcloud/api/vm/12345', + :StorageProfileHref => 'http://vcloud/storage/123456789' + } + ] + + } + + output = Fog::Generators::Compute::VcloudDirector::InstantiateVappTemplateParams.new(params).generate_xml + Nokogiri::XML(output) + end + + it "Generates InstantiateVAppTemplateParams" do + xml.xpath('//InstantiateVAppTemplateParams').must_be_instance_of Nokogiri::XML::NodeSet + end + + it "Has a valid Network" do + node = xml.xpath('//xmlns:NetworkConfigSection') + + xml.xpath("//xmlns:NetworkConfig")[0].attr('networkName').must_equal "NETWORK" + xml.xpath('//xmlns:ParentNetwork')[0].attr('href').must_equal 'http://vcloud/api/network/123456789' + + end + + it "Has valid source VAPP info" do + node = xml.xpath('//xmlns:Source[@href="http://vcloud/vapp_template/1234"]') + node.length.must_equal 1 + end + + it "Has valid source VM info" do + + xml.xpath('//xmlns:StorageProfile[@href="http://vcloud/storage/123456789"]').length.must_equal 2 + end + + it "Allows New VM Parameters" do + nodes = xml.xpath('//xmlns:VmGeneralParams') + nodes.length.must_equal 2 + puts nodes + + end + +end \ No newline at end of file diff --git a/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb new file mode 100644 index 000000000..363ec9a8f --- /dev/null +++ b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb @@ -0,0 +1,63 @@ +require 'minitest/autorun' +require './lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb' + +describe Fog::Compute::VcloudDirector::Real do + + let(:xml) do + service = Fog::Compute::VcloudDirector.new() + + params = { + :description => 'MY VAPP', + :vdc_uri => 'http://vcloud/api/vdc/123456789', + :network_uri => 'http://vcloud/api/network/123456789', + :template_uri => 'http://vcloud/api/vapptemplate/123456789', + :vapp_name => 'http://vcloud/api/vapp/123456789', + :network_name => 'NETWORK', + :vms_config => [ + { + :name => 'VM1', + :href => 'http://vcloud/api/vm/12345', + :storage_profile_href => 'http://vcloud/storage/123456789' + }, + { + :name => 'VM2', + :href => 'http://vcloud/api/vm/12345', + :storage_profile_href => 'http://vcloud/storage/123456789' + } + ] + } + + + Nokogiri::XML(service.send(:generate_instantiate_vapp_template_request,params)) + end + + + + it "Generates InstantiateVAppTemplateParams" do + + xml.xpath('//InstantiateVAppTemplateParams').must_be_instance_of Nokogiri::XML::NodeSet + end + + it "Has a valid Network" do + node = xml.xpath('//xmlns:NetworkConfigSection') + + xml.xpath("//xmlns:NetworkConfig")[0].attr('networkName').must_equal "NETWORK" + xml.xpath('//xmlns:ParentNetwork')[0].attr('href').must_equal 'http://vcloud/api/network/123456789' + + end + + it "Has valid source VAPP info" do + node = xml.xpath('//xmlns:Source[@href="http://vcloud/api/vapptemplate/123456789"]') + node.length.must_equal 1 + end + + it "Has valid source VM info" do + xml.xpath('//xmlns:Source[@name="VM1"]').length.must_equal 1 + xml.xpath('//xmlns:StorageProfile[@href="http://vcloud/storage/123456789"]').length.must_equal 2 + end + + + + + +end \ No newline at end of file From 820cafa1f2aacfa7a0035cee1159d9b7ad6dd616 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Fri, 11 Mar 2016 16:02:41 +0000 Subject: [PATCH 4/9] Tidying up for PR --- lib/fog/vcloud_director/models/compute/template_vm.rb | 8 -------- lib/fog/vcloud_director/requests/compute/get_vdc.rb | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/fog/vcloud_director/models/compute/template_vm.rb b/lib/fog/vcloud_director/models/compute/template_vm.rb index 33ed49a6f..5ea1cd8a7 100644 --- a/lib/fog/vcloud_director/models/compute/template_vm.rb +++ b/lib/fog/vcloud_director/models/compute/template_vm.rb @@ -12,14 +12,6 @@ module Fog attribute :name attribute :type attribute :href - #attribute :status - #attribute :deployed - #attribute :operating_system - #attribute :ip_address - #attribute :cpu, :type => :integer - #attribute :memory, :type => :integer - #attribute :hard_disks, :aliases => :disks - #attribute :network_adapters def reload #Parent vapp_name & id are nil on a template_vm. Adding them from the collection parent diff --git a/lib/fog/vcloud_director/requests/compute/get_vdc.rb b/lib/fog/vcloud_director/requests/compute/get_vdc.rb index c88874bf4..cb1d851c7 100644 --- a/lib/fog/vcloud_director/requests/compute/get_vdc.rb +++ b/lib/fog/vcloud_director/requests/compute/get_vdc.rb @@ -135,7 +135,7 @@ module Fog {:type => "application/vnd.vmware.vcloud.vApp+xml", :name => vapp[:name], :href => make_href("vApp/#{vapp_id}")} - end + end body[:AvailableNetworks][:Network] = data[:networks].map do |id, network| From d9773ba0910a9fdec1b2ff62488c916f16943977 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Fri, 11 Mar 2016 16:04:41 +0000 Subject: [PATCH 5/9] Tidying up for PR --- fog.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fog.gemspec b/fog.gemspec index 6fe5f17c7..e14d4dc77 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -49,7 +49,7 @@ Gem::Specification.new do |s| s.add_dependency("fog-xml", "~> 0.1.1") s.add_dependency("ipaddress", "~> 0.5") - + # Modular providers (please keep sorted) s.add_dependency("fog-aliyun",">= 0.1.0") s.add_dependency("fog-atmos") From 293d1cf7675c78761a7fea38d687ce3ffbe7c972 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Fri, 11 Mar 2016 16:05:22 +0000 Subject: [PATCH 6/9] Tidying up for PR --- fog.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fog.gemspec b/fog.gemspec index e14d4dc77..89b9d7d9c 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -75,7 +75,7 @@ Gem::Specification.new do |s| s.add_dependency("fog-voxel") s.add_dependency("fog-vsphere", ">= 0.4.0") s.add_dependency("fog-xenserver") - + s.add_development_dependency("docker-api", ">= 1.13.6") s.add_development_dependency("fission") s.add_development_dependency("mime-types") From a342fe797174f7ad2734b32016da07aefce10c6d Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Tue, 15 Mar 2016 14:11:07 +0000 Subject: [PATCH 7/9] pin mime-types version --- fog.gemspec | 2 +- .../instantiate_vapp_template_params_full.xml | 30 ------------------- 2 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml diff --git a/fog.gemspec b/fog.gemspec index 89b9d7d9c..6f1fd01d9 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -78,7 +78,7 @@ Gem::Specification.new do |s| s.add_development_dependency("docker-api", ">= 1.13.6") s.add_development_dependency("fission") - s.add_development_dependency("mime-types") + s.add_development_dependency("mime-types", "<=2.99.1") s.add_development_dependency("minitest") s.add_development_dependency("minitest-stub-const") s.add_development_dependency("opennebula") diff --git a/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml b/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml deleted file mode 100644 index 5397080ec..000000000 --- a/spec/vcloud_director/fixtures/instantiate_vapp_template_params_full.xml +++ /dev/null @@ -1,30 +0,0 @@ - - MY VAPP - - - - - - - bridged - - - - - - - - - VM1 - - - - - - - VM2 - - - - true - \ No newline at end of file From 2c14642035e2f6db0d6ade0d356e045b246c0f08 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Tue, 15 Mar 2016 15:46:00 +0000 Subject: [PATCH 8/9] add spec helper with creds --- .../compute/instantiate_vapp_template_params_spec.rb | 5 ++--- .../compute/instantiate_vapp_template_spec.rb | 9 ++++++++- spec/vcloud_director/spec_helper.rb | 11 +++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 spec/vcloud_director/spec_helper.rb diff --git a/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb b/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb index 4df4199b9..fd761bfc8 100644 --- a/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb +++ b/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb @@ -1,3 +1,4 @@ +require './spec/vcloud_director/spec_helper.rb' require 'minitest/autorun' require 'nokogiri' require './lib/fog/vcloud_director/generators/compute/instantiate_vapp_template_params.rb' @@ -61,9 +62,7 @@ describe Fog::Generators::Compute::VcloudDirector::InstantiateVappTemplateParams it "Allows New VM Parameters" do nodes = xml.xpath('//xmlns:VmGeneralParams') - nodes.length.must_equal 2 - puts nodes - + nodes.length.must_equal 2 end end \ No newline at end of file diff --git a/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb index 363ec9a8f..4926efd74 100644 --- a/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb +++ b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb @@ -1,8 +1,13 @@ +require './spec/vcloud_director/spec_helper.rb' require 'minitest/autorun' require './lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb' describe Fog::Compute::VcloudDirector::Real do + before do + Fog.unmock! + end + let(:xml) do service = Fog::Compute::VcloudDirector.new() @@ -57,7 +62,9 @@ describe Fog::Compute::VcloudDirector::Real do end - + after do + Fog.mock! + end end \ No newline at end of file diff --git a/spec/vcloud_director/spec_helper.rb b/spec/vcloud_director/spec_helper.rb new file mode 100644 index 000000000..783ce405d --- /dev/null +++ b/spec/vcloud_director/spec_helper.rb @@ -0,0 +1,11 @@ +if ENV["FOG_MOCK"] == "true" + Fog.mock! +end + +if Fog.mock? + Fog.credentials = { + :vcloud_director_host => 'vcloud-director-host', + :vcloud_director_password => 'vcloud_director_password', + :vcloud_director_username => 'vcd_user@vcd_org_name', + }.merge(Fog.credentials) +end \ No newline at end of file From 80661f94d3a0326e47d71260ae1294d2e2a7e3e1 Mon Sep 17 00:00:00 2001 From: Tim Lawrence Date: Tue, 15 Mar 2016 15:55:11 +0000 Subject: [PATCH 9/9] fix tests --- .../requests/compute/instantiate_vapp_template_spec.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb index 4926efd74..b2413a944 100644 --- a/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb +++ b/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb @@ -9,7 +9,15 @@ describe Fog::Compute::VcloudDirector::Real do let(:xml) do - service = Fog::Compute::VcloudDirector.new() + service = Fog::Compute::VcloudDirector.new( + { + :vcloud_director_host => 'vcloud-director-host', + :vcloud_director_password => 'vcloud_director_password', + :vcloud_director_username => 'vcd_user@vcd_org_name', + } + + + ) params = { :description => 'MY VAPP',