]>
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'); |
5e83a90d | 35 | let standalone = PVE.data.ResourceStore.getNodes().length < 2; |
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'), |
4cb5c258 | 96 | handler: () => confirmedVMCommand('stop'), |
dc56cd13 | 97 | }, |
b8f34731 OB |
98 | { |
99 | text: gettext('Reboot'), | |
100 | iconCls: 'fa fa-fw fa-refresh', | |
101 | disabled: stopped, | |
102 | tooltip: Ext.String.format(gettext('Reboot {0}'), 'VM'), | |
4cb5c258 | 103 | handler: () => confirmedVMCommand('reboot'), |
b8f34731 | 104 | }, |
8ad34211 DC |
105 | { |
106 | xtype: 'menuseparator', | |
f6710aac | 107 | hidden: (standalone || !caps.vms['VM.Migrate']) && !caps.vms['VM.Allocate'] && !caps.vms['VM.Clone'], |
8ad34211 | 108 | }, |
efbc9f5d DC |
109 | { |
110 | text: gettext('Migrate'), | |
111 | iconCls: 'fa fa-fw fa-send-o', | |
8ad34211 | 112 | hidden: standalone || !caps.vms['VM.Migrate'], |
efbc9f5d | 113 | handler: function() { |
5e83a90d | 114 | Ext.create('PVE.window.Migrate', { |
efbc9f5d | 115 | vmtype: 'qemu', |
5e83a90d TL |
116 | nodename: info.node, |
117 | vmid: info.vmid, | |
118 | autoShow: true, | |
efbc9f5d | 119 | }); |
f6710aac | 120 | }, |
efbc9f5d | 121 | }, |
dc56cd13 DM |
122 | { |
123 | text: gettext('Clone'), | |
d4333933 | 124 | iconCls: 'fa fa-fw fa-clone', |
8ad34211 | 125 | hidden: !caps.vms['VM.Clone'], |
5e83a90d | 126 | handler: () => PVE.window.Clone.wrap(info.node, info.vmid, me.isTemplate, 'qemu'), |
dc56cd13 DM |
127 | }, |
128 | { | |
129 | text: gettext('Convert to template'), | |
52af3f0d | 130 | iconCls: 'fa fa-fw fa-file-o', |
8ad34211 | 131 | hidden: !caps.vms['VM.Allocate'], |
dc56cd13 | 132 | handler: function() { |
5e83a90d TL |
133 | let msg = Proxmox.Utils.format_task_description('qmtemplate', info.vmid); |
134 | Ext.Msg.confirm(gettext('Confirm'), msg, btn => { | |
135 | if (btn === 'yes') { | |
136 | Proxmox.Utils.API2Request({ | |
137 | url: `/nodes/${info.node}/qemu/${info.vmid}/template`, | |
138 | method: 'POST', | |
139 | failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus), | |
140 | }); | |
dc56cd13 | 141 | } |
dc56cd13 | 142 | }); |
f6710aac | 143 | }, |
dc56cd13 | 144 | }, |
efbc9f5d | 145 | { xtype: 'menuseparator' }, |
dc56cd13 DM |
146 | { |
147 | text: gettext('Console'), | |
d4333933 | 148 | iconCls: 'fa fa-fw fa-terminal', |
dc56cd13 | 149 | handler: function() { |
e7ade592 | 150 | Proxmox.Utils.API2Request({ |
5e83a90d TL |
151 | url: `/nodes/${info.node}/qemu/${info.vmid}/status/current`, |
152 | failure: (response, opts) => Ext.Msg.alert('Error', response.htmlStatus), | |
153 | success: function({ result: { data } }, opts) { | |
154 | PVE.Utils.openDefaultConsoleWindow( | |
155 | { | |
156 | spice: data.spice, | |
157 | xtermjs: data.serial, | |
158 | }, | |
159 | 'kvm', | |
160 | info.vmid, | |
161 | info.node, | |
162 | info.name, | |
163 | ); | |
f6710aac | 164 | }, |
dc56cd13 | 165 | }); |
f6710aac TL |
166 | }, |
167 | }, | |
dc56cd13 DM |
168 | ]; |
169 | ||
170 | me.callParent(); | |
f6710aac | 171 | }, |
dc56cd13 | 172 | }); |