]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/qemu/Options.js
api: add proxmox-firewall to versions pkg list
[pve-manager.git] / www / manager6 / qemu / Options.js
index 47bc2d85edc86e08cce6fed974378f3562250ea3..7b112400582506f8c5d1db857a2fc2e79d2583a1 100644 (file)
@@ -1,13 +1,11 @@
-/*jslint confusion: true */
 Ext.define('PVE.qemu.Options', {
-    extend: 'PVE.grid.PendingObjectGrid',
+    extend: 'Proxmox.grid.PendingObjectGrid',
     alias: ['widget.PVE.qemu.Options'],
 
     onlineHelp: 'qm_options',
 
-    initComponent : function() {
+    initComponent: function() {
        var me = this;
-       var i;
 
        var nodename = me.pveSelNode.data.node;
        if (!nodename) {
@@ -27,36 +25,36 @@ Ext.define('PVE.qemu.Options', {
                defaultValue: me.pveSelNode.data.name,
                header: gettext('Name'),
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Name'),
                    items: {
                        xtype: 'inputpanel',
-                       items:{
+                       items: {
                            xtype: 'textfield',
                            name: 'name',
                            vtype: 'DnsName',
                            value: '',
                            fieldLabel: gettext('Name'),
-                           allowBlank: true
+                           allowBlank: true,
                        },
                        onGetValues: function(values) {
                            var params = values;
                            if (values.name === undefined ||
                                values.name === null ||
                                values.name === '') {
-                               params = { 'delete':'name'};
+                               params = { 'delete': 'name' };
                            }
                            return params;
-                       }
-                   }
-               } : undefined
+                       },
+                   },
+               } : undefined,
            },
            onboot: {
                header: gettext('Start at boot'),
                defaultValue: '',
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Start at boot'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -64,28 +62,28 @@ Ext.define('PVE.qemu.Options', {
                        uncheckedValue: 0,
                        defaultValue: 0,
                        deleteDefaultValue: true,
-                       fieldLabel: gettext('Start at boot')
-                   }
-               } : undefined
+                       fieldLabel: gettext('Start at boot'),
+                   },
+               } : undefined,
            },
            startup: {
                header: gettext('Start/Shutdown order'),
                defaultValue: '',
                renderer: PVE.Utils.render_kvm_startup,
-               editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] ? 
-                   {
+               editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify']
+                   {
                        xtype: 'pveWindowStartupEdit',
-                       onlineHelp: 'qm_startup_and_shutdown'
-                   } : undefined
+                       onlineHelp: 'qm_startup_and_shutdown',
+                   } : undefined,
            },
            ostype: {
                header: gettext('OS Type'),
                editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined,
                renderer: PVE.Utils.render_kvm_ostype,
-               defaultValue: 'other'
+               defaultValue: 'other',
            },
            bootdisk: {
-               visible: false
+               visible: false,
            },
            boot: {
                header: gettext('Boot Order'),
@@ -93,40 +91,57 @@ Ext.define('PVE.qemu.Options', {
                editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
                multiKey: ['boot', 'bootdisk'],
                renderer: function(order, metaData, record, rowIndex, colIndex, store, pending) {
-                   var i;
+                   if (/^\s*$/.test(order)) {
+                       return gettext('(No boot device selected)');
+                   }
+                   let boot = PVE.Parser.parsePropertyString(order, "legacy");
+                   if (boot.order) {
+                       let list = boot.order.split(';');
+                       let ret = '';
+                       list.forEach(dev => {
+                           if (ret) {
+                               ret += ', ';
+                           }
+                           ret += dev;
+                       });
+                       return ret;
+                   }
+
+                   // legacy style and fallback
+                   let i;
                    var text = '';
                    var bootdisk = me.getObjectValue('bootdisk', undefined, pending);
-                   order = order || 'cdn';
+                   order = boot.legacy || 'cdn';
                    for (i = 0; i < order.length; i++) {
-                       var sel = order.substring(i, i + 1);
                        if (text) {
                            text += ', ';
                        }
+                       var sel = order.substring(i, i + 1);
                        if (sel === 'c') {
                            if (bootdisk) {
-                               text += "Disk '" + bootdisk + "'";
+                               text += bootdisk;
                            } else {
-                               text += "Disk";
+                               text += gettext('first disk');
                            }
                        } else if (sel === 'n') {
-                           text += 'Network';
+                           text += gettext('any net');
                        } else if (sel === 'a') {
-                           text += 'Floppy';
+                           text += gettext('Floppy');
                        } else if (sel === 'd') {
-                           text += 'CD-ROM';
+                           text += gettext('any CD-ROM');
                        } else {
                            text += sel;
                        }
                    }
                    return text;
-               }
+               },
            },
            tablet: {
                header: gettext('Use tablet for pointer'),
                defaultValue: true,
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.Config.HWType'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Use tablet for pointer'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -135,16 +150,16 @@ Ext.define('PVE.qemu.Options', {
                        uncheckedValue: 0,
                        defaultValue: 1,
                        deleteDefaultValue: true,
-                       fieldLabel: gettext('Enabled')
-                   }
-               } : undefined
+                       fieldLabel: gettext('Enabled'),
+                   },
+               } : undefined,
            },
            hotplug: {
                header: gettext('Hotplug'),
                defaultValue: 'disk,network,usb',
-               renderer:  PVE.Utils.render_hotplug_features,
+               renderer: PVE.Utils.render_hotplug_features,
                editor: caps.vms['VM.Config.HWType'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Hotplug'),
                    items: {
                        xtype: 'pveHotplugFeatureSelector',
@@ -152,16 +167,16 @@ Ext.define('PVE.qemu.Options', {
                        value: '',
                        multiSelect: true,
                        fieldLabel: gettext('Hotplug'),
-                       allowBlank: true
-                   }
-               } : undefined
+                       allowBlank: true,
+                   },
+               } : undefined,
            },
            acpi: {
                header: gettext('ACPI support'),
                defaultValue: true,
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.Config.HWType'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('ACPI support'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -170,28 +185,16 @@ Ext.define('PVE.qemu.Options', {
                        uncheckedValue: 0,
                        defaultValue: 1,
                        deleteDefaultValue: true,
-                       fieldLabel: gettext('Enabled')
-                   }
-               } : undefined
-           },
-           scsihw: {
-               header: gettext('SCSI Controller'),
-               editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.ScsiHwEdit' : undefined,
-               renderer: PVE.Utils.render_scsihw,
-               defaultValue: ''
-           },
-           bios: {
-               header: 'BIOS',
-               editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.BiosEdit' : undefined,
-               renderer: PVE.Utils.render_qemu_bios,
-               defaultValue: ''
+                       fieldLabel: gettext('Enabled'),
+                   },
+               } : undefined,
            },
            kvm: {
                header: gettext('KVM hardware virtualization'),
                defaultValue: true,
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.Config.HWType'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('KVM hardware virtualization'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -200,16 +203,16 @@ Ext.define('PVE.qemu.Options', {
                        uncheckedValue: 0,
                        defaultValue: 1,
                        deleteDefaultValue: true,
-                       fieldLabel: gettext('Enabled')
-                   }
-               } : undefined
+                       fieldLabel: gettext('Enabled'),
+                   },
+               } : undefined,
            },
            freeze: {
                header: gettext('Freeze CPU at startup'),
                defaultValue: false,
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.PowerMgmt'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Freeze CPU at startup'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -218,33 +221,37 @@ Ext.define('PVE.qemu.Options', {
                        defaultValue: 0,
                        deleteDefaultValue: true,
                        labelWidth: 140,
-                       fieldLabel: gettext('Freeze CPU at startup')
-                   }
-               } : undefined
+                       fieldLabel: gettext('Freeze CPU at startup'),
+                   },
+               } : undefined,
            },
            localtime: {
                header: gettext('Use local time for RTC'),
-               defaultValue: false,
-               renderer: Proxmox.Utils.format_boolean,
+               defaultValue: '__default__',
+               renderer: PVE.Utils.render_localtime,
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Use local time for RTC'),
+                   width: 400,
                    items: {
-                       xtype: 'proxmoxcheckbox',
+                       xtype: 'proxmoxKVComboBox',
                        name: 'localtime',
-                       uncheckedValue: 0,
-                       defaultValue: 0,
-                       deleteDefaultValue: true,
+                       value: '__default__',
+                       comboItems: [
+                           ['__default__', PVE.Utils.render_localtime('__default__')],
+                           [1, PVE.Utils.render_localtime(1)],
+                           [0, PVE.Utils.render_localtime(0)],
+                       ],
                        labelWidth: 140,
-                       fieldLabel: gettext('Use local time for RTC')
-                   }
-               } : undefined
+                       fieldLabel: gettext('Use local time for RTC'),
+                   },
+               } : undefined,
            },
            startdate: {
                header: gettext('RTC start date'),
                defaultValue: 'now',
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('RTC start date'),
                    items: {
                        xtype: 'proxmoxtextfield',
@@ -253,39 +260,37 @@ Ext.define('PVE.qemu.Options', {
                        value: 'now',
                        fieldLabel: gettext('RTC start date'),
                        vtype: 'QemuStartDate',
-                       allowBlank: true
-                   }
-               } : undefined
+                       allowBlank: true,
+                   },
+               } : undefined,
            },
            smbios1: {
                header: gettext('SMBIOS settings (type1)'),
                defaultValue: '',
                renderer: Ext.String.htmlEncode,
-               editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined
+               editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined,
            },
            agent: {
-               header: gettext('Qemu Agent'),
+               header: 'QEMU Guest Agent',
                defaultValue: false,
-               renderer: Proxmox.Utils.format_boolean,
+               renderer: PVE.Utils.render_qga_features,
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Qemu Agent'),
+                   width: 350,
+                   onlineHelp: 'qm_qemu_agent',
                    items: {
-                       xtype: 'proxmoxcheckbox',
+                       xtype: 'pveAgentFeatureSelector',
                        name: 'agent',
-                       uncheckedValue: 0,
-                       defaultValue: 0,
-                       deleteDefaultValue: true,
-                       fieldLabel: gettext('Enabled')
-                   }
-               } : undefined
+                   },
+               } : undefined,
            },
            protection: {
                header: gettext('Protection'),
                defaultValue: false,
                renderer: Proxmox.Utils.format_boolean,
                editor: caps.vms['VM.Config.Options'] ? {
-                   xtype: 'pveWindowEdit',
+                   xtype: 'proxmoxWindowEdit',
                    subject: gettext('Protection'),
                    items: {
                        xtype: 'proxmoxcheckbox',
@@ -293,87 +298,60 @@ Ext.define('PVE.qemu.Options', {
                        uncheckedValue: 0,
                        defaultValue: 0,
                        deleteDefaultValue: true,
-                       fieldLabel: gettext('Enabled')
-                   }
-               } : undefined
-           }
+                       fieldLabel: gettext('Enabled'),
+                   },
+               } : undefined,
+           },
+           spice_enhancements: {
+               header: gettext('Spice Enhancements'),
+               defaultValue: false,
+               renderer: PVE.Utils.render_spice_enhancements,
+               editor: caps.vms['VM.Config.Options'] ? {
+                   xtype: 'proxmoxWindowEdit',
+                   subject: gettext('Spice Enhancements'),
+                   onlineHelp: 'qm_spice_enhancements',
+                   items: {
+                       xtype: 'pveSpiceEnhancementSelector',
+                       name: 'spice_enhancements',
+                   },
+               } : undefined,
+           },
+           vmstatestorage: {
+               header: gettext('VM State storage'),
+               defaultValue: '',
+               renderer: val => val || gettext('Automatic'),
+               editor: caps.vms['VM.Config.Options'] ? {
+                   xtype: 'proxmoxWindowEdit',
+                   subject: gettext('VM State storage'),
+                   onlineHelp: 'chapter_virtual_machines', // FIXME: use 'qm_vmstatestorage' once available
+                   width: 350,
+                   items: {
+                       xtype: 'pveStorageSelector',
+                       storageContent: 'images',
+                       allowBlank: true,
+                       emptyText: gettext("Automatic (Storage used by the VM, or 'local')"),
+                       autoSelect: false,
+                       deleteEmpty: true,
+                       skipEmptyText: true,
+                       nodename: nodename,
+                       name: 'vmstatestorage',
+                   },
+               } : undefined,
+           },
+           hookscript: {
+               header: gettext('Hookscript'),
+           },
        };
 
        var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config';
 
-       var reload = function() {
-           me.rstore.load();
-       };
-
-       var run_editor = function() {
-           var sm = me.getSelectionModel();
-           var rec = sm.getSelection()[0];
-           if (!rec) {
-               return;
-           }
-
-           var rowdef = rows[rec.data.key];
-           if (!rowdef.editor) {
-               return;
-           }
-
-           var win;
-           if (Ext.isString(rowdef.editor)) {
-               win = Ext.create(rowdef.editor, {
-                   pveSelNode: me.pveSelNode,
-                   confid: rec.data.key,
-                   url: '/api2/extjs/' + baseurl
-               });
-           } else {
-               var config = Ext.apply({
-                   pveSelNode: me.pveSelNode,
-                   confid: rec.data.key,
-                   url: '/api2/extjs/' + baseurl
-               }, rowdef.editor);
-               win = Ext.createWidget(rowdef.editor.xtype, config);
-               win.load();
-           }
-
-           win.show();
-           win.on('destroy', reload);
-       };
-
        var edit_btn = new Ext.Button({
            text: gettext('Edit'),
            disabled: true,
-           handler: run_editor
+           handler: function() { me.run_editor(); },
        });
 
-        var revert_btn = new Proxmox.button.Button({
-            text: gettext('Revert'),
-            disabled: true,
-            handler: function() {
-               var sm = me.getSelectionModel();
-               var rec = sm.getSelection()[0];
-               if (!rec) {
-                   return;
-               }
-
-               var rowdef = me.rows[rec.data.key] || {};
-               var keys = rowdef.multiKey ||  [ rec.data.key ];
-               var revert = keys.join(',');
-
-                Proxmox.Utils.API2Request({
-                    url: '/api2/extjs/' + baseurl,
-                    waitMsgTarget: me,
-                    method: 'PUT',
-                    params: {
-                        'revert': revert
-                    },
-                    callback: function() {
-                        reload();
-                    },
-                    failure: function (response, opts) {
-                        Ext.Msg.alert('Error',response.htmlStatus);
-                    }
-                });
-            }
-        });
+       var revert_btn = new PVE.button.PendingRevert();
 
        var set_button_status = function() {
            var sm = me.getSelectionModel();
@@ -385,7 +363,7 @@ Ext.define('PVE.qemu.Options', {
            }
 
            var key = rec.data.key;
-           var pending = rec.data['delete'] || me.hasPendingChanges(key);
+           var pending = rec.data.delete || me.hasPendingChanges(key);
            var rowdef = rows[key];
 
            edit_btn.setDisabled(!rowdef.editor);
@@ -396,22 +374,26 @@ Ext.define('PVE.qemu.Options', {
            url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending",
            interval: 5000,
            cwidth1: 250,
-           tbar: [ edit_btn, revert_btn ],
+           tbar: [edit_btn, revert_btn],
            rows: rows,
+           editorConfig: {
+               url: "/api2/extjs/" + baseurl,
+           },
            listeners: {
-               itemdblclick: run_editor,
-               selectionchange: set_button_status
-           }
+               itemdblclick: me.run_editor,
+               selectionchange: set_button_status,
+           },
        });
 
        me.callParent();
 
-       me.on('activate', me.rstore.startUpdate);
-       me.on('destroy', me.rstore.stopUpdate); 
+       me.on('activate', () => me.rstore.startUpdate());
+       me.on('destroy', () => me.rstore.stopUpdate());
+       me.on('deactivate', () => me.rstore.stopUpdate());
 
-       me.rstore.on('datachanged', function() {
+       me.mon(me.getStore(), 'datachanged', function() {
            set_button_status();
        });
-    }
+    },
 });