diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb index d312965b54..17f4ea17de 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb @@ -122,7 +122,6 @@ class DatacenterFolder def get_unimported_datastores(dpool, vcenter_instance_name, hpool) ds_objects = {} - vcenter_uuid = get_vcenter_instance_uuid fetch! if @items.empty? #Get datacenters @@ -319,7 +318,6 @@ class DatacenterFolder network_objects = {} vcenter_uuid = get_vcenter_instance_uuid - pc = @vi_client.vim.serviceContent.propertyCollector #Get all port groups and distributed port groups in vcenter instance @@ -347,21 +345,26 @@ class DatacenterFolder { :type => 'DistributedVirtualPortgroup', :pathSet => ['name'] } ] ) - result = pc.RetrieveProperties(:specSet => [filterSpec]) networks = {} result.each do |r| networks[r.obj._ref] = r.to_hash if r.obj.is_a?(RbVmomi::VIM::DistributedVirtualPortgroup) || r.obj.is_a?(RbVmomi::VIM::Network) networks[r.obj._ref][:network_type] = r.obj.is_a?(RbVmomi::VIM::DistributedVirtualPortgroup) ? "Distributed Port Group" : "Port Group" - end + #Multicluster nets support + networks[r.obj._ref][:clusters] = {} + networks[r.obj._ref][:clusters][:refs] = [] + networks[r.obj._ref][:clusters][:one_ids] = [] + networks[r.obj._ref][:clusters][:names] = [] + end view.DestroyView # Destroy the view - fetch! if @items.empty? #Get datacenters + #Get datacenters + fetch! if @items.empty? + #Iterate over datacenters @items.values.each do |dc| - dc_name = dc.item.name network_objects[dc_name] = [] @@ -392,19 +395,19 @@ class DatacenterFolder result = pc.RetrieveProperties(:specSet => [filterSpec]) clusters = {} - result.each do |r| + result.each do |r| clusters[r.obj._ref] = r.to_hash if r.obj.is_a?(RbVmomi::VIM::ClusterComputeResource) end view.DestroyView # Destroy the view clusters.each do |ref, info| - one_host = VCenterDriver::VIHelper.find_by_ref(OpenNebula::HostPool, "TEMPLATE/VCENTER_CCR_REF", ref, vcenter_uuid, hpool) + if !one_host || !one_host['CLUSTER_ID'] cluster_id = -1 else @@ -412,59 +415,51 @@ class DatacenterFolder end one_cluster = VCenterDriver::ClusterComputeResource.new_from_ref(ref, @vi_client) - - # Determine a host location - item = one_cluster.item - folders = [] - while !item.instance_of? RbVmomi::VIM::Datacenter - item = item.parent - if !item.instance_of? RbVmomi::VIM::Datacenter - folders << item.name if item.name != "host" - end - - if item.nil? - raise "Could not find the host's location" - end - end - - location = folders.reverse.join("/") - location = "/" if location.empty? + location = VCenterDriver::VIHelper.get_location(one_cluster.item) network_obj = info['network'] + cname = info['name'] network_obj.each do |n| network_ref = n._ref - network_name = networks[network_ref]['name'] - network_type = networks[network_ref][:network_type] - one_network = VCenterDriver::VIHelper.find_by_ref(OpenNebula::VirtualNetworkPool, + # network can belong to more than 1 cluster + networks[network_ref][:clusters][:refs] << ref + networks[network_ref][:clusters][:one_ids] << cluster_id + networks[network_ref][:clusters][:names] << cname + + next if networks[network_ref][:clusters][:refs].size > 1 + + # Is the first and first time net: + networks[network_ref][:one_net] = VCenterDriver::VIHelper.find_by_ref(OpenNebula::VirtualNetworkPool, "TEMPLATE/VCENTER_NET_REF", network_ref, vcenter_uuid, npool, false) - next if one_network #If the network has been already imported + end #networks loop + end #clusters loop - one_vnet = VCenterDriver::Network.to_one_template(network_name, - network_ref, - network_type, - ref, - info['name'], - vcenter_uuid, - vcenter_instance_name, - dc_name, - cluster_id, - location) + #general net_info related to datacenter + opts = {} + opts[:vcenter_uuid] = vcenter_uuid + opts[:vcenter_instance_name] = vcenter_instance_name + opts[:dc_name] = dc_name + networks.each do |nref, net_info| + next if net_info[:one_net] || net_info[:clusters][:refs].size < 1 - network_objects[dc_name] << one_vnet - end + opts[:clusters] = net_info[:clusters] + opts[:network_name] = net_info['name'] + opts[:network_ref] = nref + opts[:network_type] = net_info[:network_type] - end # network loop - end #datacenters loop + network_objects[dc_name] << VCenterDriver::Network.to_one_template(opts) + end + + end # datacenters loop return network_objects - end end # class DatatacenterFolder diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/importer.rb b/src/vmm_mad/remotes/lib/vcenter_driver/importer.rb index e4eb701864..bef1dc50e8 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/importer.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/importer.rb @@ -1,5 +1,4 @@ module VCenterDriver - class Importer VNC_ESX_HOST_FOLDER = "/tmp" @@ -640,22 +639,34 @@ def self.import_networks(con_ops, options) tmps.each do |n| if !use_defaults + message = false print_str = "\n * Network found:\n"\ - " - Name : \e[92m#{n[:name]}\e[39m\n"\ - " - Type : #{n[:type]}\n"\ - " - Cluster : \e[96m#{n[:cluster]}\e[39m\n"\ - " - Cluster location : #{n[:cluster_location]}\n"\ - " - OpenNebula Cluster ID : #{n[:one_cluster_id]}\n" + " - Name : \e[92m#{n[:name]}\e[39m\n"\ + " - Type : #{n[:type]}\n"\ + " - Vcenter Clusters(host id): " - if n[:one_cluster_id] == -1 - print_str << "You need to import the associated vcenter cluster as one host first!" + unimported = "" + import = false + + for i in 0..(n[:clusters][:refs].size-1) + if n[:clusters][:one_ids][i] != -1 + import = true + print_str << "\e[96m#{n[:clusters][:names][i]}(#{n[:clusters][:one_ids][i]})\e[39m " + else + message = true + print_str << "\e[91m#{n[:clusters][:names][i]}\e[39m " + unimported << "#{n[:clusters][:names][i]} " + end + end + + if !import + print_str << "\n You need to at least 1 vcenter cluster as one host first!" else - print_str << " Import this Network (y/[n])? " + print_str << "\n Import this Network (y/[n])? " end STDOUT.print print_str - - next if STDIN.gets.strip.downcase != 'y' || n[:one_cluster_id] == -1 + next if STDIN.gets.strip.downcase != 'y' || !import end # we try to retrieve once we know the desired net @@ -683,6 +694,11 @@ def self.import_networks(con_ops, options) ip6_address = nil prefix_length = nil + if !use_defaults && message + STDOUT.print "\n\e[93mWarning: you have unimported clusters for this network: #{unimported}\n"\ + "cancel this process(ctrl-C) if you want to import them first\e[39m\n\n" + end + # Size if !use_defaults STDOUT.print " How many VMs are you planning"\ @@ -787,8 +803,22 @@ def self.import_networks(con_ops, options) n[:one] << ar_str one_vn = VCenterDriver::VIHelper.new_one_item(OpenNebula::VirtualNetwork) + if n[:clusters] #Distributed Port Group + done = [] + for i in 0..n[:clusters][:refs].size-1 + cl_id = n[:clusters][:one_ids][i] + next if cl_id == -1 || done.include?(cl_id) - rc = one_vn.allocate(n[:one],n[:one_cluster_id].to_i) + if done.empty? + rc = one_vn.allocate(n[:one],cl_id.to_i) + one_vn.info + else + one_cluster = VCenterDriver::VIHelper.one_item(OpenNebula::Cluster, cl_id, false) + rc = one_cluster.addvnet(one_vn['ID'].to_i) + end + done << cl_id + end + end if ::OpenNebula.is_error?(rc) STDOUT.puts "\n Error creating virtual network: " + diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/network.rb b/src/vmm_mad/remotes/lib/vcenter_driver/network.rb index 6000900022..b67ef2c329 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/network.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/network.rb @@ -91,37 +91,52 @@ class Network return id end - def self.to_one_template(network_name, network_ref, network_type, - ccr_ref, ccr_name, vcenter_uuid, - vcenter_instance_name, dc_name, cluster_id, - cluster_location, - unmanaged=nil, template_ref=nil, dc_ref=nil, - vm_or_template_name=nil, template_id=nil) - one_tmp = {} + def self.generate_name(name, opts = {}) + vcenter_instance_name = opts[:vcenter_name] || nil + dc_name = opts[:dc_name] || nil - hash_name = "#{network_name} - #{ccr_name.tr(" ", "_")} [#{vcenter_instance_name} - #{dc_name}]_#{cluster_location}" + hash_name = "#{name} - [#{vcenter_instance_name} - #{dc_name}]" sha256 = Digest::SHA256.new network_hash = sha256.hexdigest(hash_name)[0..11] - network_import_name = "#{network_name} - #{ccr_name.tr(" ", "_")} [#{vcenter_instance_name} - #{dc_name}]_#{network_hash}" + network_import_name = "#{name} - [#{vcenter_instance_name} - #{dc_name}]_#{network_hash}" + end + + def self.to_one_template(opts = {}) + + one_tmp = {} + network_name = opts[:network_name] + network_ref = opts[:network_ref] + network_type = opts[:network_type] + + vcenter_uuid = opts[:vcenter_uuid] + vcenter_instance_name = opts[:vcenter_instance_name] + dc_name = opts[:dc_name] + cluster_id = opts[:cluster_id] + + unmanaged = opts[:unmanaged] || nil + template_ref = opts[:template_ref] || nil + dc_ref = opts[:dc_ref] || nil + vm_or_template_name = opts[:vm_or_template_name] || nil + template_id = opts[:template_id] || nil + + network_import_name = generate_name(network_name, {:vcenter_name=>vcenter_instance_name, :dc_name=>dc_name}) one_tmp[:name] = network_name one_tmp[:import_name] = network_import_name one_tmp[:bridge] = network_name one_tmp[:type] = network_type - one_tmp[:cluster] = ccr_name - one_tmp[:cluster_location] = cluster_location - one_tmp[:vcenter_ccr_ref] = ccr_ref one_tmp[:one_cluster_id] = cluster_id one_tmp[:vcenter_net_ref] = network_ref + one_tmp[:clusters] = opts[:clusters] || nil one_tmp[:one] = to_one(network_import_name, network_name, network_ref, network_type, - ccr_ref, vcenter_uuid, unmanaged, template_ref, dc_ref, template_id) + vcenter_uuid, unmanaged, template_ref, dc_ref, template_id) return one_tmp end def self.to_one(network_import_name, network_name, network_ref, network_type, - ccr_ref, vcenter_uuid, unmanaged, template_ref, dc_ref, template_id) + vcenter_uuid, unmanaged, template_ref, dc_ref, template_id) template = "NAME=\"#{network_import_name}\"\n"\ "BRIDGE=\"#{network_name}\"\n"\ @@ -135,7 +150,7 @@ class Network template += "VCENTER_FROM_WILD=\"#{template_id}\"\n" end - template += "VCENTER_CCR_REF=\"#{ccr_ref}\"\n" if !unmanaged + #template += "VCENTER_CCR_REF=\"#{ccr_ref}\"\n" if !unmanaged template += "VCENTER_TEMPLATE_REF=\"#{template_ref}\"\n" if template_ref 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 c5f7a013e7..54a1f6a2db 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/virtual_machine.rb @@ -446,22 +446,26 @@ class Template net_host = VCenterDriver::ClusterComputeResource.new_from_ref(ccr_ref, @vi_client) location = VCenterDriver::VIHelper.get_location(net_host.item) + import_opts = { + :network_name=> nic[:net_name], + :network_ref=> nic[:net_ref], + :network_type=> nic[:pg_type], + :ccr_ref=> ccr_ref, + :ccr_name=> ccr_name, + :vcenter_uuid=> vc_uuid, + :vcenter_instance_name=> vcenter_instance_name, + :dc_name=> dc_name, + :cluster_id=> cluster_id, + :location=> location, + :unmanaged=> unmanaged, + :template_ref=> template_ref, + :dc_ref=> dc_ref, + :vm_or_template_name=> vm_name, + :template_id=> vm_id + } + # Prepare the Virtual Network template - one_vnet = VCenterDriver::Network.to_one_template(nic[:net_name], - nic[:net_ref], - nic[:pg_type], - ccr_ref, - ccr_name, - vc_uuid, - vcenter_instance_name, - dc_name, - cluster_id, - location, - unmanaged, - template_ref, - dc_ref, - vm_name, - vm_id) + one_vnet = VCenterDriver::Network.to_one_template(import_opts) # By default add an ethernet range to network size 255 ar_str = ""