diff --git a/src/cli/onevcenter b/src/cli/onevcenter index 9529c10f89..b54451edc3 100755 --- a/src/cli/onevcenter +++ b/src/cli/onevcenter @@ -278,15 +278,9 @@ cmd=CommandParser::CmdParser.new(ARGV) do one_vn = ::OpenNebula::VirtualNetwork.new( ::OpenNebula::Template.build_xml, vc.one) - vnet_template = "NAME=\"#{n[:name]}\"\n" + - "BRIDGE=\"#{n[:name]}\"\n" + - "VCENTER_TYPE=\"#{n[:type]}\"" + - "AR=[\n" + - " TYPE = \"ETHER\"\n," + - " SIZE = \"#{size.to_i}\"\n]" - - vnet_template += "VLAN=\"YES\"\nVLAN_ID=#{n[:vlan]}" if n[:vlan] - + vnet_template = n[:one] + + " SIZE = \"#{size.to_i}\"\n]" + rc = one_vn.allocate(vnet_template) if ::OpenNebula.is_error?(rc) diff --git a/src/sunstone/public/js/plugins/hosts-tab.js b/src/sunstone/public/js/plugins/hosts-tab.js index 5c7e6dfaf3..48cec6c66f 100644 --- a/src/sunstone/public/js/plugins/hosts-tab.js +++ b/src/sunstone/public/js/plugins/hosts-tab.js @@ -1161,6 +1161,8 @@ function setupCreateHostDialog(){ ''+ '
'+ '
'+ + '
'+ + '
'+ '').appendTo(vcenter_container) $(".cluster_name", row).data("cluster_name", cluster_name) @@ -1223,6 +1225,68 @@ function setupCreateHostDialog(){ } else { templates_container.html(""); } + + var networks_container = $(".vcenter_networks", $(this).closest(".vcenter_cluster")); + if ($(this).is(":checked")) { + var path = '/vcenter/' + $(this).data("datacenter_name") + '/network/' + $(this).data("cluster_name"); + networks_container.html(generateAdvancedSection({ + html_id: path, + title: tr("Networks"), + content: ''+ + ''+ + ''+ + '' + })) + + $('a', networks_container).trigger("click") + + $.ajax({ + url: path, + type: "GET", + data: {timeout: false}, + dataType: "json", + headers: { + "X_VCENTER_USER": $("#vcenter_user", $create_host_dialog).val(), + "X_VCENTER_PASSWORD": $("#vcenter_password", $create_host_dialog).val(), + "X_VCENTER_HOST": $("#vcenter_host", $create_host_dialog).val() + }, + success: function(response){ + $(".content", networks_container).html(""); + + $.each(response, function(id, network){ + var trow = $('
' + + '
' + + '
' + + '
').appendTo($(".content", networks_container)) + + $(".network_name", trow).data("network_name", network.name) + $(".network_name", trow).data("one_network", network.one) + }); + }, + error: function(response){ + networks_container.html(""); + onError({}, OpenNebula.Error(response)); + } + }); + } else { + networks_container.html(""); + } + + }) }); } @@ -1327,14 +1391,64 @@ function setupCreateHostDialog(){ } }); }) + + $.each($(".network_name:checked", cluster_context), function(){ + var network_context = $(this).closest(".vcenter_network"); + + $(".vcenter_network_result:not(.success)", network_context).html( + ''+ + ''+ + ''+ + ''); + + network_name = unescape($(network_context).find('label')[0].className); + network_size = $(".netsize", network_context).val(); + network_tmpl = $(this).data("one_network"); + + network_tmpl = network_tmpl + ' SIZE = "'+ network_size +'"]' + + var vnet_json = { + "vnet": { + "vnet_raw": network_tmpl + } + }; + + OpenNebula.Network.create({ + timeout: true, + data: vnet_json, + success: function(request, response) { + OpenNebula.Helper.clear_cache("VNET"); + $(".vcenter_network_result", network_context).addClass("success").html( + ''+ + ''+ + ''+ + ''); + + $(".vcenter_network_response", network_context).html('

'+ + tr("Virtual Network created successfully")+' ID:'+response.VNET.ID+ + '

'); + }, + error: function (request, error_json){ + $(".vcenter_network_result", network_context).html(''+ + ''+ + ''+ + ''); + + $(".vcenter_network_response", network_context).html('

'+ + (error_json.error.message || tr("Cannot contact server: is it running and reachable?"))+ + '

'); + } + }); + }) + }, error: function (request, error_json){ - $(".vcenter_host_result", context).html(''+ + $(".vcenter_host_result", $create_host_dialog).html(''+ ''+ ''+ ''); - $(".vcenter_host_response", context).html('

'+ + $(".vcenter_host_response", $create_host_dialog).html('

'+ (error_json.error.message || tr("Cannot contact server: is it running and reachable?"))+ '

'); } diff --git a/src/sunstone/routes/vcenter.rb b/src/sunstone/routes/vcenter.rb index 8ecf3f6564..2d70844863 100644 --- a/src/sunstone/routes/vcenter.rb +++ b/src/sunstone/routes/vcenter.rb @@ -86,4 +86,24 @@ get '/vcenter/:datacenter/cluster/:name' do error = Error.new(e.message) error 403, error.to_json end +end + +get '/vcenter/:datacenter/network/:name' do + begin + rs = vcenter_client.vcenter_networks + + networks = rs[params[:datacenter]] + if networks.nil? + msg = "Datacenter " + params[:datacenter] + "not found" + logger.error("[vCenter] " + msg) + error = Error.new(msg) + error 404, error.to_json + end + + [200, networks.to_json] + rescue Exception => e + logger.error("[vCenter] " + e.message) + error = Error.new(e.message) + error 403, error.to_json + end end \ No newline at end of file diff --git a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb index 5d2fca7d4c..a4a429de15 100644 --- a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb +++ b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb @@ -252,42 +252,57 @@ class VIClient one_nets = [] networks.each { |n| + vnet_template = "NAME=\"#{n[:name]}\"\n" + + "BRIDGE=\"#{n[:name]}\"\n" + + "VCENTER_TYPE=\"Port Group\"" + + "AR=[\n" + + " TYPE = \"ETHER\"\n," + one_nets << {:name => n.name, :bridge => n.name, - :type => "Port Group"} + :type => "Port Group", + :one => vnet_template} } - vcenter_networks[dc.name] = one_nets - networks = get_entities(dc.networkFolder, 'DistributedVirtualPortgroup' ) - one_nets = [] networks.each { |n| - one_net = {:name => n.name, - :bridge => n.name, - :type=> "Distributed Port Group"} + vnet_template = "NAME=\"#{n[:name]}\"\n" + + "BRIDGE=\"#{n[:name]}\"\n" + + "VCENTER_TYPE=\"Distributed Port Group\"" + + "AR=[\n" + + " TYPE = \"ETHER\"\n," - vlan = n.config.defaultPortConfig.vlan.vlanId + vlan = n.config.defaultPortConfig.vlan.vlanId + vlan_str = "" if vlan != 0 if vlan.is_a? Array - vlan_str = "" vlan.each{|v| - vlan_str += v.start + ".." + v.end + "," + vlan_str += v.start.to_s + ".." + v.end.to_s + "," } vlan_str.chop! else vlan_str = vlan.to_s end + end + one_net = {:name => n.name, + :bridge => n.name, + :type => "Distributed Port Group", + :one => vnet_template} + + if !vlan_str.empty? one_net[:vlan] = vlan_str + vnet_template = "VLAN=\"YES\"\nVLAN_ID=#{one_net[:vlan]}" + + vnet_template end one_nets << one_net } - vcenter_networks[dc.name] += one_nets + vcenter_networks[dc.name] = one_nets } return vcenter_networks