diff --git a/lib/fog/vcloud/mock_data_classes.rb b/lib/fog/vcloud/mock_data_classes.rb index 54965cf92..ccc19e642 100644 --- a/lib/fog/vcloud/mock_data_classes.rb +++ b/lib/fog/vcloud/mock_data_classes.rb @@ -47,17 +47,7 @@ module Fog end def inspect - "<#{self.class.name} #{object_id} data=#{super} method_data=#{method_data.inspect}>" - end - - private - - def unique_methods - (public_methods - self.class.superclass.public_instance_methods).reject {|m| m.to_s =~ /!$/ } - end - - def method_data - (unique_methods + [:href]).sort_by(&:to_s).find_all {|m| method(m).arity == 0 }.inject({}) {|md, m| md.update(m => send(m)) } + "<#{self.class.name} #{object_id} data=#{super}>" end end @@ -434,6 +424,10 @@ module Fog def rnat self[:rnat] || _parent._parent.rnat end + + def rnat_set? + !!self[:rnat] + end end class MockNetworkExtensions < Base @@ -495,6 +489,12 @@ module Fog disks.inject(0) {|s, d| s + d.vcloud_size } end + def network_ip + if network = _parent.networks.detect {|n| n.ip_collection.items[ip] } + network.ip_collection.items[ip] + end + end + # from fog ecloud server's _compose_vapp_data def to_configure_vapp_hash { diff --git a/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb b/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb index 97d6a9347..d3fe1bed1 100644 --- a/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb +++ b/lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb @@ -2,14 +2,19 @@ module Fog class Vcloud module Terremark class Ecloud - class Real + module Shared + private - def validate_network_ip_data(network_ip_data, configure=false) + def validate_network_ip_data(network_ip_data) valid_opts = [:id, :href, :name, :status, :server, :rnat] unless valid_opts.all? { |opt| network_ip_data.keys.include?(opt) } raise ArgumentError.new("Required data missing: #{(valid_opts - network_ip_data.keys).map(&:inspect).join(", ")}") end end + end + + class Real + include Shared def configure_network_ip(network_ip_uri, network_ip_data) validate_network_ip_data(network_ip_data) @@ -38,13 +43,24 @@ module Fog builder.RnatAddress(network_ip_data[:rnat]) } end - end class Mock + include Shared def configure_network_ip(network_ip_uri, network_ip_data) - Fog::Mock.not_implemented + validate_network_ip_data(network_ip_data) + + if network_ip = mock_data.network_ip_from_href(network_ip_uri) + network_ip[:rnat] = network_ip_data[:rnat] + + builder = Builder::XmlMarkup.new + xml = network_ip_response(builder, network_ip, ecloud_xmlns) + + mock_it 200, xml, { 'Content-Type' => 'application/vnd.tmrk.ecloud.ip+xml' } + else + mock_error 200, "401 Unauthorized" + end end end end diff --git a/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb b/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb index 270a6897e..7b7897d16 100644 --- a/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb +++ b/lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb @@ -13,7 +13,8 @@ module Fog vdc = virtual_machine._parent if vdc.internet_service_collection.items.detect {|is| is.node_collection.items.any? {|isn| isn.ip_address == virtual_machine.ip } } || - virtual_machine.status != 2 + virtual_machine.status != 2 || + virtual_machine.network_ip.rnat_set? mock_it 202, '', {} else vdc.virtual_machines.delete(virtual_machine) diff --git a/spec/vcloud/terremark/ecloud/requests/configure_network_ip_spec.rb b/spec/vcloud/terremark/ecloud/requests/configure_network_ip_spec.rb new file mode 100644 index 000000000..b5d7997c3 --- /dev/null +++ b/spec/vcloud/terremark/ecloud/requests/configure_network_ip_spec.rb @@ -0,0 +1,53 @@ +require File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper') + +if Fog.mocking? + describe "Fog::Vcloud, initialized w/ the TMRK Ecloud module", :type => :mock_tmrk_ecloud_request do + subject { @vcloud } + + it { should respond_to :configure_network_ip } + + describe "#configure_network_ip" do + let(:original_network_ip) { @vcloud.get_network_ip(@mock_network_ip.href).body } + let(:network_ip_data) do + { + :id => original_network_ip[:Id], + :href => original_network_ip[:Href], + :name => original_network_ip[:Name], + :status => original_network_ip[:Status], + :server => original_network_ip[:Server], + :rnat => "1.2.3.4" + } + end + + context "with a valid network ip uri" do + + subject { @vcloud.configure_network_ip(@mock_network_ip.href, network_ip_data) } + + it_should_behave_like "all responses" + + describe "#body" do + subject { @vcloud.configure_network_ip(@mock_network_ip.href, network_ip_data).body } + + #Stuff that shouldn't change + its(:Href) { should == @mock_network_ip.href } + its(:Id) { should == @mock_network_ip.object_id.to_s } + its(:Name) { should == @mock_network_ip.ip } + its(:Status) { should == @mock_network_ip.status } + + #Stuff that should change + it "should change the rnat" do + expect { subject }.to change { @vcloud.get_network_ip(@mock_network_ip.href).body[:RnatAddress] }.to(network_ip_data[:rnat]) + end + end + + end + + context "with a nodes uri that doesn't exist" do + subject { lambda { @vcloud.configure_network_ip(URI.parse('https://www.fakey.c/piv8vc99'), network_ip_data) } } + + it_should_behave_like "a request for a resource that doesn't exist" + end + end + end +else +end diff --git a/spec/vcloud/terremark/ecloud/requests/delete_vapp_spec.rb b/spec/vcloud/terremark/ecloud/requests/delete_vapp_spec.rb index 6b0ae9598..5087ca5dd 100644 --- a/spec/vcloud/terremark/ecloud/requests/delete_vapp_spec.rb +++ b/spec/vcloud/terremark/ecloud/requests/delete_vapp_spec.rb @@ -69,6 +69,15 @@ if Fog.mocking? it_should_behave_like "all delete responses" it_should_behave_like "a failed vapp deletion" end + + context "when the VM's IP has an rnat set" do + before do + @mock_vm.network_ip[:rnat] = "1.2.3.4" + end + + it_should_behave_like "all delete responses" + it_should_behave_like "a failed vapp deletion" + end end context "with a vapp uri that doesn't exist" do