diff --git a/src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb b/src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb index b18230f2ac..fcc71d8e2f 100644 --- a/src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb +++ b/src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb @@ -43,11 +43,13 @@ module OpenNebulaJSON rc = case action_hash['perform'] when "addleases" then self.addleases(action_hash['params']) - when "rmleases" then self.rmleases(action_hash['params']) + when "rmleases" then self.rmleases(action_hash['params']) when "publish" then self.publish when "unpublish" then self.unpublish when "update" then self.update(action_hash['params']) when "chown" then self.chown(action_hash['params']) + when "hold" then self.hold(action_hash['params']) + when "release" then self.release(action_hash['params']) else error_msg = "#{action_hash['perform']} action not " << " available for this resource" @@ -70,5 +72,13 @@ module OpenNebulaJSON def chown(params=Hash.new) super(params['owner_id'].to_i,params['group_id'].to_i) end + + def hold(params=Hash.new) + super(params['ip']) + end + + def release(params=Hash.new) + super(params['ip']) + end end end diff --git a/src/sunstone/public/images/green_bullet.png b/src/sunstone/public/images/green_bullet.png new file mode 100644 index 0000000000..d64f9dbf9d Binary files /dev/null and b/src/sunstone/public/images/green_bullet.png differ diff --git a/src/sunstone/public/images/red_bullet.png b/src/sunstone/public/images/red_bullet.png new file mode 100644 index 0000000000..b8317a77cf Binary files /dev/null and b/src/sunstone/public/images/red_bullet.png differ diff --git a/src/sunstone/public/images/yellow_bullet.png b/src/sunstone/public/images/yellow_bullet.png new file mode 100644 index 0000000000..7d2e3a1911 Binary files /dev/null and b/src/sunstone/public/images/yellow_bullet.png differ diff --git a/src/sunstone/public/js/opennebula.js b/src/sunstone/public/js/opennebula.js index 325d07bb3a..0cba8a056e 100644 --- a/src/sunstone/public/js/opennebula.js +++ b/src/sunstone/public/js/opennebula.js @@ -511,6 +511,20 @@ var OpenNebula = { "rmleases", action_obj); }, + "hold" : function(params){ + var action_obj = params.data.extra_param; + OpenNebula.Action.simple_action(params, + OpenNebula.Network.resource, + "hold", + action_obj); + }, + "release" : function(params){ + var action_obj = params.data.extra_param; + OpenNebula.Action.simple_action(params, + OpenNebula.Network.resource, + "release", + action_obj); + }, "update": function(params){ var action_obj = {"template_raw" : params.data.extra_param }; OpenNebula.Action.simple_action(params, diff --git a/src/sunstone/public/js/plugins/vnets-tab.js b/src/sunstone/public/js/plugins/vnets-tab.js index e9b9dcfcfc..21c6150945 100644 --- a/src/sunstone/public/js/plugins/vnets-tab.js +++ b/src/sunstone/public/js/plugins/vnets-tab.js @@ -85,8 +85,14 @@ var create_vn_tmpl =
\ \
\ - \ - \ + \ +
\ + \ +
\ + \ +
\ + \ + \
\ \ \ @@ -95,9 +101,9 @@ var create_vn_tmpl =
\
\ \ - \ +
\ \ - \ +
\ \ \
\ @@ -248,7 +254,7 @@ var vnet_actions = { call: OpenNebula.Network.addleases, callback: vnShow, error: onError, - notify: true + notify: false, }, "Network.rmleases" : { @@ -256,9 +262,25 @@ var vnet_actions = { call: OpenNebula.Network.rmleases, callback: vnShow, error: onError, - notify: true + notify: false, }, + "Network.hold" : { + type: "single", + call: OpenNebula.Network.hold, + callback: vnShow, + error: onError, + notify: false, + }, + + "Network.release" : { + type: "single", + call: OpenNebula.Network.release, + callback: vnShow, + error: onError, + notify: false, + }, +/* "Network.modifyleases" : { type: "custom", call: function(action,obj){ @@ -278,7 +300,7 @@ var vnet_actions = { type: "custom", call: popUpRemoveLeaseDialog }, - +*/ "Network.chown" : { type: "multiple", call: OpenNebula.Network.chown, @@ -368,7 +390,7 @@ var vnet_buttons = { tip: "Select the new group:", condition: mustBeAdmin, }, - +/* "action_list" : { type: "select", actions: { @@ -382,7 +404,7 @@ var vnet_buttons = { } } }, - +*/ "Network.delete" : { type: "action", text: "Delete" @@ -455,6 +477,9 @@ function updateVNetworkElement(request, vn_json){ id = vn_json.VNET.ID; element = vNetworkElementArray(vn_json); updateSingleElement(element,dataTable_vNetworks,'#vnetwork_'+id); + + //we update this too, even if it's not shown. + $('#leases_form').replaceWith(printLeases(vn_json.VNET)); } //Callback to delete a vnet element from the table @@ -466,6 +491,8 @@ function deleteVNetworkElement(req){ function addVNetworkElement(request,vn_json){ var element = vNetworkElementArray(vn_json); addElement(element,dataTable_vNetworks); + //we update this too, even if it's not shown. + $('#leases_form').replaceWith(printLeases(vn_json.VNET)); } //updates the list of virtual networks @@ -494,6 +521,10 @@ function updateVNetworkInfo(request,vn){ ID\ '+vn_info.ID+'\ \ + \ + Name\ + '+vn_info.NAME+'\ + \ \ Owner\ '+vn_info.UNAME+'\ @@ -508,17 +539,15 @@ function updateVNetworkInfo(request,vn){ \ \ Physical device\ - '+(vn_info.PHYDEV ? vn_info.PHYDEV : "--" )+'\ + '+ (typeof(vn_info.PHYDEV) == "object" ? "--": vn_info.PHYDEV) +'\ \ - \ - \ - \ - \ - '+ - printLeases(vn_info.LEASES)+ - '
Leases information
';; - + \ + VNET ID\ + '+ (typeof(vn_info.VLAN_ID) == "object" ? "--": vn_info.VLAN_ID) +'\ + \ + '; + info_tab_content += printLeases(vn_info); var info_tab = { title: "Virtual Network information", @@ -541,19 +570,101 @@ function updateVNetworkInfo(request,vn){ } -function printLeases(leases){ - if (!leases.LEASE) //empty - { - return ""; +function printLeases(vn_info){ + var html ='
\ + \ + \ + '; + + if (vn_info.TYPE == "0"){ + html += '\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + '; + } else { + html += ''; }; - if (leases.LEASE.constructor == Array) //>1 lease + var leases = vn_info.LEASES.LEASE; + + if (!leases) //empty { - return prettyPrintJSON(leases.LEASE); + html+='\ + '; + return html; } - else {//1 lease - return prettyPrintJSON([leases.LEASE]); + else if (leases.constructor != Array) //>1 lease + { + leases = [leases]; }; + + var lease; + var state=null; + + for (var i=0; i'; + }; + + html += '
Leases information
IP Start'+vn_info.RANGE.IP_START+'
IP End'+vn_info.RANGE.IP_END+'
Network mask'+( vn_info.TEMPLATE.NETWORK_MASK ? vn_info.TEMPLATE.NETWORK_MASK : "--" )+'
\ + \ + \ +
\ + \ + \ +
\ + No leases to show\ + \ +
'; + html+=''; + + html += '\ + '+lease.MAC+'   '; + + switch (state){ + case 0: + html += 'hold | delete'; + break; + case 1: + html += 'Used by VM '+lease.VID; + break; + case 2: + html += 'release'; + break; + }; + html += '
'; + + return html; } //Prepares the vnet creation dialog @@ -622,6 +733,17 @@ function setupCreateVNetDialog() { return false; }); + $('#custom_pool', dialog).change(function(){ + if ($(this).is(':checked')){ + $('#ip_start', $create_vn_dialog).removeAttr('disabled'); + $('#ip_end', $create_vn_dialog).removeAttr('disabled'); + } + else { + $('#ip_start', $create_vn_dialog).attr('disabled','disabled'); + $('#ip_end', $create_vn_dialog).attr('disabled','disabled'); + }; + }); + $('#add_custom_var_vnet_button', dialog).click( function(){ @@ -681,7 +803,11 @@ function setupCreateVNetDialog() { else { //type ranged var network_addr = $('#net_address',this).val(); - var network_size = $('#net_size',this).val(); + var network_mask = $('#net_mask',this).val(); + var custom = $('#custom_pool',this).is(':checked'); + var ip_start = $('#ip_start',this).val(); + var ip_end = $('#ip_end',this).val(); + if (!network_addr.length){ notifyError("Please provide a network address"); return false; @@ -692,10 +818,17 @@ function setupCreateVNetDialog() { "vnet" : { "type" : "RANGED", "bridge" : bridge, - "network_size" : network_size, + "network_mask" : network_mask, "network_address" : network_addr, "name" : name } }; + + if (custom){ + if (ip_start.length) + network_json["vnet"]["ip_start"] = ip_start; + if (ip_end.length) + network_json["vnet"]["ip_start"] = ip_end; + }; }; //Time to add custom attributes @@ -826,6 +959,62 @@ function popUpVNetTemplateUpdateDialog(){ } +function setupLeasesOps(){ + $('button#panel_add_lease_button').live("click",function(){ + var lease = $(this).prev().val(); + //var mac = $(this).previous().val(); + var id = $(this).parents('form').attr('vnid'); + if (lease.length){ + var obj = {ip: lease}; + Sunstone.runAction('Network.addleases',id,obj); + } + return false; + }); + + $('button#panel_hold_lease_button').live("click",function(){ + var lease = $(this).prev().val(); + //var mac = $(this).previous().val(); + var id = $(this).parents('form').attr('vnid'); + if (lease.length){ + var obj = {ip: lease}; + Sunstone.runAction('Network.hold',id,obj); + } + return false; + }); + + $('form#leases_form a.delete_lease').live("click",function(){ + var lease = $(this).parents('tr').attr('ip'); + var id = $(this).parents('form').attr('vnid'); + var obj = { ip: lease}; + Sunstone.runAction('Network.rmleases',id,obj); + //Set spinner + $(this).parents('tr').html(''+spinner+''); + return false; + }); + + $('a.hold_lease').live("click",function(){ + var lease = $(this).parents('tr').attr('ip'); + var id = $(this).parents('form').attr('vnid'); + var obj = { ip: lease}; + Sunstone.runAction('Network.hold',id,obj); + //Set spinner + $(this).parents('tr').html(''+spinner+''); + return false; + }); + + $('a.release_lease').live("click",function(){ + var lease = $(this).parents('tr').attr('ip'); + var id = $(this).parents('form').attr('vnid'); + var obj = { ip: lease}; + Sunstone.runAction('Network.release',id,obj); + //Set spinner + $(this).parents('tr').html(''+spinner+''); + return false; + }); +} + + +/* function setupAddRemoveLeaseDialog() { dialogs_context.append('
'); $lease_vn_dialog = $('#lease_vn_dialog',dialogs_context) @@ -893,6 +1082,8 @@ function popUpRemoveLeaseDialog() { $lease_vn_dialog.dialog("open"); } +*/ + function setVNetAutorefresh() { setInterval(function(){ var checked = $('input.check_item:checked',dataTable_vNetworks); @@ -946,7 +1137,8 @@ $(document).ready(function(){ setupCreateVNetDialog(); setupVNetTemplateUpdateDialog(); - setupAddRemoveLeaseDialog(); + //setupAddRemoveLeaseDialog(); + setupLeasesOps(); setupVNetActionCheckboxes(); setVNetAutorefresh();