From 5f984c664ba9788cae308faf7b1702f228ce2b18 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Thu, 16 Feb 2012 13:54:38 +0100 Subject: [PATCH] Feature #1067: Improve VLAN support in Sunstone --- src/sunstone/public/js/plugins/hosts-tab.js | 3 +- src/sunstone/public/js/plugins/vnets-tab.js | 138 ++++++++++++++++---- 2 files changed, 117 insertions(+), 24 deletions(-) diff --git a/src/sunstone/public/js/plugins/hosts-tab.js b/src/sunstone/public/js/plugins/hosts-tab.js index bffa341124..d076b59573 100644 --- a/src/sunstone/public/js/plugins/hosts-tab.js +++ b/src/sunstone/public/js/plugins/hosts-tab.js @@ -85,11 +85,12 @@ var create_host_tmpl =
\ \ \
\
\ diff --git a/src/sunstone/public/js/plugins/vnets-tab.js b/src/sunstone/public/js/plugins/vnets-tab.js index 87a153b4e9..daa3f60a3e 100644 --- a/src/sunstone/public/js/plugins/vnets-tab.js +++ b/src/sunstone/public/js/plugins/vnets-tab.js @@ -51,8 +51,25 @@ var create_vn_tmpl =
\ \
\ + \ +
\ \
\ + \ + \ + \ +
\ + \ +
\
\
\ \ @@ -530,12 +547,20 @@ function updateVNetworkInfo(request,vn){ '+tr("Group")+'\ '+vn_info.GNAME+'\ \ + \ + '+tr("Bridge")+'\ + '+ (typeof(vn_info.BRIDGE) == "object" ? "--": vn_info.BRIDGE) +'\ + \ + \ + '+tr("VLAN")+'\ + '+ (vn_info.VLAN == "0" ? "no" : "yes") +'\ + \ \ '+tr("Physical device")+'\ '+ (typeof(vn_info.PHYDEV) == "object" ? "--": vn_info.PHYDEV) +'\ \ \ - '+tr("VNET ID")+'\ + '+tr("VLAN ID")+'\ '+ (typeof(vn_info.VLAN_ID) == "object" ? "--": vn_info.VLAN_ID) +'\ \ Permissions\ @@ -704,6 +729,36 @@ function setupCreateVNetDialog() { $('div#fixed',$create_vn_dialog).hide(); $('div#ranged',$create_vn_dialog).show(); }); + + $('#network_mode',dialog).change(function(){ + $('input,select#vlan,label[for!="network_mode"]', $(this).parent()).hide(); + $('input', $(this).parent()).val(""); + switch ($(this).val()) { + case "default": + $('input#bridge,label[for="bridge"]',$create_vn_dialog).show(); + $('input#phydev,label[for="phydev"]',$create_vn_dialog).show(); + break; + case "802.1Q": + $('input#bridge,label[for="bridge"]',$create_vn_dialog).show(); + $('input#phydev,label[for="phydev"]',$create_vn_dialog).show(); + $('select#vlan,label[for="vlan"]',$create_vn_dialog).show(); + $('input#vlan_id,label[for="vlan_id"]',$create_vn_dialog).show(); + break; + case "etables": + $('input#bridge,label[for="bridge"]',$create_vn_dialog).show(); + break; + case "openvswitch": + case "vmware": + $('input#bridge,label[for="bridge"]',$create_vn_dialog).show(); + $('select#vlan,label[for="vlan"]',$create_vn_dialog).show(); + $('input#vlan_id,label[for="vlan_id"]',$create_vn_dialog).show(); + break; + }; + }); + + //Initialize shown options + $('#network_mode',dialog).trigger("change"); + $('button',dialog).button(); @@ -786,12 +841,60 @@ function setupCreateVNetDialog() { notifyError(tr("Virtual Network name missing!")); return false; } - var bridge = $('#bridge',this).val(); - var type = $('input:checked',this).val(); + var network_json = {"name" : name}; + + var network_mode = $('select#network_mode',this).val(); + var bridge = $('#bridge',this).val(); + var phydev = $('#phydev',this).val(); + var vlan = $('#vlan',this).val(); + var vlan_id = $('#vlan_id',this).val(); + switch (network_mode) { + case "default": + if (!bridge && !phydev){ + notifyError("Bridge or physical device must be specified"); + return false; + }; + if (bridge) network_json['bridge']=bridge; + if (phydev) network_json['phydev']=phydev; + break; + case "802.1Q": + if (!phydev){ + notifyError("Physical device must be specified"); + return false; + }; + network_json['phydev']=phydev; + if (bridge) network_json['bridge']=bridge; + if (vlan_id) { + network_json['vlan']=vlan; + network_json['vlan_id']=vlan_id; + }; + break; + case "etables": + if (!bridge){ + notifyError("Bridge must be specified"); + return false; + }; + network_json['bridge']=bridge; + break; + case "openvswitch": + case "vmware": + if (!bridge){ + notifyError("Bridge must be specified"); + return false; + }; + network_json['bridge']=bridge; + if (vlan_id) { + network_json['vlan']=vlan; + network_json['vlan_id']=vlan_id; + }; + break; + }; + + var type = $('input:checked',this).val(); + network_json['type']=type; //TODO: Name and bridge provided?! - var network_json = null; if (type == "fixed") { var leases = $('#leases option', this); var leases_obj=[]; @@ -807,12 +910,7 @@ function setupCreateVNetDialog() { }); //and construct the final data for the request - network_json = { - "vnet" : { - "type" : "FIXED", - "leases" : leases_obj, - "bridge" : bridge, - "name" : name }}; + network_json["leases"] = leases_obj; } else { //type ranged @@ -827,25 +925,17 @@ function setupCreateVNetDialog() { return false; }; - //we form the object for the request - network_json = { - "vnet" : { - "type" : "RANGED", - "bridge" : bridge, - "name" : name } - }; - if (network_addr.length) - network_json["vnet"]["network_address"]=network_addr; + network_json["network_address"]=network_addr; if (network_mask.length) - network_json["vnet"]["network_mask"]=network_mask; + network_json["network_mask"]=network_mask; if (custom){ if (ip_start.length) - network_json["vnet"]["ip_start"] = ip_start; + network_json["ip_start"] = ip_start; if (ip_end.length) - network_json["vnet"]["ip_end"] = ip_end; + network_json["ip_end"] = ip_end; }; }; @@ -853,11 +943,13 @@ function setupCreateVNetDialog() { $('#custom_var_vnet_box option',$create_vn_dialog).each(function(){ var attr_name = $(this).attr('name'); var attr_value = $(this).val(); - network_json["vnet"][attr_name] = attr_value; + network_json[attr_name] = attr_value; }); //Create the VNetwork. + network_json = {"vnet" : network_json}; + Sunstone.runAction("Network.create",network_json); $create_vn_dialog.dialog('close'); return false;