diff --git a/share/install_novnc.sh b/share/install_novnc.sh index 6e2a0b4a1f..5dc90d6763 100755 --- a/share/install_novnc.sh +++ b/share/install_novnc.sh @@ -34,7 +34,7 @@ mv $ONE_SHARE/$dir $ONE_SHARE/noVNC mkdir -p $ONE_PUBLIC_SUNSTONE/vendor/noVNC mv $ONE_SHARE/noVNC/include/ $ONE_PUBLIC_SUNSTONE/vendor/noVNC/ -sed -i "s%^\(NOVNC_PATH=\).*$%\1$ONE_SHARE/noVNC%" $SUNSTONE_CONF +sed -i.bck "s%^\(:novnc_path: \).*$%\1$ONE_SHARE/noVNC%" $SUNSTONE_CONF #Update file permissions chmod +x $ONE_SHARE/noVNC/utils/launch.sh diff --git a/src/ozones/Server/models/OzonesServer.rb b/src/ozones/Server/models/OzonesServer.rb index 4d82e7fd8e..dad34c9d6c 100644 --- a/src/ozones/Server/models/OzonesServer.rb +++ b/src/ozones/Server/models/OzonesServer.rb @@ -224,7 +224,6 @@ class OzonesServer end def delete_zone(id, pr) - zone = OZones::Zones.get(id) if zone diff --git a/src/ozones/Server/public/js/ozones.js b/src/ozones/Server/public/js/ozones.js index 051df3fb0b..734cc4d6c6 100644 --- a/src/ozones/Server/public/js/ozones.js +++ b/src/ozones/Server/public/js/ozones.js @@ -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); }, diff --git a/src/ozones/Server/public/js/plugins/vdcs-tab.js b/src/ozones/Server/public/js/plugins/vdcs-tab.js index dcd5555296..db7e6fc211 100644 --- a/src/ozones/Server/public/js/plugins/vdcs-tab.js +++ b/src/ozones/Server/public/js/plugins/vdcs-tab.js @@ -25,6 +25,7 @@ var vdcs_tab_content = ID\ Name\ Zone ID\ + Hosts\ \ \ \ @@ -44,7 +45,12 @@ var create_vdc_tmpl = \ \ \ +
\ +
\ + \ + \ +
Allows hosts belonging to other VDCs to be re-added to this one. They will appear marked with * in the list.
\ +
\ \ \ \ @@ -61,7 +67,36 @@ var create_vdc_tmpl = \ '; +var update_vdc_tmpl = +'
\ +
\ +
\ + \ + \ +
\ + \ + \ +
Allows hosts belonging to other VDCs to be re-added to this one. They will appear marked with * in the list.
\ +
\ + \ + \ + \ +
\ +
    \ +
      \ +
      \ +
      \ +
      \ +
      \ + \ + \ +
      \ +
      \ +
      '; + var dataTable_vdcs; +var $update_vdc_dialog; function vdcSelectedNodes() { return getSelectedNodes(dataTable_vdcs); @@ -81,6 +116,19 @@ var vdc_actions = { call: openCreateVDCDialog }, + "VDC.update" : { + type: "single", + call: oZones.VDC.update, + callback: updateVDCElement, + error: onError, + notify: true + }, + + "VDC.update_dialog" : { + type: "custom", + call: openUpdateVDCDialog + }, + "VDC.list" : { type: "list", call: oZones.VDC.list, @@ -123,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 } }; @@ -137,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", @@ -169,7 +227,8 @@ function vdcElementArray(vdc_json){ '', vdc.id, vdc.name, - vdc.zones_id + vdc.zones_id, + vdc.hosts ? vdc.hosts : "none" ]; } @@ -193,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 = []; @@ -230,6 +295,18 @@ function updateVDCInfo(req,vdc_json){ Hosts\ '+(vdc.hosts? vdc.hosts : "none")+'\ \ + \ + Admin name\ + '+vdc.vdcadminname+'\ + \ + \ + Group ID\ + '+vdc.group_id+'\ + \ + \ + ACLs\ + '+vdc.acls+'\ + \ \ ' }; @@ -239,13 +316,87 @@ function updateVDCInfo(req,vdc_json){ } function fillHostList(req, host_list_json){ - list = ""; + var list = ""; + var force = $('div#create_vdc_dialog #vdc_force_hosts:checked').length ? + true : false; + var zone_id = req.request.data[0]; + var free; + $.each(host_list_json,function(){ - list+='
    • '+this.HOST.NAME+'
    • '; + free = isHostFree(this.HOST.ID,zone_id); + + if (force || free){ + list+='
    • '+(free? this.HOST.NAME : this.HOST.NAME+'*')+'
    • '; + } }); $('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+='
    • '+this.HOST.NAME+'
    • '; + return true; //continue + } + //otherwise, check if its free etc... + free = isHostFree(this.HOST.ID,zone_id); + + if (force || free){ + list+='
    • '+(free? this.HOST.NAME : this.HOST.NAME+'*')+'
    • '; + } + }); + + + + $('#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; + var hosts; + for (var i=0; i= 0){ + result = false; + break; + } + } + return result; +} + function setupCreateVDCDialog(){ $('div#dialogs').append('
      '); var dialog = $('div#create_vdc_dialog'); @@ -266,6 +417,12 @@ function setupCreateVDCDialog(){ containment: dialog }); + $('input#vdc_force_hosts',dialog).change(function(){ + select = $('select#zoneid',$('#create_vdc_dialog')); + if (select.val().length){ + select.trigger("change"); + } + }); //load zone hosts $('select#zoneid').change(function(){ @@ -289,9 +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: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=""; @@ -308,6 +466,7 @@ function setupCreateVDCDialog(){ "zoneid" : zoneid, "vdcadminname" : vdcadminname, "vdcadminpass" : vdcadminpass, + "force" : force } }; if (hosts.length){ @@ -328,6 +487,119 @@ function openCreateVDCDialog(){ dialog.dialog('open'); } +function setupUpdateVDCDialog(){ + $('div#dialogs').append('
      '); + $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('
    • '+spinner+'
    • '); + 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 += ''; + }; + }; + + $('#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(''+ + options); + }; + + dialog.dialog('open'); +} + function setVDCAutorefresh() { setInterval(function(){ var checked = $('input:checked',dataTable_zones.fnGetNodes()); @@ -347,15 +619,19 @@ $(document).ready(function(){ "aoColumnDefs": [ { "bSortable": false, "aTargets": ["check"] }, { "sWidth": "60px", "aTargets": [0] }, + { "sWidth": "150px", "aTargets": [4] }, { "sWidth": "35px", "aTargets": [1,3] } ] }); dataTable_vdcs.fnClearTable(); - addElement([spinner,'','',''],dataTable_vdcs); + addElement([spinner,'','','',''],dataTable_vdcs); Sunstone.runAction("VDC.list"); setupCreateVDCDialog(); + setupTips($('#create_vdc_dialog')); + setupUpdateVDCDialog(); + setupTips($('#update_vdc_dialog')); setVDCAutorefresh(); initCheckAllBoxes(dataTable_vdcs); tableCheckboxesListener(dataTable_vdcs);