diff --git a/src/sunstone/models/OpenNebulaJSON/ImageJSON.rb b/src/sunstone/models/OpenNebulaJSON/ImageJSON.rb index 5c26e22f71..240b3229c8 100644 --- a/src/sunstone/models/OpenNebulaJSON/ImageJSON.rb +++ b/src/sunstone/models/OpenNebulaJSON/ImageJSON.rb @@ -51,6 +51,7 @@ module OpenNebulaJSON when "unpublish" then self.unpublish when "update" then self.update(action_hash['params']) when "chown" then self.chown(action_hash['params']) + when "chmod" then self.chmod_octet(action_hash['params']) when "chtype" then self.chtype(action_hash['params']) else error_msg = "#{action_hash['perform']} action not " << @@ -71,6 +72,10 @@ module OpenNebulaJSON super(params['owner_id'].to_i,params['group_id'].to_i) end + def chmod_octet(params=Hash.new) + super(params['octet']) + end + def chtype(params=Hash.new) super(params['type']) end diff --git a/src/sunstone/models/OpenNebulaJSON/TemplateJSON.rb b/src/sunstone/models/OpenNebulaJSON/TemplateJSON.rb index 6b2957365d..d72041f8a4 100644 --- a/src/sunstone/models/OpenNebulaJSON/TemplateJSON.rb +++ b/src/sunstone/models/OpenNebulaJSON/TemplateJSON.rb @@ -42,11 +42,12 @@ module OpenNebulaJSON end rc = case action_hash['perform'] - 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 "instantiate" then self.instantiate(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 "chmod" then self.chmod_octet(action_hash['octet']) + when "instantiate" then self.instantiate(action_hash['params']) else error_msg = "#{action_hash['perform']} action not " << " available for this resource" @@ -62,6 +63,10 @@ module OpenNebulaJSON super(params['owner_id'].to_i,params['group_id'].to_i) end + def chmod_octet(params=Hash.new) + super(params['octet']) + end + def instantiate(params=Hash.new) super(params['vm_name']) end diff --git a/src/sunstone/models/OpenNebulaJSON/VirtualMachineJSON.rb b/src/sunstone/models/OpenNebulaJSON/VirtualMachineJSON.rb index 3da1ca9f9a..7dac3fe869 100644 --- a/src/sunstone/models/OpenNebulaJSON/VirtualMachineJSON.rb +++ b/src/sunstone/models/OpenNebulaJSON/VirtualMachineJSON.rb @@ -65,6 +65,7 @@ module OpenNebulaJSON when "reboot" then self.reboot when "resubmit" then self.resubmit when "chown" then self.chown(action_hash['params']) + when "chmod" then self.chmod_octet(action_hash['params']) else error_msg = "#{action_hash['perform']} action not " << " available for this resource" @@ -95,5 +96,9 @@ module OpenNebulaJSON def chown(params=Hash.new) super(params['owner_id'].to_i,params['group_id'].to_i) end + + def chmod_octet(params=Hash.new) + super(params['octet']) + end end end diff --git a/src/sunstone/public/js/opennebula.js b/src/sunstone/public/js/opennebula.js index 390fb127cc..dcd94d3406 100644 --- a/src/sunstone/public/js/opennebula.js +++ b/src/sunstone/public/js/opennebula.js @@ -565,6 +565,13 @@ var OpenNebula = { "chgrp" : function(params){ OpenNebula.Action.chgrp(params,OpenNebula.VM.resource); }, + "chmod" : function(params){ + var action_obj = params.data.extra_param; + OpenNebula.Action.simple_action(params, + OpenNebula.VM.resource, + "chmod", + action_obj); + }, "shutdown": function(params){ OpenNebula.Action.simple_action(params,OpenNebula.VM.resource,"shutdown"); }, @@ -742,6 +749,13 @@ var OpenNebula = { "chgrp" : function(params){ OpenNebula.Action.chgrp(params,OpenNebula.Image.resource); }, + "chmod" : function(params){ + var action_obj = params.data.extra_param; + OpenNebula.Action.simple_action(params, + OpenNebula.Image.resource, + "chmod", + action_obj); + }, "update": function(params){ var action_obj = {"template_raw" : params.data.extra_param }; OpenNebula.Action.simple_action(params, @@ -800,6 +814,13 @@ var OpenNebula = { "chgrp" : function(params){ OpenNebula.Action.chgrp(params,OpenNebula.Template.resource); }, + "chmod" : function(params){ + var action_obj = params.data.extra_param; + OpenNebula.Action.simple_action(params, + OpenNebula.Template.resource, + "chmod", + 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/vms-tab.js b/src/sunstone/public/js/plugins/vms-tab.js index de1000a875..d67617974f 100644 --- a/src/sunstone/public/js/plugins/vms-tab.js +++ b/src/sunstone/public/js/plugins/vms-tab.js @@ -92,6 +92,54 @@ var create_vm_tmpl ='
\ \
'; +var update_vm_tmpl = + '
\ +

'+tr("Please, choose and modify the virtual machine you want to update")+':

\ +
\ + \ + \ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
'+tr("Permissions")+':'+tr("Use")+''+tr("Manage")+''+tr("Admin")+'
'+tr("Owner")+'
'+tr("Group")+'
'+tr("Other")+'
\ +
\ +\ +
\ +
\ +
\ + \ +
\ +
\ +
'; + var vmachine_list_json = {}; var dataTable_vMachines; var $create_vm_dialog; @@ -115,6 +163,11 @@ var vm_actions = { call: popUpCreateVMDialog, }, + "VM.update_dialog" : { + type: "custom", + call: popUpVMTemplateUpdateDialog + }, + "VM.list" : { type: "list", call: OpenNebula.VM.list, @@ -373,7 +426,23 @@ var vm_actions = { elements: vmElements, error: onError, notify: true - } + }, + "VM.fetch_permissions" : { + type: "single", + call: OpenNebula.VM.show, + callback : function(request, vm_json){ + var dialog = $('#vm_template_update_dialog form'); + var vm = vm_json.VM; + setPermissionsTable(vm,dialog); + }, + error: onError + }, + "VM.chmod" : { + type: "single", + call: OpenNebula.VM.chmod, + error: onError, + notify: true + }, } @@ -391,6 +460,12 @@ var vm_buttons = { alwaysActive: true }, + "VM.update_dialog" : { + type: "action", + text: tr("Update properties"), + alwaysActive: true + }, + "VM.chown" : { type: "confirm_with_select", text: tr("Change owner"), @@ -673,7 +748,21 @@ function updateVMInfo(request,vm){ \ '+tr("Deploy ID")+'\ '+(typeof(vm_info.DEPLOY_ID) == "object" ? "-" : vm_info.DEPLOY_ID)+'\ - \ + \ + \ + \ + '+tr("Owner permissions")+'\ + '+ownerPermStr(vm_info)+'\ + \ + \ + '+tr("Group permissions")+'\ + '+groupPermStr(vm_info)+'\ + \ + \ + '+tr("Other permissions")+'\ + '+otherPermStr(vm_info)+'\ + \ + \ \ \ \ @@ -922,7 +1011,100 @@ function saveasDisksCallback(req,response){ //introduce options in the right tab $('#saveas_tabs #saveas_tab_'+id+' #vm_disk_id',$saveas_vm_dialog).html(select); -} +}; + + +function setupVMTemplateUpdateDialog(){ + //Append to DOM + dialogs_context.append('
'); + var dialog = $('#vm_template_update_dialog',dialogs_context); + + //Put HTML in place + dialog.html(update_vm_tmpl); + + var height = Math.floor($(window).height()*0.8); //set height to a percentage of the window + + //Convert into jQuery + dialog.dialog({ + autoOpen:false, + width:500, + modal:true, + height:height, + resizable:true, + }); + + $('button',dialog).button(); + + $('#vm_template_update_select',dialog).change(function(){ + var id = $(this).val(); + $('.permissions_table input',dialog).removeAttr('checked'); + $('.permissions_table',dialog).removeAttr('update'); + if (id && id.length){ + var dialog = $('#vm_template_update_dialog'); + Sunstone.runAction("VM.fetch_permissions",id); + }; + }); + + $('.permissions_table input',dialog).change(function(){ + $(this).parents('table').attr('update','update'); + }); + + $('form',dialog).submit(function(){ + var dialog = $(this); + var id = $('#vm_template_update_select',dialog).val(); + if (!id || !id.length) { + $(this).parents('#vm_template_update_dialog').dialog('close'); + return false; + }; + + var permissions = $('.permissions_table',dialog); + if (permissions.attr('update')){ + var perms = { + octet : buildOctet(permissions) + }; + Sunstone.runAction("VM.chmod",id,perms); + }; + + $(this).parents('#vm_template_update_dialog').dialog('close'); + return false; + }); +}; + +function popUpVMTemplateUpdateDialog(){ + var select = makeSelectOptions(dataTable_vMachines, + 1,//id_col + 4,//name_col + [], + [] + ); + var sel_elems = getSelectedNodes(dataTable_vMachines); + + + var dialog = $('#vm_template_update_dialog'); + $('#vm_template_update_select',dialog).html(select); + $('#vm_template_update_textarea',dialog).val(""); + $('.permissions_table input',dialog).removeAttr('checked'); + $('.permissions_table',dialog).removeAttr('update'); + + if (sel_elems.length >= 1){ //several items in the list are selected + //grep them + var new_select= sel_elems.length > 1? '' : ""; + $('option','').each(function(){ + var val = $(this).val(); + if ($.inArray(val,sel_elems) >= 0){ + new_select+=''; + }; + }); + $('#vm_template_update_select',dialog).html(new_select); + if (sel_elems.length == 1) { + $('#vm_template_update_select option',dialog).attr('selected','selected'); + $('#vm_template_update_select',dialog).trigger("change"); + }; + }; + + dialog.dialog('open'); + return false; +}; //Prepares autorefresh function setVMAutorefresh(){ @@ -1083,10 +1265,10 @@ $(document).ready(function(){ { "sWidth": "150px", "aTargets": [5,9] }, { "sWidth": "100px", "aTargets": [2,3] } ], - "oLanguage": (datatable_lang != "") ? - { - sUrl: "locale/"+lang+"/"+datatable_lang - } : "" + "oLanguage": (datatable_lang != "") ? + { + sUrl: "locale/"+lang+"/"+datatable_lang + } : "" }); dataTable_vMachines.fnClearTable(); @@ -1096,6 +1278,7 @@ $(document).ready(function(){ Sunstone.runAction("VM.list"); setupCreateVMDialog(); + setupVMTemplateUpdateDialog(); setupSaveasDialog(); setVMAutorefresh(); setupVNC(); diff --git a/src/sunstone/public/js/plugins/vnets-tab.js b/src/sunstone/public/js/plugins/vnets-tab.js index ab84ee4282..a4c9cd4583 100644 --- a/src/sunstone/public/js/plugins/vnets-tab.js +++ b/src/sunstone/public/js/plugins/vnets-tab.js @@ -872,7 +872,7 @@ function popUpCreateVnetDialog() { function setupVNetTemplateUpdateDialog(){ //Append to DOM - dialogs_context.append('
'); + dialogs_context.append('
'); var dialog = $('#vnet_template_update_dialog',dialogs_context); //Put HTML in place @@ -893,9 +893,10 @@ function setupVNetTemplateUpdateDialog(){ $('#vnet_template_update_select',dialog).change(function(){ var id = $(this).val(); + $('.permissions_table input',dialog).removeAttr('checked') + $('.permissions_table',dialog).removeAttr('update'); if (id && id.length){ var dialog = $('#vnet_template_update_dialog'); - $('.permissions_table input',dialog).removeAttr('checked') $('#vnet_template_update_textarea',dialog).val(tr("Loading")+"..."); Sunstone.runAction("Network.fetch_permissions",id); @@ -914,11 +915,11 @@ function setupVNetTemplateUpdateDialog(){ var new_template = $('#vnet_template_update_textarea',dialog).val(); var id = $('#vnet_template_update_select',dialog).val(); if (!id || !id.length) { - dialog.dialog('close'); + $(this).parents('#vnet_template_update_dialog').dialog('close'); return false; }; - var permissions = $('.permissions_table'); + var permissions = $('.permissions_table',dialog); if (permissions.attr('update')){ var perms = { octet : buildOctet(permissions) @@ -945,7 +946,8 @@ function popUpVNetTemplateUpdateDialog(){ var dialog = $('#vnet_template_update_dialog'); $('#vnet_template_update_select',dialog).html(select); $('#vnet_template_update_textarea',dialog).val(""); - $('.permissions_table input',dialog).removeAttr('checked') + $('.permissions_table input',dialog).removeAttr('checked'); + $('.permissions_table',dialog).removeAttr('update'); if (sel_elems.length >= 1){ //several items in the list are selected //grep them @@ -960,8 +962,7 @@ function popUpVNetTemplateUpdateDialog(){ if (sel_elems.length == 1) { $('#vnet_template_update_select option',dialog).attr('selected','selected'); $('#vnet_template_update_select',dialog).trigger("change"); - } - + }; }; dialog.dialog('open');