diff --git a/src/cli/onevcenter b/src/cli/onevcenter index 0b4f6e24d5..7eef5a5880 100755 --- a/src/cli/onevcenter +++ b/src/cli/onevcenter @@ -257,10 +257,21 @@ CommandParser::CmdParser.new(ARGV) do importer = VCenterDriver::VcImporter.new_child(helper.client, vi_client, options[:object]) - importer.retrieve_resources(helper.parse_opts(options)) - indexes = importer.get_indexes(args.first) - importer.process_import(indexes) + if options[:object] == "networks" && !args.first.nil? + indexes = args.first + else + importer.retrieve_resources(helper.parse_opts(options)) + indexes = importer.get_indexes(args.first) + end + + if indexes.nil? + raise "Could not get any unimported #{options[:object]}"\ + " resources info in host: #{options[:host]} with"\ + " this input: #{args.first}" + end + + importer.process_import(indexes, options) importer.stdout rescue StandardError => e diff --git a/src/sunstone/routes/vcenter.rb b/src/sunstone/routes/vcenter.rb index d0e75f79b5..d00029c3d8 100644 --- a/src/sunstone/routes/vcenter.rb +++ b/src/sunstone/routes/vcenter.rb @@ -28,6 +28,7 @@ MAX_VCENTER_PASSWORD_LENGTH = 22 #This is the maximum length for a vCenter passw require 'vcenter_driver' $importer = nil +$opts = nil helpers do def vcenter_client @@ -192,8 +193,12 @@ get '/vcenter/networks' do begin client = OpenNebula::Client.new(nil, $conf[:one_xmlrpc]) new_vcenter_importer("networks", client) - opts = {:host => params["host"], :filter => true} - [200, $importer.retrieve_resources(opts).to_json] + $opts = { + :host => params["host"], + :filter => true, + :short => true + } + [200, $importer.retrieve_resources($opts).to_json] rescue Exception => e logger.error("[vCenter] " + e.message) error = Error.new(e.message) @@ -203,8 +208,11 @@ end post '/vcenter/networks' do begin - $importer.process_import(params["networks"], params["opts"]) - + $opts[:short] = false + $importer.process_import( + params["networks"], + $opts + ) [200, $importer.output.to_json] rescue Exception => e logger.error("[vCenter] " + e.message) diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb index cfc9180415..1ad8496faf 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/datacenter.rb @@ -373,8 +373,6 @@ class DatacenterFolder # Determine if a network must be excluded from the list def exclude_network?(vc_network, one_host, args, vc_network_hash) - - vc_network_ref = vc_network_hash[:vc_network_ref] vc_network_name = vc_network_hash[:vc_network_name] vc_network_host = vc_network_hash[:vc_network_host] vc_network_tag = vc_network_hash[:vc_network_tag] @@ -406,7 +404,7 @@ class DatacenterFolder end return false end - return false + false end # Proccess each network @@ -440,11 +438,10 @@ class DatacenterFolder # Initialize opts hash used to inject data into one template opts = {} - if full_process - # Add network type to network hash - network_type = VCenterDriver::Network.get_network_type(vc_network, vc_network_name) - network[vc_network_ref][:network_type] = network_type - end + # Add network type to network hash + network_type = VCenterDriver::Network.get_network_type(vc_network, vc_network_name) + network[vc_network_ref][:network_type] = network_type + network[vc_network_ref][:type] = network_type # Determine if the network must be excluded network[vc_network_ref][:excluded] = exclude_network?(vc_network, diff --git a/src/vmm_mad/remotes/lib/vcenter_driver/network.rb b/src/vmm_mad/remotes/lib/vcenter_driver/network.rb index d384d29f1c..b7a19bf070 100644 --- a/src/vmm_mad/remotes/lib/vcenter_driver/network.rb +++ b/src/vmm_mad/remotes/lib/vcenter_driver/network.rb @@ -382,6 +382,72 @@ class NetImporter < VCenterDriver::VcImporter @defaults = { size: "255", type: "ether" } end + def process_import(indexes, opts = {}, &block) + + indexes = indexes.gsub(/\s*\,\s*/, ',').strip.split(',') + + dc_folder = VCenterDriver::DatacenterFolder.new(@vi_client) + vcenter_instance_name = @vi_client.vc_name + vcenter_uuid = @vi_client.vim.serviceContent.about.instanceUuid + hpool = VCenterDriver::VIHelper.one_pool( + OpenNebula::HostPool, + false + ) + + one_client = OpenNebula::Client.new + one_host = OpenNebula::Host.new_with_id(opts[:host], one_client) + + rc = one_host.info + raise rc.message if OpenNebula.is_error? rc + + # Get all networks in vcenter cluster (one_host) + vc_cluster_networks = dc_folder.cluster_networks(one_host) + + vc_cluster_networks_map_ref = {} + + # Iterate over vcenter networks + vc_cluster_networks.each do |vc_cluster_network| + vc_cluster_networks_map_ref[vc_cluster_network._ref] = + vc_cluster_network + end + + indexes.each do |index| + begin + @rollback = [] + @info[index] = {} + + vc_cluster_network = vc_cluster_networks_map_ref[index] + + if hpool.respond_to?(:message) + raise 'Could not get OpenNebula HostPool: ' \ + "#{hpool.message}" + end + + opts = {} + + selected = dc_folder.process_network(vc_cluster_network, vcenter_instance_name, vcenter_uuid, hpool, one_host, opts) + + selected = selected[index] + + if block_given? + @info[index][:opts] = block.call(selected) + elsif opts[index] + @info[index][:opts] = opts[index] + else + @info[index][:opts] = defaults + end + + # import the object + @info[:success] << import(selected) + rescue StandardError => e + @info[:error] << { index => e.message } + @info[index][:e] = e + + apply_rollback + end + end + end + def get_list(args = {}) dc_folder = VCenterDriver::DatacenterFolder.new(@vi_client) @@ -398,7 +464,7 @@ class NetImporter < VCenterDriver::VcImporter end rs = dc_folder.get_unimported_networks(npool, @vi_client.vc_name,hpool, args) - @list = rs + @list = rs end def add_cluster(cid, eid)