]>
Commit | Line | Data |
---|---|---|
1 | Ext.define('PVE.qemu.CmdMenu', { | |
2 | extend: 'Ext.menu.Menu', | |
3 | ||
4 | showSeparator: false, | |
5 | initComponent: function() { | |
6 | var me = this; | |
7 | ||
8 | var nodename = me.pveSelNode.data.node; | |
9 | if (!nodename) { | |
10 | throw "no node name specified"; | |
11 | } | |
12 | ||
13 | var vmid = me.pveSelNode.data.vmid; | |
14 | if (!vmid) { | |
15 | throw "no VM ID specified"; | |
16 | } | |
17 | ||
18 | var vmname = me.pveSelNode.data.name; | |
19 | ||
20 | var vm_command = function(cmd, params) { | |
21 | PVE.Utils.API2Request({ | |
22 | params: params, | |
23 | url: '/nodes/' + nodename + '/qemu/' + vmid + "/status/" + cmd, | |
24 | method: 'POST', | |
25 | failure: function(response, opts) { | |
26 | Ext.Msg.alert('Error', response.htmlStatus); | |
27 | } | |
28 | }); | |
29 | }; | |
30 | ||
31 | var caps = Ext.state.Manager.get('GuiCap'); | |
32 | ||
33 | var running = false; | |
34 | var stopped = true; | |
35 | var suspended = false; | |
36 | var standalone = PVE.data.ResourceStore.getNodes().length < 2; | |
37 | ||
38 | switch (me.pveSelNode.data.status) { | |
39 | case 'running': | |
40 | running = true; | |
41 | stopped = false; | |
42 | break; | |
43 | case 'paused': | |
44 | stopped = false; | |
45 | suspended = true; | |
46 | break; | |
47 | default: break; | |
48 | } | |
49 | ||
50 | me.title = "VM " + vmid; | |
51 | ||
52 | me.items = [ | |
53 | { | |
54 | text: gettext('Start'), | |
55 | iconCls: 'fa fa-fw fa-play', | |
56 | disabled: running || suspended, | |
57 | handler: function() { | |
58 | vm_command('start'); | |
59 | } | |
60 | }, | |
61 | { | |
62 | text: gettext('Suspend'), | |
63 | iconCls: 'fa fa-fw fa-pause', | |
64 | hidden: suspended, | |
65 | disabled: stopped || suspended, | |
66 | handler: function() { | |
67 | var msg = PVE.Utils.format_task_description('qmsuspend', vmid); | |
68 | Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) { | |
69 | if (btn !== 'yes') { | |
70 | return; | |
71 | } | |
72 | vm_command('suspend'); | |
73 | }); | |
74 | } | |
75 | }, | |
76 | { | |
77 | text: gettext('Resume'), | |
78 | iconCls: 'fa fa-fw fa-play', | |
79 | hidden: !suspended, | |
80 | handler: function() { | |
81 | vm_command('resume'); | |
82 | } | |
83 | }, | |
84 | { | |
85 | text: gettext('Shutdown'), | |
86 | iconCls: 'fa fa-fw fa-power-off', | |
87 | disabled: stopped || suspended, | |
88 | handler: function() { | |
89 | var msg = PVE.Utils.format_task_description('qmshutdown', vmid); | |
90 | Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) { | |
91 | if (btn !== 'yes') { | |
92 | return; | |
93 | } | |
94 | ||
95 | vm_command('shutdown'); | |
96 | }); | |
97 | } | |
98 | }, | |
99 | { | |
100 | text: gettext('Stop'), | |
101 | iconCls: 'fa fa-fw fa-stop', | |
102 | disabled: stopped, | |
103 | handler: function() { | |
104 | var msg = PVE.Utils.format_task_description('qmstop', vmid); | |
105 | Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) { | |
106 | if (btn !== 'yes') { | |
107 | return; | |
108 | } | |
109 | ||
110 | vm_command("stop"); | |
111 | }); | |
112 | } | |
113 | }, | |
114 | { | |
115 | xtype: 'menuseparator', | |
116 | hidden: (standalone || !caps.vms['VM.Migrate']) && !caps.vms['VM.Allocate'] && !caps.vms['VM.Clone'] | |
117 | }, | |
118 | { | |
119 | text: gettext('Migrate'), | |
120 | iconCls: 'fa fa-fw fa-send-o', | |
121 | hidden: standalone || !caps.vms['VM.Migrate'], | |
122 | handler: function() { | |
123 | var win = Ext.create('PVE.window.Migrate', { | |
124 | vmtype: 'qemu', | |
125 | nodename: nodename, | |
126 | vmid: vmid | |
127 | }); | |
128 | win.show(); | |
129 | } | |
130 | }, | |
131 | { | |
132 | text: gettext('Clone'), | |
133 | iconCls: 'fa fa-fw fa-clone', | |
134 | hidden: !caps.vms['VM.Clone'], | |
135 | handler: function() { | |
136 | PVE.window.Clone.wrap(nodename, vmid, me.isTemplate); | |
137 | } | |
138 | }, | |
139 | { | |
140 | text: gettext('Convert to template'), | |
141 | iconCls: 'fa fa-fw fa-file-o', | |
142 | hidden: !caps.vms['VM.Allocate'], | |
143 | handler: function() { | |
144 | var msg = PVE.Utils.format_task_description('qmtemplate', vmid); | |
145 | Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) { | |
146 | if (btn !== 'yes') { | |
147 | return; | |
148 | } | |
149 | ||
150 | PVE.Utils.API2Request({ | |
151 | url: '/nodes/' + nodename + '/qemu/' + vmid + '/template', | |
152 | method: 'POST', | |
153 | failure: function(response, opts) { | |
154 | Ext.Msg.alert('Error', response.htmlStatus); | |
155 | } | |
156 | }); | |
157 | }); | |
158 | } | |
159 | }, | |
160 | { xtype: 'menuseparator' }, | |
161 | { | |
162 | text: gettext('Console'), | |
163 | iconCls: 'fa fa-fw fa-terminal', | |
164 | handler: function() { | |
165 | PVE.Utils.API2Request({ | |
166 | url: '/nodes/' + nodename + '/qemu/' + vmid + '/status/current', | |
167 | failure: function(response, opts) { | |
168 | Ext.Msg.alert('Error', response.htmlStatus); | |
169 | }, | |
170 | success: function(response, opts) { | |
171 | var allowSpice = response.result.data.spice; | |
172 | PVE.Utils.openDefaultConsoleWindow(allowSpice, 'kvm', vmid, nodename, vmname); | |
173 | } | |
174 | }); | |
175 | } | |
176 | } | |
177 | ]; | |
178 | ||
179 | me.callParent(); | |
180 | } | |
181 | }); |