]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/qemu/Config.js
use Proxmox.Utils instead of PVE.Utils
[pve-manager.git] / www / manager6 / qemu / Config.js
index 19a331badeaaf3a23755457539b8768e81e406ec..4114b7c0e692f60cfd60616a8d64f9e749a4ad1e 100644 (file)
@@ -2,6 +2,8 @@ Ext.define('PVE.qemu.Config', {
     extend: 'PVE.panel.Config',
     alias: 'widget.PVE.qemu.Config',
 
+    onlineHelp: 'chapter_virtual_machines',
+
     initComponent: function() {
         var me = this;
 
@@ -14,20 +16,22 @@ Ext.define('PVE.qemu.Config', {
        if (!vmid) {
            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 base_url = '/nodes/' + nodename + "/qemu/" + vmid;
+
        me.statusStore = Ext.create('PVE.data.ObjectStore', {
            url: '/api2/json' + base_url + '/status/current',
            interval: 1000
        });
 
        var vm_command = function(cmd, params) {
-           PVE.Utils.API2Request({
+           Proxmox.Utils.API2Request({
                params: params,
                url: base_url + '/status/' + cmd,
                waitMsgTarget: me,
@@ -38,35 +42,30 @@ Ext.define('PVE.qemu.Config', {
            });
        };
 
-       var resumeBtn = Ext.create('Ext.Button', { 
+       var resumeBtn = Ext.create('Ext.Button', {
            text: gettext('Resume'),
            disabled: !caps.vms['VM.PowerMgmt'],
-           visible: false,
+           hidden: true,
            handler: function() {
                vm_command('resume');
-           }                       
-       }); 
+           },
+           iconCls: 'fa fa-play'
+       });
 
-       var startBtn = Ext.create('Ext.Button', { 
+       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 stopBtn = Ext.create('PVE.button.Button', {
-           text: gettext('Stop'),
-           disabled: !caps.vms['VM.PowerMgmt'],
-           confirmMsg: Ext.String.format(gettext("Do you really want to stop VM {0}?"), vmid),
-           handler: function() {
-               vm_command("stop", { timeout: 30 });
-           }
+           },
+           iconCls: 'fa fa-play'
        });
 
-       var migrateBtn = Ext.create('Ext.Button', { 
+       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',
@@ -74,90 +73,162 @@ Ext.define('PVE.qemu.Config', {
                    vmid: vmid
                });
                win.show();
-           }    
+           },
+           iconCls: 'fa fa-send-o'
        });
-       var resetBtn = Ext.create('PVE.button.Button', {
-           text: gettext('Reset'),
-           disabled: !caps.vms['VM.PowerMgmt'],
-           confirmMsg: Ext.String.format(gettext("Do you really want to reset VM {0}?"), vmid),
-           handler: function() { 
-               vm_command("reset");
-           }
+
+       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.Button', {
+       var shutdownBtn = Ext.create('PVE.button.Split', {
            text: gettext('Shutdown'),
-           disabled: !caps.vms['VM.PowerMgmt'],
-           confirmMsg: Ext.String.format(gettext("Do you really want to shutdown VM {0}?"), vmid),
+           disabled: !caps.vms['VM.PowerMgmt'] || !running,
+           hidden: template,
+           confirmMsg: Proxmox.Utils.format_task_description('qmshutdown', vmid),
            handler: function() {
                vm_command('shutdown');
-           }                       
-       });
-
-       var removeBtn = Ext.create('PVE.button.Button', {
-           text: gettext('Remove'),
-           disabled: !caps.vms['VM.Allocate'],
-           dangerous: true,
-           confirmMsg: Ext.String.format(gettext('Are you sure you want to remove VM {0}? This will permanently erase all VM data.'), vmid),
-           handler: function() {
-               PVE.Utils.API2Request({
-                   url: base_url,
-                   method: 'DELETE',
-                   waitMsgTarget: me,
-                   failure: function(response, opts) {
-                       Ext.Msg.alert('Error', response.htmlStatus);
-                   }
-               });
-           } 
+           },
+           menu: {
+               items: [{
+                   text: gettext('Stop'),
+                   disabled: !caps.vms['VM.PowerMgmt'],
+                   dangerous: true,
+                   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 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
        });
 
-       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, stopBtn, resetBtn, 
-                   removeBtn, migrateBtn, consoleBtn],
+           tbar: [ resumeBtn, startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn ],
            defaults: { statusStore: me.statusStore },
            items: [
                {
                    title: gettext('Summary'),
                    xtype: 'pveQemuSummary',
+                   iconCls: 'fa fa-book',
                    itemId: 'summary'
-               },
-               {
-                   title: gettext('Hardware'),
-                   itemId: 'hardware',
-                   xtype: 'PVE.qemu.HardwareView'
-               },
-               {
-                   title: gettext('Options'),
-                   itemId: 'options',
-                   xtype: 'PVE.qemu.Options'
-               },
-               {
-                   title: gettext('Task History'),
-                   itemId: 'tasks',
-                   xtype: 'pveNodeTasks',
-                   vmidFilter: vmid
                }
            ]
        });
 
+       if (caps.vms['VM.Console'] && !template) {
+           me.items.push({
+               title: gettext('Console'),
+               itemId: 'console',
+               iconCls: 'fa fa-terminal',
+               xtype: 'pveNoVncConsole',
+               vmid: vmid,
+               consoleType: 'kvm',
+               nodename: nodename
+           });
+       }
+
+       me.items.push(
+           {
+               title: gettext('Hardware'),
+               itemId: 'hardware',
+               iconCls: 'fa fa-desktop',
+               xtype: 'PVE.qemu.HardwareView'
+           },
+           {
+               title: gettext('Options'),
+               iconCls: 'fa fa-gear',
+               itemId: 'options',
+               xtype: 'PVE.qemu.Options'
+           },
+           {
+               title: gettext('Task History'),
+               itemId: 'tasks',
+               xtype: 'proxmoxNodeTasks',
+               iconCls: 'fa fa-list',
+               nodename: nodename,
+               vmidFilter: vmid
+           }
+       );
+
        if (caps.vms['VM.Monitor'] && !template) {
            me.items.push({
                title: gettext('Monitor'),
+               iconCls: 'fa fa-eye',
                itemId: 'monitor',
                xtype: 'pveQemuMonitor'
            });
@@ -166,47 +237,82 @@ Ext.define('PVE.qemu.Config', {
        if (caps.vms['VM.Backup']) {
            me.items.push({
                title: gettext('Backup'),
+               iconCls: 'fa fa-floppy-o',
                xtype: 'pveBackupView',
                itemId: 'backup'
+           },
+           {
+               title: gettext('Replication'),
+               iconCls: 'fa fa-retweet',
+               xtype: 'pveReplicaView',
+               itemId: 'replication'
            });
        }
 
-       if (caps.vms['VM.Snapshot']) {
+       if ((caps.vms['VM.Snapshot'] || caps.vms['VM.Snapshot.Rollback']) && !template) {
            me.items.push({
                title: gettext('Snapshots'),
+               iconCls: 'fa fa-history',
                xtype: 'pveQemuSnapshotTree',
                itemId: 'snapshot'
            });
        }
 
-       if (caps.vms['VM.Console'] && !template) {
-           me.items.push({
-               title: gettext('Console'),
-               itemId: 'console',
-               xtype: 'pveNoVncConsole',
-               vmid: vmid,
-               consoleType: 'kvm',
-               nodename: nodename
-           });
-       }
-
        if (caps.vms['VM.Console']) {
-           me.items.push([
+           me.items.push(
                {
-                   xtype: 'pveFirewallPanel',
+                   xtype: 'pveFirewallRules',
                    title: gettext('Firewall'),
-                   base_url: base_url + '/firewall',
-                   fwtype: 'vm',
-                   phstateid: me.hstateid,
+                   iconCls: 'fa fa-shield',
+                   allow_iface: true,
+                   base_url: base_url + '/firewall/rules',
+                   list_refs_url: base_url + '/firewall/refs',
                    itemId: 'firewall'
+               },
+               {
+                   xtype: 'pveFirewallOptions',
+                   groups: ['firewall'],
+                   iconCls: 'fa fa-gear',
+                   onlineHelp: 'pve_firewall_vm_container_configuration',
+                   title: gettext('Options'),
+                   base_url: base_url + '/firewall/options',
+                   fwtype: 'vm',
+                   itemId: 'firewall-options'
+               },
+               {
+                   xtype: 'pveFirewallAliases',
+                   title: gettext('Alias'),
+                   groups: ['firewall'],
+                   iconCls: 'fa fa-external-link',
+                   base_url: base_url + '/firewall/aliases',
+                   itemId: 'firewall-aliases'
+               },
+               {
+                   xtype: 'pveIPSet',
+                   title: gettext('IPSet'),
+                   groups: ['firewall'],
+                   iconCls: 'fa fa-list-ol',
+                   base_url: base_url + '/firewall/ipset',
+                   list_refs_url: base_url + '/firewall/refs',
+                   itemId: 'firewall-ipset'
+               },
+               {
+                   title: gettext('Log'),
+                   groups: ['firewall'],
+                   iconCls: 'fa fa-list',
+                   onlineHelp: 'chapter_pve_firewall',
+                   itemId: 'firewall-fwlog',
+                   xtype: 'pveLogView',
+                   url: '/api2/extjs' + base_url + '/firewall/log'
                }
-           ]);
+           );
        }
 
        if (caps.vms['Permissions.Modify']) {
            me.items.push({
                xtype: 'pveACLView',
                title: gettext('Permissions'),
+               iconCls: 'fa fa-unlock',
                itemId: 'permissions',
                path: '/vms/' + vmid
            });
@@ -214,13 +320,12 @@ Ext.define('PVE.qemu.Config', {
 
        me.callParent();
 
-        me.statusStore.on('load', function(s, records, success) {
+        me.mon(me.statusStore, 'load', function(s, records, success) {
            var status;
            var qmpstatus;
            var spice = false;
 
            if (!success) {
-               me.workspace.checkVmMigration(me.pveSelNode);
                status = qmpstatus = 'unknown';
            } else {
                var rec = s.data.get('status');
@@ -228,14 +333,17 @@ Ext.define('PVE.qemu.Config', {
                rec = s.data.get('qmpstatus');
                qmpstatus = rec ? rec.data.value : 'unknown';
                rec = s.data.get('template');
-               if(rec.data.value){
-                   template = rec.data.value;
-               }
+               template = rec.data.value || false;
+
                spice = s.data.get('spice') ? true : false;
 
            }
 
-           if (qmpstatus === 'prelaunch' || qmpstatus === 'paused') {
+           if (template) {
+               return;
+           }
+
+           if (qmpstatus === 'prelaunch' || qmpstatus === 'paused' || qmpstatus === 'suspended') {
                startBtn.setVisible(false);
                resumeBtn.setVisible(true);
            } else {
@@ -246,10 +354,9 @@ Ext.define('PVE.qemu.Config', {
            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');
-           stopBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status === 'stopped');
-           removeBtn.setDisabled(!caps.vms['VM.Allocate'] || status !== 'stopped');
+           me.down('#removeBtn').setDisabled(!caps.vms['VM.Allocate'] || status !== 'stopped');
+           consoleBtn.setDisabled(template);
        });
 
        me.on('afterrender', function() {