throw "no VM ID specified";
}
- var template = me.pveSelNode.data.template;
+ var template = !!me.pveSelNode.data.template;
+
+ var running = !!me.pveSelNode.data.uptime;
var caps = Ext.state.Manager.get('GuiCap');
});
var vm_command = function(cmd, params) {
- PVE.Utils.API2Request({
+ Proxmox.Utils.API2Request({
params: params,
url: base_url + '/status/' + cmd,
waitMsgTarget: me,
var startBtn = Ext.create('Ext.Button', {
text: gettext('Start'),
- disabled: !caps.vms['VM.PowerMgmt'],
+ disabled: !caps.vms['VM.PowerMgmt'] || running,
+ hidden: template,
handler: function() {
vm_command('start');
},
var migrateBtn = Ext.create('Ext.Button', {
text: gettext('Migrate'),
disabled: !caps.vms['VM.Migrate'],
+ hidden: PVE.data.ResourceStore.getNodes().length < 2,
handler: function() {
var win = Ext.create('PVE.window.Migrate', {
vmtype: 'qemu',
iconCls: 'fa fa-send-o'
});
- var resetBtn = Ext.create('PVE.button.Button', {
- text: gettext('Reset'),
- disabled: !caps.vms['VM.PowerMgmt'],
- confirmMsg: PVE.Utils.format_task_description('qmreset', vmid),
- handler: function() {
- vm_command("reset");
- },
- iconCls: 'fa fa-bolt'
+ var moreBtn = Ext.create('Proxmox.button.Button', {
+ text: gettext('More'),
+ menu: { items: [
+ {
+ text: gettext('Clone'),
+ iconCls: 'fa fa-fw fa-clone',
+ hidden: caps.vms['VM.Clone'] ? false : true,
+ handler: function() {
+ PVE.window.Clone.wrap(nodename, vmid, template);
+ }
+ },
+ {
+ text: gettext('Convert to template'),
+ disabled: template,
+ xtype: 'pveMenuItem',
+ iconCls: 'fa fa-fw fa-file-o',
+ hidden: caps.vms['VM.Allocate'] ? false : true,
+ confirmMsg: Proxmox.Utils.format_task_description('qmtemplate', vmid),
+ handler: function() {
+ Proxmox.Utils.API2Request({
+ url: base_url + '/template',
+ waitMsgTarget: me,
+ method: 'POST',
+ failure: function(response, opts) {
+ Ext.Msg.alert('Error', response.htmlStatus);
+ }
+ });
+ }
+ },
+ {
+ iconCls: 'fa fa-heartbeat ',
+ hidden: !caps.nodes['Sys.Console'],
+ text: gettext('Manage HA'),
+ handler: function() {
+ var ha = me.pveSelNode.data.hastate;
+ Ext.create('PVE.ha.VMResourceEdit', {
+ vmid: vmid,
+ isCreate: (!ha || ha === 'unmanaged')
+ }).show();
+ }
+ },
+ {
+ text: gettext('Remove'),
+ itemId: 'removeBtn',
+ disabled: !caps.vms['VM.Allocate'],
+ handler: function() {
+ Ext.create('PVE.window.SafeDestroy', {
+ url: base_url,
+ item: { type: 'VM', id: vmid }
+ }).show();
+ },
+ iconCls: 'fa fa-trash-o'
+ }
+ ]}
});
var shutdownBtn = Ext.create('PVE.button.Split', {
text: gettext('Shutdown'),
- disabled: !caps.vms['VM.PowerMgmt'],
- confirmMsg: PVE.Utils.format_task_description('qmshutdown', vmid),
+ disabled: !caps.vms['VM.PowerMgmt'] || !running,
+ hidden: template,
+ confirmMsg: Proxmox.Utils.format_task_description('qmshutdown', vmid),
handler: function() {
vm_command('shutdown');
},
text: gettext('Stop'),
disabled: !caps.vms['VM.PowerMgmt'],
dangerous: true,
- confirmMsg: PVE.Utils.format_task_description('qmstop', vmid),
+ confirmMsg: Proxmox.Utils.format_task_description('qmstop', vmid),
handler: function() {
vm_command("stop", { timeout: 30 });
},
iconCls: 'fa fa-stop'
+ },{
+ text: gettext('Reset'),
+ disabled: !caps.vms['VM.PowerMgmt'],
+ confirmMsg: Proxmox.Utils.format_task_description('qmreset', vmid),
+ handler: function() {
+ vm_command("reset");
+ },
+ iconCls: 'fa fa-bolt'
}]
},
iconCls: 'fa fa-power-off'
});
- var removeBtn = Ext.create('PVE.button.Button', {
- text: gettext('Remove'),
- disabled: !caps.vms['VM.Allocate'],
- handler: function() {
- Ext.create('PVE.window.SafeDestroy', {
- url: base_url,
- item: { type: 'VM', id: vmid }
- }).show();
- },
- iconCls: 'fa fa-trash-o'
- });
-
- var vmname = me.pveSelNode.data.name;
+ var vm = me.pveSelNode.data;
var consoleBtn = Ext.create('PVE.button.ConsoleButton', {
disabled: !caps.vms['VM.Console'],
+ hidden: template,
consoleType: 'kvm',
- consoleName: vmname,
+ consoleName: vm.name,
nodename: nodename,
- vmid: vmid,
- iconCls: 'fa fa-terminal'
+ vmid: vmid
});
- var descr = vmid + " (" + (vmname ? "'" + vmname + "' " : "'VM " + vmid + "'") + ")";
-
Ext.apply(me, {
- title: Ext.String.format(gettext("Virtual Machine {0} on node {1}"), descr, "'" + nodename + "'"),
+ title: Ext.String.format(gettext("Virtual Machine {0} on node '{1}'"), vm.text, nodename),
hstateid: 'kvmtab',
- tbar: [ resumeBtn, startBtn, shutdownBtn, resetBtn,
- removeBtn, migrateBtn, consoleBtn],
+ tbar: [ resumeBtn, startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn ],
defaults: { statusStore: me.statusStore },
items: [
{
{
title: gettext('Hardware'),
itemId: 'hardware',
- onlineHelp: 'qm_virtual_machines_settings',
iconCls: 'fa fa-desktop',
xtype: 'PVE.qemu.HardwareView'
},
{
title: gettext('Options'),
iconCls: 'fa fa-gear',
- onlineHelp: 'qm_options',
itemId: 'options',
xtype: 'PVE.qemu.Options'
},
{
title: gettext('Task History'),
itemId: 'tasks',
- xtype: 'pveNodeTasks',
+ xtype: 'proxmoxNodeTasks',
iconCls: 'fa fa-list',
+ nodename: nodename,
vmidFilter: vmid
}
);
title: gettext('Backup'),
iconCls: 'fa fa-floppy-o',
xtype: 'pveBackupView',
- onlineHelp: 'chapter_vzdump',
itemId: 'backup'
+ },
+ {
+ title: gettext('Replication'),
+ iconCls: 'fa fa-retweet',
+ xtype: 'pveReplicaView',
+ itemId: 'replication'
});
}
- if (caps.vms['VM.Snapshot'] && !template) {
+ if ((caps.vms['VM.Snapshot'] || caps.vms['VM.Snapshot.Rollback']) && !template) {
me.items.push({
title: gettext('Snapshots'),
iconCls: 'fa fa-history',
xtype: 'pveFirewallRules',
title: gettext('Firewall'),
iconCls: 'fa fa-shield',
- onlineHelp: 'chapter_pve_firewall',
allow_iface: true,
base_url: base_url + '/firewall/rules',
list_refs_url: base_url + '/firewall/refs',
title: gettext('Alias'),
groups: ['firewall'],
iconCls: 'fa fa-external-link',
- onlineHelp: 'pve_firewall_ip_aliases',
base_url: base_url + '/firewall/aliases',
itemId: 'firewall-aliases'
},
title: gettext('IPSet'),
groups: ['firewall'],
iconCls: 'fa fa-list-ol',
- onlineHelp: 'pve_firewall_ip_sets',
base_url: base_url + '/firewall/ipset',
list_refs_url: base_url + '/firewall/refs',
itemId: 'firewall-ipset'
xtype: 'pveACLView',
title: gettext('Permissions'),
iconCls: 'fa fa-unlock',
- onlineHelp: 'chapter_user_management',
itemId: 'permissions',
path: '/vms/' + vmid
});
var spice = false;
if (!success) {
- me.workspace.checkVmMigration(me.pveSelNode);
status = qmpstatus = 'unknown';
} else {
var rec = s.data.get('status');
}
- if (qmpstatus === 'prelaunch' || qmpstatus === 'paused') {
+ if (template) {
+ return;
+ }
+
+ if (qmpstatus === 'prelaunch' || qmpstatus === 'paused' || qmpstatus === 'suspended') {
startBtn.setVisible(false);
resumeBtn.setVisible(true);
} else {
consoleBtn.setEnableSpice(spice);
startBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status === 'running' || template);
- resetBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status !== 'running' || template);
shutdownBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status !== 'running');
- removeBtn.setDisabled(!caps.vms['VM.Allocate'] || status !== 'stopped');
+ me.down('#removeBtn').setDisabled(!caps.vms['VM.Allocate'] || status !== 'stopped');
consoleBtn.setDisabled(template);
});