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 =
+ '';
+
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');