]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/CmdMenu.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / qemu / CmdMenu.js
CommitLineData
dc56cd13
DM
1Ext.define('PVE.qemu.CmdMenu', {
2 extend: 'Ext.menu.Menu',
3
efbc9f5d 4 showSeparator: false,
dc56cd13 5 initComponent: function() {
5e83a90d 6 let me = this;
dc56cd13 7
5e83a90d
TL
8 let info = me.pveSelNode.data;
9 if (!info.node) {
dc56cd13
DM
10 throw "no node name specified";
11 }
5e83a90d 12 if (!info.vmid) {
dc56cd13
DM
13 throw "no VM ID specified";
14 }
15
5e83a90d 16 let vm_command = function(cmd, params) {
e7ade592 17 Proxmox.Utils.API2Request({
dc56cd13 18 params: params,
5e83a90d 19 url: `/nodes/${info.node}/${info.type}/${info.vmid}/status/${cmd}`,
dc56cd13 20 method: 'POST',
5e83a90d 21 failure: (response, opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
dc56cd13
DM
22 });
23 };
b235a538
DC
24 let confirmedVMCommand = (cmd, params, confirmTask) => {
25 let task = confirmTask || `qm${cmd}`;
26 let msg = Proxmox.Utils.format_task_description(task, info.vmid);
4cb5c258
TL
27 Ext.Msg.confirm(gettext('Confirm'), msg, btn => {
28 if (btn === 'yes') {
29 vm_command(cmd, params);
30 }
31 });
32 };
dc56cd13 33
5e83a90d 34 let caps = Ext.state.Manager.get('GuiCap');
01740cb2 35 let standalone = PVE.Utils.isStandaloneNode();
ce8dac51 36
5e83a90d
TL
37 let running = false, stopped = true, suspended = false;
38 switch (info.status) {
ce8dac51
DC
39 case 'running':
40 running = true;
41 stopped = false;
42 break;
fc325240
OB
43 case 'suspended':
44 stopped = false;
45 suspended = true;
46 break;
ce8dac51
DC
47 case 'paused':
48 stopped = false;
49 suspended = true;
50 break;
51 default: break;
52 }
53
5e83a90d 54 me.title = "VM " + info.vmid;
dc56cd13
DM
55
56 me.items = [
57 {
58 text: gettext('Start'),
d4333933 59 iconCls: 'fa fa-fw fa-play',
995a8ea2 60 hidden: running || suspended,
52af3f0d 61 disabled: running || suspended,
5e83a90d 62 handler: () => vm_command('start'),
dc56cd13 63 },
dc56cd13 64 {
a33f612b 65 text: gettext('Pause'),
d4333933 66 iconCls: 'fa fa-fw fa-pause',
995a8ea2 67 hidden: stopped || suspended,
ce8dac51 68 disabled: stopped || suspended,
b235a538 69 handler: () => confirmedVMCommand('suspend', undefined, 'qmpause'),
dc56cd13 70 },
af856c90
DC
71 {
72 text: gettext('Hibernate'),
e09330e0 73 iconCls: 'fa fa-fw fa-download',
af856c90
DC
74 hidden: stopped || suspended,
75 disabled: stopped || suspended,
833b048f 76 tooltip: gettext('Suspend to disk'),
4cb5c258 77 handler: () => confirmedVMCommand('suspend', { todisk: 1 }),
af856c90 78 },
dc56cd13
DM
79 {
80 text: gettext('Resume'),
d4333933 81 iconCls: 'fa fa-fw fa-play',
efbc9f5d 82 hidden: !suspended,
5e83a90d 83 handler: () => vm_command('resume'),
dc56cd13
DM
84 },
85 {
86 text: gettext('Shutdown'),
d4333933 87 iconCls: 'fa fa-fw fa-power-off',
ce8dac51 88 disabled: stopped || suspended,
61e05768 89 handler: () => confirmedVMCommand('shutdown'),
dc56cd13
DM
90 },
91 {
92 text: gettext('Stop'),
d4333933 93 iconCls: 'fa fa-fw fa-stop',
ce8dac51 94 disabled: stopped,
833b048f 95 tooltip: Ext.String.format(gettext('Stop {0} immediately'), 'VM'),
e8b411f1
FW
96 handler: () => {
97 Ext.create('PVE.GuestStop', {
98 nodename: info.node,
99 vm: info,
100 autoShow: true,
101 });
102 },
dc56cd13 103 },
b8f34731
OB
104 {
105 text: gettext('Reboot'),
106 iconCls: 'fa fa-fw fa-refresh',
107 disabled: stopped,
108 tooltip: Ext.String.format(gettext('Reboot {0}'), 'VM'),
4cb5c258 109 handler: () => confirmedVMCommand('reboot'),
b8f34731 110 },
8ad34211
DC
111 {
112 xtype: 'menuseparator',
f6710aac 113 hidden: (standalone || !caps.vms['VM.Migrate']) && !caps.vms['VM.Allocate'] && !caps.vms['VM.Clone'],
8ad34211 114 },
efbc9f5d
DC
115 {
116 text: gettext('Migrate'),
117 iconCls: 'fa fa-fw fa-send-o',
8ad34211 118 hidden: standalone || !caps.vms['VM.Migrate'],
efbc9f5d 119 handler: function() {
5e83a90d 120 Ext.create('PVE.window.Migrate', {
efbc9f5d 121 vmtype: 'qemu',
5e83a90d
TL
122 nodename: info.node,
123 vmid: info.vmid,
124 autoShow: true,
efbc9f5d 125 });
f6710aac 126 },
efbc9f5d 127 },
dc56cd13
DM
128 {
129 text: gettext('Clone'),
d4333933 130 iconCls: 'fa fa-fw fa-clone',
8ad34211 131 hidden: !caps.vms['VM.Clone'],
5e83a90d 132 handler: () => PVE.window.Clone.wrap(info.node, info.vmid, me.isTemplate, 'qemu'),
dc56cd13
DM
133 },
134 {
135 text: gettext('Convert to template'),
52af3f0d 136 iconCls: 'fa fa-fw fa-file-o',
8ad34211 137 hidden: !caps.vms['VM.Allocate'],
dc56cd13 138 handler: function() {
5e83a90d
TL
139 let msg = Proxmox.Utils.format_task_description('qmtemplate', info.vmid);
140 Ext.Msg.confirm(gettext('Confirm'), msg, btn => {
141 if (btn === 'yes') {
142 Proxmox.Utils.API2Request({
143 url: `/nodes/${info.node}/qemu/${info.vmid}/template`,
144 method: 'POST',
145 failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus),
146 });
dc56cd13 147 }
dc56cd13 148 });
f6710aac 149 },
dc56cd13 150 },
efbc9f5d 151 { xtype: 'menuseparator' },
dc56cd13
DM
152 {
153 text: gettext('Console'),
d4333933 154 iconCls: 'fa fa-fw fa-terminal',
dc56cd13 155 handler: function() {
e7ade592 156 Proxmox.Utils.API2Request({
5e83a90d
TL
157 url: `/nodes/${info.node}/qemu/${info.vmid}/status/current`,
158 failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus),
159 success: function({ result: { data } }, opts) {
160 PVE.Utils.openDefaultConsoleWindow(
161 {
162 spice: data.spice,
163 xtermjs: data.serial,
164 },
165 'kvm',
166 info.vmid,
167 info.node,
168 info.name,
169 );
f6710aac 170 },
dc56cd13 171 });
f6710aac
TL
172 },
173 },
dc56cd13
DM
174 ];
175
176 me.callParent();
f6710aac 177 },
dc56cd13 178});