Ext.define('PVE.qemu.CmdMenu', {
extend: 'Ext.menu.Menu',
+ showSeparator: false,
initComponent: function() {
- var me = this;
+ let me = this;
- var nodename = me.pveSelNode.data.node;
- if (!nodename) {
+ let info = me.pveSelNode.data;
+ if (!info.node) {
throw "no node name specified";
}
-
- var vmid = me.pveSelNode.data.vmid;
- if (!vmid) {
+ if (!info.vmid) {
throw "no VM ID specified";
}
- var vmname = me.pveSelNode.data.name;
-
- var vm_command = function(cmd, params) {
- PVE.Utils.API2Request({
+ let vm_command = function(cmd, params) {
+ Proxmox.Utils.API2Request({
params: params,
- url: '/nodes/' + nodename + '/qemu/' + vmid + "/status/" + cmd,
+ url: `/nodes/${info.node}/${info.type}/${info.vmid}/status/${cmd}`,
method: 'POST',
- failure: function(response, opts) {
- Ext.Msg.alert('Error', response.htmlStatus);
+ failure: (response, opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+ });
+ };
+ let confirmedVMCommand = (cmd, params, confirmTask) => {
+ let task = confirmTask || `qm${cmd}`;
+ let msg = Proxmox.Utils.format_task_description(task, info.vmid);
+ Ext.Msg.confirm(gettext('Confirm'), msg, btn => {
+ if (btn === 'yes') {
+ vm_command(cmd, params);
}
});
};
- var running = false;
- var stopped = true;
- var suspended = false;
+ let caps = Ext.state.Manager.get('GuiCap');
+ let standalone = PVE.Utils.isStandaloneNode();
- switch (me.pveSelNode.data.status) {
+ let running = false, stopped = true, suspended = false;
+ switch (info.status) {
case 'running':
running = true;
stopped = false;
break;
+ case 'suspended':
+ stopped = false;
+ suspended = true;
+ break;
case 'paused':
stopped = false;
suspended = true;
default: break;
}
- me.title = "VM " + vmid;
+ me.title = "VM " + info.vmid;
me.items = [
{
text: gettext('Start'),
iconCls: 'fa fa-fw fa-play',
+ hidden: running || suspended,
disabled: running || suspended,
- handler: function() {
- vm_command('start');
- }
+ handler: () => vm_command('start'),
},
{
- text: gettext('Migrate'),
- iconCls: 'fa fa-fw fa-send-o',
- handler: function() {
- var win = Ext.create('PVE.window.Migrate', {
- vmtype: 'qemu',
- nodename: nodename,
- vmid: vmid
- });
- win.show();
- }
+ text: gettext('Pause'),
+ iconCls: 'fa fa-fw fa-pause',
+ hidden: stopped || suspended,
+ disabled: stopped || suspended,
+ handler: () => confirmedVMCommand('suspend', undefined, 'qmpause'),
},
{
- text: gettext('Suspend'),
- iconCls: 'fa fa-fw fa-pause',
+ text: gettext('Hibernate'),
+ iconCls: 'fa fa-fw fa-download',
+ hidden: stopped || suspended,
disabled: stopped || suspended,
- handler: function() {
- var msg = PVE.Utils.format_task_description('qmsuspend', vmid);
- Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
- if (btn !== 'yes') {
- return;
- }
- vm_command('suspend');
- });
- }
+ tooltip: gettext('Suspend to disk'),
+ handler: () => confirmedVMCommand('suspend', { todisk: 1 }),
},
{
text: gettext('Resume'),
iconCls: 'fa fa-fw fa-play',
- disabled: !suspended,
- handler: function() {
- vm_command('resume');
- }
+ hidden: !suspended,
+ handler: () => vm_command('resume'),
},
{
text: gettext('Shutdown'),
iconCls: 'fa fa-fw fa-power-off',
disabled: stopped || suspended,
- handler: function() {
- var msg = PVE.Utils.format_task_description('qmshutdown', vmid);
- Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
- if (btn !== 'yes') {
- return;
- }
-
- vm_command('shutdown');
- });
- }
+ handler: () => confirmedVMCommand('shutdown'),
},
{
text: gettext('Stop'),
iconCls: 'fa fa-fw fa-stop',
disabled: stopped,
+ tooltip: Ext.String.format(gettext('Stop {0} immediately'), 'VM'),
+ handler: () => {
+ Ext.create('PVE.GuestStop', {
+ nodename: info.node,
+ vm: info,
+ autoShow: true,
+ });
+ },
+ },
+ {
+ text: gettext('Reboot'),
+ iconCls: 'fa fa-fw fa-refresh',
+ disabled: stopped,
+ tooltip: Ext.String.format(gettext('Reboot {0}'), 'VM'),
+ handler: () => confirmedVMCommand('reboot'),
+ },
+ {
+ xtype: 'menuseparator',
+ hidden: (standalone || !caps.vms['VM.Migrate']) && !caps.vms['VM.Allocate'] && !caps.vms['VM.Clone'],
+ },
+ {
+ text: gettext('Migrate'),
+ iconCls: 'fa fa-fw fa-send-o',
+ hidden: standalone || !caps.vms['VM.Migrate'],
handler: function() {
- var msg = PVE.Utils.format_task_description('qmstop', vmid);
- Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
- if (btn !== 'yes') {
- return;
- }
-
- vm_command("stop");
+ Ext.create('PVE.window.Migrate', {
+ vmtype: 'qemu',
+ nodename: info.node,
+ vmid: info.vmid,
+ autoShow: true,
});
- }
+ },
},
{
text: gettext('Clone'),
iconCls: 'fa fa-fw fa-clone',
- handler: function() {
- var win = Ext.create('PVE.window.Clone', {
- nodename: nodename,
- vmid: vmid
- });
- win.show();
- }
+ hidden: !caps.vms['VM.Clone'],
+ handler: () => PVE.window.Clone.wrap(info.node, info.vmid, me.isTemplate, 'qemu'),
},
{
text: gettext('Convert to template'),
iconCls: 'fa fa-fw fa-file-o',
+ hidden: !caps.vms['VM.Allocate'],
handler: function() {
- var msg = PVE.Utils.format_task_description('qmtemplate', vmid);
- Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
- if (btn !== 'yes') {
- return;
+ let msg = Proxmox.Utils.format_task_description('qmtemplate', info.vmid);
+ Ext.Msg.confirm(gettext('Confirm'), msg, btn => {
+ if (btn === 'yes') {
+ Proxmox.Utils.API2Request({
+ url: `/nodes/${info.node}/qemu/${info.vmid}/template`,
+ method: 'POST',
+ failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus),
+ });
}
-
- PVE.Utils.API2Request({
- url: '/nodes/' + nodename + '/qemu/' + vmid + '/template',
- method: 'POST',
- failure: function(response, opts) {
- Ext.Msg.alert('Error', response.htmlStatus);
- }
- });
});
- }
+ },
},
+ { xtype: 'menuseparator' },
{
text: gettext('Console'),
iconCls: 'fa fa-fw fa-terminal',
handler: function() {
- PVE.Utils.API2Request({
- url: '/nodes/' + nodename + '/qemu/' + vmid + '/status/current',
- failure: function(response, opts) {
- Ext.Msg.alert('Error', response.htmlStatus);
+ Proxmox.Utils.API2Request({
+ url: `/nodes/${info.node}/qemu/${info.vmid}/status/current`,
+ failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus),
+ success: function({ result: { data } }, opts) {
+ PVE.Utils.openDefaultConsoleWindow(
+ {
+ spice: data.spice,
+ xtermjs: data.serial,
+ },
+ 'kvm',
+ info.vmid,
+ info.node,
+ info.name,
+ );
},
- success: function(response, opts) {
- var allowSpice = response.result.data.spice;
- PVE.Utils.openDefaultConsoleWindow(allowSpice, 'kvm', vmid, nodename, vmname);
- }
});
- }
- }
+ },
+ },
];
me.callParent();
- }
+ },
});