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

Feature #817: Added GUI support for add/remove hosts from VDC in oZones

(cherry picked from commit 0820dd38a01929b9bf0f847ceb46d5e317617deb)
(cherry picked from commit 532175b4e23334315e419d83d0752d328a7aa987)
This commit is contained in:
Hector Sanjuan 2011-09-24 00:42:54 +02:00 committed by Tino Vazquez
parent 244ef19153
commit 5bfa14ce2f
2 changed files with 237 additions and 6 deletions

View File

@ -201,6 +201,28 @@ var oZones = {
});
},
"update": function(params,resource){
var callback = params.success;
var callback_error = params.error;
var id = params.data.id;
var data = params.data.extra_param;
var request = oZones.Helper.request(resource,"update", data);
$.ajax({
url: resource.toLowerCase()+'/'+id,
type: "PUT",
dataType: "json",
data: JSON.stringify(data),
success: function(response){
return callback ? callback(request, response) : null;
},
error: function(response){
return callback_error ?
callback_error(request, oZones.Error(response)) : null;
}
});
},
"delete": function(params,resource){
var callback = params.success;
var callback_error = params.error;
@ -385,7 +407,7 @@ var oZones = {
callback(request, oZones.Helper.pool(subresource.toUpperCase(),response)) : null;
},
error: function(response){
return callback_error ? calback_error(request,oZones.Error(response)) : null;
return callback_error ? callback_error(request,oZones.Error(response)) : null;
}
});
@ -421,6 +443,9 @@ var oZones = {
"create": function(params){
oZones.Action.create(params,oZones.VDC.resource);
},
"update": function(params){
oZones.Action.update(params,oZones.VDC.resource);
},
"delete": function(params){
oZones.Action.delete(params,oZones.VDC.resource);
},

View File

@ -67,7 +67,36 @@ var create_vdc_tmpl =
</fieldset>\
</form>';
var update_vdc_tmpl =
'<form id="update_vdc_form" action="">\
<fieldset>\
<div>\
<label for="vdc_update_id">Update hosts in:</label>\
<select name="vdc_update_id" id="vdc_update_id">\
</select>\
<div class="clear"></div>\
<label for="vdc_update_force_hosts">Host multiplacement:</label>\
<input type="checkbox" name="vdc_update_force_hosts" id="vdc_update_force_hosts" />\
<div class="tip">Allows hosts belonging to other VDCs to be re-added to this one. They will appear marked with * in the list.</div>\
<div class="clear"></div>\
<label style="margin-left:205px;font-size:0.8em;color:#bbbbbb">Drag & Drop</label>\
<label style="margin-left:195px;font-size:0.8em;color:#bbbbbb">Available / Current</label>\
<label>Hosts:</label>\
<div id="vdc_update_hosts_lists" class="dd_lists">\
<ul id="vdc_update_available_hosts_list" class="dd_list dd_left"></ul>\
<ul id="vdc_update_selected_hosts_list" class="dd_list dd_right"></ul>\
</div>\
</fieldset>\
<fieldset>\
<div class="form_buttons">\
<button class="button" id="update_vdc_submit" value="VDC.update">Update</button>\
<button class="button" type="reset" value="reset">Reset</button>\
</div>\
</fieldset>\
</form>';
var dataTable_vdcs;
var $update_vdc_dialog;
function vdcSelectedNodes() {
return getSelectedNodes(dataTable_vdcs);
@ -88,7 +117,7 @@ var vdc_actions = {
},
"VDC.update" : {
type: "create",
type: "single",
call: oZones.VDC.update,
callback: updateVDCElement,
error: onError,
@ -142,6 +171,12 @@ var vdc_actions = {
call: oZones.Zone.host,
callback: fillHostList,
error: onError
},
"VDC.update_zone_hosts" : {
type: "single",
call: oZones.Zone.host,
callback: fillUpdateHostList,
error: onError
}
};
@ -156,6 +191,10 @@ var vdc_buttons = {
text: "+ New",
alwaysActive:true
},
"VDC.update_dialog" : {
type: "action",
text: "Add/Remove hosts",
},
"VDC.delete" : {
type: "action",
text: "Delete",
@ -213,6 +252,12 @@ function addVDCElement(req,vdc_json){
addElement(element,dataTable_vdcs);
}
function updateVDCElement(request, vdc_json){
var id = vdc_json.VDC.id;
var element = vdcElementArray(vdc_json);
updateSingleElement(element,dataTable_vdcs,'#vdc_'+id);
}
function updateVDCsView(req,vdc_list){
var vdc_list_array = [];
@ -287,6 +332,52 @@ function fillHostList(req, host_list_json){
$('div#create_vdc_dialog #vdc_available_hosts_list').html(list);
}
//return the array of hosts
function isHostMine(host_id,vdc_id){
//locate myself
var vdcs = dataTable_vdcs.fnGetData();
var my_hosts=null;
for (var i=0; i < vdcs.length; i++){
if (vdcs[i][1]==vdc_id){
my_hosts = vdcs[i][4].split(',');
break;
}
};
if (!my_hosts) return false;
return $.inArray(host_id,my_hosts) >= 0;
}
function fillUpdateHostList(req, host_list_json){
var list = "";
var list_mine = "";
var vdc_id = $('#vdc_update_id',$update_vdc_dialog).val();
var force = $('#vdc_update_force_hosts:checked',$update_vdc_dialog).length ?
true : false;
var zone_id = req.request.data[0];
var free,li;
$.each(host_list_json,function(){
//if mine, put in mine_list
if (isHostMine(this.HOST.ID,vdc_id)){
list_mine+='<li host_id="'+this.HOST.ID+'">'+this.HOST.NAME+'</li>';
return true; //continue
}
//otherwise, check if its free etc...
free = isHostFree(this.HOST.ID,zone_id);
if (force || free){
list+='<li host_id="'+this.HOST.ID+'">'+(free? this.HOST.NAME : this.HOST.NAME+'*')+'</li>';
}
});
$('#vdc_update_available_hosts_list',$update_vdc_dialog).html(list);
$('#vdc_update_selected_hosts_list',$update_vdc_dialog).html(list_mine);
}
function isHostFree(id,zone_id){//strings
var data = dataTable_vdcs.fnGetData();
var result = true;
@ -326,8 +417,8 @@ function setupCreateVDCDialog(){
containment: dialog
});
$('input#vdc_force_hosts').change(function(){
select = $('select#zoneid');
$('input#vdc_force_hosts',dialog).change(function(){
select = $('select#zoneid',$('#create_vdc_dialog'));
if (select.val().length){
select.trigger("change");
}
@ -355,10 +446,10 @@ function setupCreateVDCDialog(){
var vdcadminname = $('#vdcadminname',$(this)).val();
var vdcadminpass = $('#vdcadminpass',$(this)).val();
var zoneid = $('select#zoneid',$(this)).val();
var force = $('#vdc_force_hosts',$(this)).length ? "yes" : "please no";
var force = $('#vdc_force_hosts:checked',$(this)).length ? "yes" : "please no";
if (!name.length || !vdcadminname.length
|| !vdcadminpass.length || !zoneid.length){
notifyError("Name, administrator credentials or zones are missing");
notifyError("Name, administrator credentials or zone are missing");
return false;
}
var hosts="";
@ -396,6 +487,119 @@ function openCreateVDCDialog(){
dialog.dialog('open');
}
function setupUpdateVDCDialog(){
$('div#dialogs').append('<div title="Update VDC" id="update_vdc_dialog"></div>');
$update_vdc_dialog=$('div#update_vdc_dialog',dialogs_context);
var dialog = $update_vdc_dialog;
dialog.html(update_vdc_tmpl);
dialog.dialog({
autoOpen: false,
modal: true,
width: 500
});
$('button',dialog).button();
$('#vdc_update_available_hosts_list',dialog).sortable({
connectWith : '#vdc_update_selected_hosts_list',
containment: dialog
});
$('#vdc_update_selected_hosts_list',dialog).sortable({
connectWith : '#vdc_update_available_hosts_list',
containment: dialog
});
$('#vdc_update_force_hosts',dialog).change(function(){
select = $('select#vdc_update_id',$update_vdc_dialog);
if (select.val().length){
select.trigger("change");
}
});
$('select#vdc_update_id').change(function(){
var id = $(this).val();
var zone_id = $('option:selected',this).attr("zone_id");
var av_hosts=
$('#vdc_update_available_hosts_list',$update_vdc_dialog);
var sel_hosts=
$('#vdc_update_selected_hosts_list',$update_vdc_dialog);
if (!id || !id.length) {
av_hosts.empty();
sel_hosts.empty();
return true;
};
//A VDC has been selected
//Fill in available hosts column
//move current hosts to current
av_hosts.html('<li>'+spinner+'</li>');
sel_hosts.empty();
Sunstone.runAction("VDC.update_zone_hosts",zone_id);
});
$('#update_vdc_form').submit(function(){
var force = $('#vdc_update_force_hosts',this).length ? "yes" : "nein";
var id = $('#vdc_update_id',this).val();
var hosts="";
$('#vdc_update_selected_hosts_list li',this).each(function(){
hosts+=$(this).attr("host_id")+',';
});
if (hosts.length){
hosts= hosts.slice(0,-1);
};
var vdc_json = {
"vdc" : {
"id": id,
"force": force,
"hosts": hosts
}
};
if (hosts.length){
vdc_json["vdc"]["hosts"]=hosts;
};
Sunstone.runAction("VDC.update",id,vdc_json);
dialog.dialog('close');
return false;
});
}
function openUpdateVDCDialog(){
var selected_elems = getSelectedNodes(dataTable_vdcs);
//populate select
var dialog = $update_vdc_dialog;
var options = "";
var vdcs = dataTable_vdcs.fnGetData();
for (var i = 0; i < vdcs.length; i++){
//if this VDC is among the selected
if ($.inArray(vdcs[i][1].toString(),selected_elems) >= 0){
options += '<option zone_id="'+
vdcs[i][3]+
'" value="'+
vdcs[i][1]+'">'+
vdcs[i][2]+
'</option>';
};
};
$('#vdc_update_available_hosts_list',dialog).empty();
$('#vdc_update_selected_hosts_list',dialog).empty();
$('select#vdc_update_id',dialog).html(options);
if (selected_elems.length == 1){
$('select#vdc_update_id',dialog).html(options);
$('select#vdc_update_id option',dialog).attr("checked","checked");
$('select#vdc_update_id').trigger("change");
} else {
$('select#vdc_update_id',dialog).html('<option value="">Please select</option>'+
options);
};
dialog.dialog('open');
}
function setVDCAutorefresh() {
setInterval(function(){
var checked = $('input:checked',dataTable_zones.fnGetNodes());
@ -426,6 +630,8 @@ $(document).ready(function(){
setupCreateVDCDialog();
setupTips($('#create_vdc_dialog'));
setupUpdateVDCDialog();
setupTips($('#update_vdc_dialog'));
setVDCAutorefresh();
initCheckAllBoxes(dataTable_vdcs);
tableCheckboxesListener(dataTable_vdcs);