1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-20 10:50:08 +03:00

Task #864, Feature #602: Improve leases support in Sunstone and new vnet operations in Sunstone

This commit includes:

 * Support for ip_start, ip_end parameters when creating ranged vnetworks.
 * Removal of the add lease/remove lease dialogs.
 * Renewal of the representation of leases pool in the "extended information" windows. The list of leases is represented so that it is clearly visible those leases which are free, on hold (reserved), or used by a VM. Right on the list, leases can be added, updated or deleted.
This commit is contained in:
Hector Sanjuan 2011-12-07 01:18:13 +01:00
parent 2e865c5351
commit eccae0e731
6 changed files with 246 additions and 30 deletions

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

View File

@ -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,

View File

@ -85,8 +85,14 @@ var create_vn_tmpl =
<fieldset>\
<label for="net_address">Network Address:</label>\
<input type="text" name="net_address" id="net_address" /><br />\
<label for="net_size">Network size:</label>\
<input type="text" name="net_size" id="net_size" />\
<label for="net_mask">Network Mask:</label>\
<input type="text" name="net_mask" id="net_mask" /><br />\
<label for="custom_pool" style="height:2em;">Enable pool boundaries:</label>\
<input type="checkbox" name="custom_pool" id="custom_pool" style="margin-bottom:2em;" value="yes" /><br />\
<label for="ip_start">Pool start:</label>\
<input type="text" name="ip_start" id="ip_start" disabled="disabled" /><br />\
<label for="ip_end">Pool end:</label>\
<input type="text" name="ip_end" id="ip_end" disabled="disabled" />\
</fieldset>\
</div>\
</div>\
@ -95,9 +101,9 @@ var create_vn_tmpl =
<fieldset>\
<div class="">\
<label for="custom_var_vnet_name">Name:</label>\
<input type="text" id="custom_var_vnet_name" name="custom_var_vnet_name" />\
<input type="text" id="custom_var_vnet_name" name="custom_var_vnet_name" /><br />\
<label for="custom_var_vnet_value">Value:</label>\
<input type="text" id="custom_var_vnet_value" name="custom_var_vnet_value" />\
<input type="text" id="custom_var_vnet_value" name="custom_var_vnet_value" /><br />\
<button class="add_remove_button add_button" id="add_custom_var_vnet_button" value="add_custom_vnet_var">Add</button>\
<button class="add_remove_button" id="remove_custom_var_vnet_button" value="remove_custom_vnet_var">Remove selected</button>\
<div class="clear"></div>\
@ -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){
<td class="key_td">ID</td>\
<td class="value_td">'+vn_info.ID+'</td>\
<tr>\
<tr>\
<td class="key_td">Name</td>\
<td class="value_td">'+vn_info.NAME+'</td>\
<tr>\
<tr>\
<td class="key_td">Owner</td>\
<td class="value_td">'+vn_info.UNAME+'</td>\
@ -508,17 +539,15 @@ function updateVNetworkInfo(request,vn){
</tr>\
<tr>\
<td class="key_td">Physical device</td>\
<td class="value_td">'+(vn_info.PHYDEV ? vn_info.PHYDEV : "--" )+'</td>\
<td class="value_td">'+ (typeof(vn_info.PHYDEV) == "object" ? "--": vn_info.PHYDEV) +'</td>\
</tr>\
</table>\
<table id="vn_leases_info_table" class="info_table">\
<thead>\
<tr><th colspan="2">Leases information</th></tr>\
</thead>'+
printLeases(vn_info.LEASES)+
'</table>';;
<tr>\
<td class="key_td">VNET ID</td>\
<td class="value_td">'+ (typeof(vn_info.VLAN_ID) == "object" ? "--": vn_info.VLAN_ID) +'</td>\
</tr>\
</table>';
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 ='<form style="display:inline-block;" id="leases_form" vnid="'+vn_info.ID+'"><table id="vn_leases_info_table" class="info_table" style="width:100%;">\
<thead>\
<tr><th colspan="2">Leases information</th></tr>\
</thead><tbody>';
if (vn_info.TYPE == "0"){
html += '<tr>\
<td class="key_td">IP Start</td>\
<td class="value_td">'+vn_info.RANGE.IP_START+'</td>\
</tr>\
<tr>\
<td class="key_td">IP End</td>\
<td class="value_td">'+vn_info.RANGE.IP_END+'</td>\
</tr\>\
<tr>\
<td class="key_td">Network mask</td>\
<td class="value_td">'+( vn_info.TEMPLATE.NETWORK_MASK ? vn_info.TEMPLATE.NETWORK_MASK : "--" )+'</td>\
</tr\>\
<tr><td class="key_td">\
<label for="panel_hold_lease">Hold lease:</label></td><td class="value_td"><input type="text" id="panel_hold_lease" style="width:9em;"/>\
<button id="panel_hold_lease_button">Hold</button>\
</td></tr>';
} else {
html += '<tr><td class="key_td">\
<label for="panel_add_lease">Add lease:</label></td><td class="value_td"><input type="text" id="panel_add_lease" style="width:9em;"/>\
<button id="panel_add_lease_button">Add</button>\
</td></tr>';
};
if (leases.LEASE.constructor == Array) //>1 lease
var leases = vn_info.LEASES.LEASE;
if (!leases) //empty
{
return prettyPrintJSON(leases.LEASE);
html+='<tr id="no_leases_tr"><td class="key_td">\
No leases to show\
</td>\
<td class="value_td">\
</td></tr>';
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<leases.length; i++){
lease = leases[i];
if (lease.USED != "0" && lease.VID == "-1") { //hold
state = 2;
} else { //free
state = parseInt(lease.USED,10);
};
html+='<tr ip="'+lease.IP+'"><td class="key_td">';
html+='<img style="vertical-align:middle;margin-right:5px;" ';
switch (state){
case 0: //free
html += 'src="images/green_bullet.png" />';
break;
case 1: //used
html += 'src="images/red_bullet.png" />';
break;
case 2: //hold
html += 'src="images/yellow_bullet.png" />';
break;
};
html += lease.IP + '</td>';
html += '<td class="value_td">\
'+lease.MAC+'&nbsp;&nbsp;&nbsp';
switch (state){
case 0:
html += '<a class="hold_lease" href="#">hold</a> | <a class="delete_lease" href="#">delete</a>';
break;
case 1:
html += 'Used by VM '+lease.VID;
break;
case 2:
html += '<a class="release_lease" href="#">release</a>';
break;
};
html += '</td></tr>';
};
html += '</tbody></table></form>';
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('<td class="key_td">'+spinner+'</td><td class="value_td"></td>');
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('<td class="key_td">'+spinner+'</td><td class="value_td"></td>');
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('<td class="key_td">'+spinner+'</td><td class="value_td"></td>');
return false;
});
}
/*
function setupAddRemoveLeaseDialog() {
dialogs_context.append('<div title="Lease management" id="lease_vn_dialog"></div>');
$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();