]>
Commit | Line | Data |
---|---|---|
dc56cd13 DM |
1 | Ext.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 | }); |