From 1648c933e06a61361ad18ed2f511b66e502c2bef Mon Sep 17 00:00:00 2001 From: Nick Osborn Date: Mon, 30 Sep 2013 14:56:10 +0100 Subject: [PATCH] [vcloud_director|tests] Add generator tests. --- .gitignore | 1 + .../generators/compute/customization.rb | 21 ++- .../generators/compute/disks.rb | 38 ++++-- .../generators/compute/metadata.rb | 35 ++--- .../generators/compute/vm_network.rb | 43 +++---- .../fixtures/vcloud/v1.5/schema/README.md | 2 + .../generators/compute/disks_tests.rb | 42 ++++++ .../guest_customization_section_tests.rb | 36 ++++++ .../generators/compute/helper.rb | 35 +++++ .../generators/compute/metadata_tests.rb | 41 ++++++ .../network_connection_section_tests.rb | 33 +++++ .../generators/compute/vm_network.rb | 121 ++++++++++++++++++ 12 files changed, 384 insertions(+), 64 deletions(-) create mode 100644 tests/vcloud_director/fixtures/vcloud/v1.5/schema/README.md create mode 100644 tests/vcloud_director/generators/compute/disks_tests.rb create mode 100644 tests/vcloud_director/generators/compute/guest_customization_section_tests.rb create mode 100644 tests/vcloud_director/generators/compute/helper.rb create mode 100644 tests/vcloud_director/generators/compute/metadata_tests.rb create mode 100644 tests/vcloud_director/generators/compute/network_connection_section_tests.rb create mode 100644 tests/vcloud_director/generators/compute/vm_network.rb diff --git a/.gitignore b/.gitignore index 4494b4c2f..8dd0ec74a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ spec/credentials.yml vendor/* tags tests/digitalocean/fixtures/ +tests/vcloud_director/fixtures/vcloud/v1.5/schema/*.xsd tests/vcloud_director/vcr_cassettes/ diff --git a/lib/fog/vcloud_director/generators/compute/customization.rb b/lib/fog/vcloud_director/generators/compute/customization.rb index 5b4ea214d..bf13fe520 100644 --- a/lib/fog/vcloud_director/generators/compute/customization.rb +++ b/lib/fog/vcloud_director/generators/compute/customization.rb @@ -59,15 +59,11 @@ module Fog private def header - '' + type="application/vnd.vmware.vcloud.guestCustomizationSection+xml"> + END end # The order matters: http://communities.vmware.com/thread/448760?start=0&tstart=0 @@ -83,7 +79,7 @@ module Fog # * " " # * ' ' def body(opts={}) - body = " + <<-END Specifies Guest OS Customization Settings #{opts[:enabled]} #{opts[:change_sid]} @@ -94,11 +90,14 @@ module Fog #{opts[:admin_password_auto]} #{opts[:reset_password_required]} #{CGI::escapeHTML(opts[:customization_script]).gsub(/\r/, " ")} - #{opts[:computer_name]}" + #{opts[:computer_name]} + END end def tail - '' + <<-END + + END end end end diff --git a/lib/fog/vcloud_director/generators/compute/disks.rb b/lib/fog/vcloud_director/generators/compute/disks.rb index 7f6387bab..f7539371d 100644 --- a/lib/fog/vcloud_director/generators/compute/disks.rb +++ b/lib/fog/vcloud_director/generators/compute/disks.rb @@ -115,17 +115,22 @@ module Fog end def header - '' + type="application/vnd.vmware.vcloud.rasdItemsList+xml"> + END end def tail - '' + <<-END + + END end def hard_disk_item(opts={}) - " + <<-END + #{opts[:address_on_parent]} #{opts[:description]} #{opts[:name]} @@ -133,28 +138,33 @@ module Fog #{opts[:id]} #{opts[:parent]} 17 - " + + END end def ide_controller_item(opts={}) - " - #{opts[:address]} - #{opts[:description]} - #{opts[:name]} - #{opts[:id]} - 5 - " + <<-END + + #{opts[:address]} + #{opts[:description]} + #{opts[:name]} + #{opts[:id]} + 5 + + END end def scsi_controller(opts={}) - " + <<-END + #{opts[:address]} #{opts[:description]} #{opts[:name]} #{opts[:id]} #{opts[:resource_sub_type]} 6 - " + + END end # helpers diff --git a/lib/fog/vcloud_director/generators/compute/metadata.rb b/lib/fog/vcloud_director/generators/compute/metadata.rb index d95dd6875..934fad024 100644 --- a/lib/fog/vcloud_director/generators/compute/metadata.rb +++ b/lib/fog/vcloud_director/generators/compute/metadata.rb @@ -48,11 +48,12 @@ module Fog # 1.5 def header - ' - ' + type="application/vnd.vmware.vcloud.metadata+xml"> + END end def metadata_entry @@ -69,33 +70,33 @@ module Fog #end def tail - '' + <<-END + + END end end class MetadataV51 < MetadataBase - def metadata_entry(key,value) - body = < + def metadata_entry(key, value) + <<-END + #{key} - + #{value} -EOF + END end end class MetadataV15 < MetadataBase - def metadata_entry(key,value) - body = < - #{key} - #{value} + #{key} + #{value} -EOF + END end end end diff --git a/lib/fog/vcloud_director/generators/compute/vm_network.rb b/lib/fog/vcloud_director/generators/compute/vm_network.rb index eaaa6c684..2dcc1049e 100644 --- a/lib/fog/vcloud_director/generators/compute/vm_network.rb +++ b/lib/fog/vcloud_director/generators/compute/vm_network.rb @@ -85,34 +85,33 @@ module Fog private def header - '' + <<-END + + END end def body(opts={}) - body = <#{opts[:info]} - #{opts[:primary_network_connection_index]} - - #{opts[:network_connection_index]} - #{opts[:ip_address]} - #{opts[:is_connected]} - #{opts[:mac_address]} - #{opts[:ip_address_allocation_mode]} - -EOF + <<-END + #{opts[:info]} + #{opts[:primary_network_connection_index]} + + #{opts[:network_connection_index]} + #{opts[:ip_address]} + #{opts[:is_connected]} + #{opts[:mac_address]} + #{opts[:ip_address_allocation_mode]} + + END end def tail - '' + <<-END + + END end end end diff --git a/tests/vcloud_director/fixtures/vcloud/v1.5/schema/README.md b/tests/vcloud_director/fixtures/vcloud/v1.5/schema/README.md new file mode 100644 index 000000000..f4c9c04ed --- /dev/null +++ b/tests/vcloud_director/fixtures/vcloud/v1.5/schema/README.md @@ -0,0 +1,2 @@ +Output of generators will be validated against the XML schema if copies of the +schema definition files are placed here. diff --git a/tests/vcloud_director/generators/compute/disks_tests.rb b/tests/vcloud_director/generators/compute/disks_tests.rb new file mode 100644 index 000000000..7c373486d --- /dev/null +++ b/tests/vcloud_director/generators/compute/disks_tests.rb @@ -0,0 +1,42 @@ +Shindo.tests('Compute::VcloudDirector | disks generator', ['vclouddirector', 'xsd']) do + + require 'fog/vcloud_director/generators/compute/disks' + + tests('#generate_xml').returns(String) do + @items = + {:disks=> + [{:address=>0, + :description=>"SCSI Controller", + :name=>"SCSI Controller 0", + :id=>2, + :resource_sub_type=>"VirtualSCSI", + :resource_type=>6}, + {:address_on_parent=>0, + :description=>"Hard disk", + :name=>"Hard disk 1", + :id=>2000, + :parent=>2, + :resource_type=>17, + :capacity=>16384, + :bus_sub_type=>"VirtualSCSI", + :bus_type=>6}, + {:address=>0, + :description=>"IDE Controller", + :name=>"IDE Controller 0", + :id=>3, + :resource_type=>5}]} + @xml = Fog::Generators::Compute::VcloudDirector::Disks.new(@items).generate_xml + @xml.class + end + + tests('#parse').returns(Nokogiri::XML::Document) do + @doc = Nokogiri::XML::Document.parse(@xml) + @doc.class + end + + tests('#validate').returns([]) do + pending unless VcloudDirector::Generators::Helpers.have_xsd? + VcloudDirector::Generators::Helpers.validate(@doc) + end + +end diff --git a/tests/vcloud_director/generators/compute/guest_customization_section_tests.rb b/tests/vcloud_director/generators/compute/guest_customization_section_tests.rb new file mode 100644 index 000000000..6f6b2222f --- /dev/null +++ b/tests/vcloud_director/generators/compute/guest_customization_section_tests.rb @@ -0,0 +1,36 @@ +Shindo.tests('Compute::VcloudDirector | GuestCustomizationSection generator', ['vclouddirector', 'xsd']) do + + require 'fog/vcloud_director/generators/compute/customization' + + tests('#generate_xml').returns(String) do + @attrs = + {:type=>"application/vnd.vmware.vcloud.guestCustomizationSection+xml", + :href=> + "https://example.com/api/vApp/vm-2bbbf556-55dc-4974-82e6-aa6e814f0b64/guestCustomizationSection/", + :id=>"vm-2bbbf556-55dc-4974-82e6-aa6e814f0b64", + :enabled=>false, + :change_sid=>false, + :virtual_machine_id=>"2bbbf556-55dc-4974-82e6-aa6e814f0b64", + :join_domain_enabled=>false, + :use_org_settings=>false, + :admin_password_enabled=>false, + :admin_password_auto=>true, + :reset_password_required=>false, + :customization_script=>"hola\nmundo", + :has_customization_script=>true, + :computer_name=>"DEVWEB-001"} + @xml = Fog::Generators::Compute::VcloudDirector::Customization.new(@attrs).generate_xml + @xml.class + end + + tests('#parse').returns(Nokogiri::XML::Document) do + @doc = Nokogiri::XML::Document.parse(@xml) + @doc.class + end + + tests('#validate').returns([]) do + pending unless VcloudDirector::Generators::Helpers.have_xsd? + VcloudDirector::Generators::Helpers.validate(@doc) + end + +end diff --git a/tests/vcloud_director/generators/compute/helper.rb b/tests/vcloud_director/generators/compute/helper.rb new file mode 100644 index 000000000..572ec37dd --- /dev/null +++ b/tests/vcloud_director/generators/compute/helper.rb @@ -0,0 +1,35 @@ +class VcloudDirector + module Generators + module Helpers + + def self.have_xsd? + if @have_xsd.nil? + unless @have_xsd = File.exist?(master) + Fog::Logger.warning('XML schema not present, skipping validation') + end + end + @have_xsd + end + + def self.validate(doc) + xsd.validate(doc).map(&:message) + end + + private + + def self.master + @master ||= File.expand_path('../../../fixtures/vcloud/v1.5/schema/master.xsd', __FILE__) + end + + def self.xsd + if @xsd.nil? + Dir.chdir(File.dirname(master)) do + @xsd = Nokogiri::XML::Schema.new(File.read(File.basename(master))) + end + end + @xsd + end + + end + end +end diff --git a/tests/vcloud_director/generators/compute/metadata_tests.rb b/tests/vcloud_director/generators/compute/metadata_tests.rb new file mode 100644 index 000000000..c3b46ab74 --- /dev/null +++ b/tests/vcloud_director/generators/compute/metadata_tests.rb @@ -0,0 +1,41 @@ +Shindo.tests('Compute::VcloudDirector | Metadata generator', ['vclouddirector', 'xsd']) do + + require 'fog/vcloud_director/generators/compute/metadata' + + @attrs = {:metadata => {'KEY' => 'VALUE'}} + + tests('vCloud API 1.5') do + tests('#generate_xml').returns(String) do + @xml = Fog::Generators::Compute::VcloudDirector::MetadataV15.new(@attrs).generate_xml + @xml.class + end + + tests('#parse').returns(Nokogiri::XML::Document) do + @doc = Nokogiri::XML::Document.parse(@xml) + @doc.class + end + + tests('#validate').returns([]) do + pending unless VcloudDirector::Generators::Helpers.have_xsd? + VcloudDirector::Generators::Helpers.validate(@doc) + end + end + + tests('vCloud API 5.1') do + tests('#generate_xml').returns(String) do + @xml = Fog::Generators::Compute::VcloudDirector::MetadataV51.new(@attrs).generate_xml + @xml.class + end + + tests('#parse').returns(Nokogiri::XML::Document) do + @doc = Nokogiri::XML::Document.parse(@xml) + @doc.class + end + + tests('#validate').returns([]) do + pending unless VcloudDirector::Generators::Helpers.have_xsd? + VcloudDirector::Generators::Helpers.validate(@doc) + end + end + +end diff --git a/tests/vcloud_director/generators/compute/network_connection_section_tests.rb b/tests/vcloud_director/generators/compute/network_connection_section_tests.rb new file mode 100644 index 000000000..2bae88696 --- /dev/null +++ b/tests/vcloud_director/generators/compute/network_connection_section_tests.rb @@ -0,0 +1,33 @@ +Shindo.tests('Compute::VcloudDirector | NetworkConnectionSection generator', ['vclouddirector', 'xsd']) do + + require 'fog/vcloud_director/generators/compute/vm_network' + + tests('#generate_xml').returns(String) do + @attrs = + {:type=>"application/vnd.vmware.vcloud.networkConnectionSection+xml", + :href=> + "https://example.com/api/vApp/vm-8b74d95a-ee91-4f46-88d8-fc92be0dbaae/networkConnectionSection/", + :id=>"vm-8b74d95a-ee91-4f46-88d8-fc92be0dbaae", + :primary_network_connection_index=>0, + :network=>"DevOps - Dev Network Connection", + :needs_customization=>true, + :network_connection_index=>0, + :ip_address=>"10.192.0.130", + :is_connected=>true, + :mac_address=>"00:50:56:01:00:8d", + :ip_address_allocation_mode=>"POOL"} + @xml = Fog::Generators::Compute::VcloudDirector::VmNetwork.new(@attrs).generate_xml + @xml.class + end + + tests('#parse').returns(Nokogiri::XML::Document) do + @doc = Nokogiri::XML::Document.parse(@xml) + @doc.class + end + + tests('#validate').returns([]) do + pending unless VcloudDirector::Generators::Helpers.have_xsd? + VcloudDirector::Generators::Helpers.validate(@doc) + end + +end diff --git a/tests/vcloud_director/generators/compute/vm_network.rb b/tests/vcloud_director/generators/compute/vm_network.rb new file mode 100644 index 000000000..eaaa6c684 --- /dev/null +++ b/tests/vcloud_director/generators/compute/vm_network.rb @@ -0,0 +1,121 @@ +module Fog + module Generators + module Compute + module VcloudDirector + # This is the data structure it accepts, this is the output of + # #get_vm_network + # + # {:type=>"application/vnd.vmware.vcloud.networkConnectionSection+xml", + # :href=> + # "https://example.com/api/vApp/vm-8b74d95a-ee91-4f46-88d8-fc92be0dbaae/networkConnectionSection/", + # :id=>"vm-8b74d95a-ee91-4f46-88d8-fc92be0dbaae", + # :primary_network_connection_index=>0, + # :network=>"DevOps - Dev Network Connection", + # :needs_customization=>true, + # :network_connection_index=>0, + # :ip_address=>"10.192.0.130", + # :is_connected=>true, + # :mac_address=>"00:50:56:01:00:8d", + # :ip_address_allocation_mode=>"POOL"} + # + # This is what it generates: + # + # + # Specifies the available VM network connections + # 0 + # + # 0 + # 10.192.0.130 + # true + # 00:50:56:01:00:8d + # POOL + # + # + # + # + # @see http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/doc/types/NetworkConnectionSectionType.html + # vCloud API Documentation + class VmNetwork + attr_reader :attrs + + def initialize(attrs={}) + @attrs = attrs + end + + def generate_xml + output = "" + output << header + output << body(@attrs) + output << tail + output + end + + def network + @attrs[:network] + end + + def network=(new_network_name) + @attrs[:network] = new_network_name + end + + def ip_address + @attrs[:ip_address] + end + + def ip_address=(new_ip_address) + @attrs[:ip_address] = new_ip_address + end + + def is_connected + @attrs[:is_connected] + end + + def is_connected=(new_is_connected) + @attrs[:is_connected] = new_is_connected + end + + def ip_address_allocation_mode + @attrs[:ip_address_allocation_mode] + end + + def ip_address_allocation_mode=(new_ip_address_allocation_mode) + @attrs[:ip_address_allocation_mode] = new_ip_address_allocation_mode + end + + private + + def header + '' + end + + def body(opts={}) + body = <#{opts[:info]} + #{opts[:primary_network_connection_index]} + + #{opts[:network_connection_index]} + #{opts[:ip_address]} + #{opts[:is_connected]} + #{opts[:mac_address]} + #{opts[:ip_address_allocation_mode]} + +EOF + end + + def tail + '' + end + end + end + end + end +end