diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb index acf8e7de8e..d312965b54 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb @@ -441,7 +441,8 @@ class DatacenterFolder "TEMPLATE/VCENTER_NET_REF", network_ref, vcenter_uuid, - npool) + npool, + false) next if one_network #If the network has been already imported one_vnet = VCenterDriver::Network.to_one_template(network_name, diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb b/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb index a733a2ac54..b0ab0538fd 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/vi_helper.rb @@ -71,14 +71,31 @@ class VIHelper hash end - def self.find_by_ref(the_class, attribute, ref, vcenter_uuid, pool = nil) + def self.clean_ref_hash(attr = nil) + if attr.nil? + @ref_hash = {} + else + @ref_hash[attr] = {} + end + end + + def self.find_by_ref(the_class, attribute, ref, vcenter_uuid, pool = nil, one_managed = nil) + one_managed = one_managed.nil? || one_managed pool = one_pool(the_class, false) if pool.nil? @ref_hash ||= {} @ref_hash[attribute] ||= create_ref_hash(attribute, pool) e = @ref_hash[attribute][ref] - if e && (!e[:opennebula_managed] || e[:opennebula_managed] != "NO") && + return nil if e.nil? + + if one_managed + one_managed_test = (!e[:opennebula_managed] || e[:opennebula_managed] != "NO") + else + one_managed_test = (!e[:opennebula_managed] || e[:opennebula_managed] != "YES") + end + + if one_managed_test && (e[:tvcenter_instance_id] == vcenter_uuid || e[:uvcenter_instance_id] == vcenter_uuid) return e[:opennebula_object] diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb index 06835489be..7fa1c7009a 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -368,23 +368,33 @@ class Template vc_nics.each do |nic| # Check if the network already exists - if wild - network_found = false - else - network_found = VCenterDriver::VIHelper.find_by_ref(OpenNebula::VirtualNetworkPool, - "TEMPLATE/VCENTER_NET_REF", - nic[:net_ref], - vc_uuid, - npool) - end + network_found = VCenterDriver::VIHelper.find_by_ref(OpenNebula::VirtualNetworkPool, + "TEMPLATE/VCENTER_NET_REF", + nic[:net_ref], + vc_uuid, + npool, false) #Network is already in OpenNebula if network_found + # Create the new size 1 AR + ar_tmp = "" + ar_tmp << "AR=[\n" + ar_tmp << "TYPE=\"ETHER\",\n" + if wild && nic[:mac] + ar_tmp << "MAC=\"#{nic[:mac]}\",\n" + ar_tmp << "SIZE=\"1\"\n" + else + ar_tmp << "SIZE=\"255\"\n" + end + ar_tmp << "]\n" + network_found.add_ar(ar_tmp) + # This is the existing nic info nic_tmp = "" nic_tmp << "NIC=[\n" nic_tmp << "NETWORK_ID=\"#{network_found["ID"]}\",\n" + nic_tmp << "MAC=\"#{nic[:mac]}\",\n" if wild && nic[:mac] nic_tmp << "OPENNEBULA_MANAGED=\"NO\"\n" nic_tmp << "]\n" @@ -472,6 +482,7 @@ class Template # Allocate the Virtual Network allocated_networks << one_vn rc = one_vn.allocate(one_vnet[:one], cluster_id.to_i) + VCenterDriver::VIHelper.clean_ref_hash() if OpenNebula.is_error?(rc) error = "\n ERROR: Could not allocate virtual network due to #{rc.message}\n"