diff --git a/src/oneprovision/lib/provision.rb b/src/oneprovision/lib/provision.rb index 988603c923..00f78cbc6e 100644 --- a/src/oneprovision/lib/provision.rb +++ b/src/oneprovision/lib/provision.rb @@ -124,6 +124,11 @@ module OneProvision msg = "#{section.chomp('s')} #{obj['ID']}" Driver.retry_loop "Failed to delete #{msg}" do + if section == 'vnets' + vnet = Vnet.new(obj.id) + vnet.delete_ars + end + OneProvisionLogger.debug("Deleting OpenNebula #{msg}") Utils.exception(obj.delete) diff --git a/src/oneprovision/lib/resource.rb b/src/oneprovision/lib/resource.rb index 2c9e9f542c..bf9b22dffd 100644 --- a/src/oneprovision/lib/resource.rb +++ b/src/oneprovision/lib/resource.rb @@ -61,9 +61,15 @@ module OneProvision @pool = OpenNebula::HostPool.new(client) when 'Vnet' - xml = OpenNebula::VirtualNetwork.build_xml + if !id + xml = OpenNebula::VirtualNetwork.build_xml + + @one = OpenNebula::VirtualNetwork.new(xml, client) + else + @one = OpenNebula::VirtualNetwork.new_with_id(id, client) + @one.info + end - @one = OpenNebula::VirtualNetwork.new(xml, client) @pool = OpenNebula::VirtualNetworkPool.new(client) end end diff --git a/src/oneprovision/lib/vnet.rb b/src/oneprovision/lib/vnet.rb index 1cd7371ca0..9bd45f502c 100644 --- a/src/oneprovision/lib/vnet.rb +++ b/src/oneprovision/lib/vnet.rb @@ -22,8 +22,8 @@ module OneProvision class Vnet < Resource # Class constructor - def initialize - super 'Vnet' + def initialize(id = nil) + super('Vnet', id) end # Creates a new VNET in OpenNebula @@ -43,6 +43,28 @@ module OneProvision super(cluster_id, template) end + # Deletes the address ranges from the vnet + def delete_ars + ars = @one.to_hash['VNET']['AR_POOL']['AR'] + id = @one.id + + [ars].flatten.each do |ar| + delete_ar(id, ar['AR_ID']) + end + end + + private + + # Delete an specific address range + # + # @param id [Integer] The id of the vnet + # @param ar_id [Integer] The id of the ar + def delete_ar(id, ar_id) + OneProvisionLogger.debug("Deleting AR #{ar_id} from VNET #{id}") + + @one.rm_ar(ar_id) + end + end end