]> git.proxmox.com Git - pve-manager.git/commitdiff
close #4513: ui: backup job: add tab for advanced options
authorFiona Ebner <f.ebner@proxmox.com>
Tue, 16 Apr 2024 12:09:53 +0000 (14:09 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 17 Apr 2024 14:05:09 +0000 (16:05 +0200)
pigz is not exposed, because it only works after manually installing
the pigz package.

ionice is not exposed, because it only works in combination with the
BFQ scheduler and even then not in all cases (only affects the
compressor when doing snapshot/suspend mode backup of a VM).

The pbs-entries-max performance option is not exposed. It is rather
niche and hard to understand. It serves as an escape hatch for
rare/extreme cases.

These can still be added with appropriate notes if there is enough
user demand.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
www/manager6/Makefile
www/manager6/dc/Backup.js
www/manager6/panel/BackupAdvancedOptions.js [new file with mode: 0644]

index 5e16f2a57d733960b5a06ef589fbcc9de09e98e8..8658b154eaf5e78177ead00126e962e8edf1a2d4 100644 (file)
@@ -97,6 +97,7 @@ JSSRC=                                                        \
        grid/Replication.js                             \
        grid/ResourceGrid.js                            \
        panel/ConfigPanel.js                            \
+       panel/BackupAdvancedOptions.js                  \
        panel/BackupJobPrune.js                         \
        panel/HealthWidget.js                           \
        panel/IPSet.js                                  \
index 60156b9549de60fe0fc2f9e240bb9d3a889ace43..7024df6c355d998de19f9f1dcabf74ec9a218a27 100644 (file)
@@ -196,6 +196,11 @@ Ext.define('PVE.dc.BackupEdit', {
                                PVE.Utils.unEscapeNotesTemplate(data['notes-template']);
                        }
 
+                       if (data.performance) {
+                           Object.assign(data, data.performance);
+                           delete data.performance;
+                       }
+
                        view.setValues(data);
                    },
                });
@@ -466,6 +471,13 @@ Ext.define('PVE.dc.BackupEdit', {
                        },
                    ],
                },
+               {
+                   xtype: 'pveBackupAdvancedOptionsPanel',
+                   title: gettext('Advanced'),
+                   cbind: {
+                       isCreate: '{isCreate}',
+                   },
+               },
            ],
        },
     ],
diff --git a/www/manager6/panel/BackupAdvancedOptions.js b/www/manager6/panel/BackupAdvancedOptions.js
new file mode 100644 (file)
index 0000000..4d74ba3
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Input panel for advanced backup options intended to be used as part of an edit/create window.
+ */
+Ext.define('PVE.panel.BackupAdvancedOptions', {
+    extend: 'Proxmox.panel.InputPanel',
+    xtype: 'pveBackupAdvancedOptionsPanel',
+    mixins: ['Proxmox.Mixin.CBind'],
+
+    cbindData: function() {
+       let me = this;
+       me.isCreate = !!me.isCreate;
+       return {};
+    },
+
+    onGetValues: function(formValues) {
+       if (this.needMask) { // isMasked() may not yet be true if not rendered once
+           return {};
+       }
+
+       let options = { 'delete': [] };
+
+       let performance = {};
+       let performanceOptions = ['max-workers', 'pbs-entries-max'];
+
+       for (const [key, value] of Object.entries(formValues)) {
+           if (performanceOptions.includes(key)) {
+               performance[key] = value;
+           // deleteEmpty is not currently implemented for pveBandwidthField
+           } else if (key === 'bwlimit' && value === '') {
+               options.delete.push('bwlimit');
+           } else if (key === 'delete') {
+               if (Array.isArray(value)) {
+                   value.filter(opt => !performanceOptions.includes(opt)).forEach(
+                       opt => options.delete.push(opt),
+                   );
+               } else if (!performanceOptions.includes(formValues.delete)) {
+                   options.delete.push(value);
+               }
+           } else {
+               options[key] = value;
+           }
+       }
+
+       if (Object.keys(performance).length > 0) {
+           options.performance = PVE.Parser.printPropertyString(performance);
+       } else {
+           options.delete.push('performance');
+       }
+
+       if (this.isCreate) {
+           delete options.delete;
+       }
+
+       return options;
+    },
+
+    column1: [
+       {
+           xtype: 'pveBandwidthField',
+           name: 'bwlimit',
+           fieldLabel: gettext('Bandwidth Limit'),
+           emptyText: gettext('use fallback'),
+           backendUnit: 'KiB',
+           allowZero: true,
+           emptyValue: '',
+           autoEl: {
+               tag: 'div',
+               'data-qtip': Ext.String.format(gettext('Use {0} for unlimited'), 0),
+           },
+       },
+       {
+           xtype: 'proxmoxintegerfield',
+           name: 'zstd',
+           fieldLabel: Ext.String.format(gettext('{0} Threads'), 'Zstd'),
+           fieldStyle: 'text-align: right',
+           emptyText: gettext('use fallback'),
+           minValue: 0,
+           cbind: {
+               deleteEmpty: '{!isCreate}',
+           },
+           autoEl: {
+               tag: 'div',
+               'data-qtip': gettext('With 0, half of the available cores are used'),
+           },
+       },
+       {
+           xtype: 'proxmoxintegerfield',
+           name: 'max-workers',
+           minValue: 1,
+           maxValue: 256,
+           fieldLabel: gettext('VM Workers'),
+           fieldStyle: 'text-align: right',
+           emptyText: gettext('use fallback'),
+           cbind: {
+               deleteEmpty: '{!isCreate}',
+           },
+       },
+       {
+           // It's part of the 'performance' property string, so have a field to preserve the
+           // value, but don't expose it. It's a rather niche setting and difficult to
+           // convey/understand what it does.
+           xtype: 'proxmoxintegerfield',
+           name: 'pbs-entries-max',
+           hidden: true,
+           fieldLabel: 'TODO',
+           fieldStyle: 'text-align: right',
+           emptyText: gettext('use fallback'),
+           cbind: {
+               deleteEmpty: '{!isCreate}',
+           },
+       },
+    ],
+
+    column2: [
+       {
+           xtype: 'displayfield',
+           value: gettext('Limit I/O bandwidth'),
+       },
+       {
+           xtype: 'displayfield',
+           value: `${gettext('Threads used for zstd compression')} (${gettext('non-PBS')})`,
+       },
+       {
+           xtype: 'displayfield',
+           value: `${gettext('I/O workers in the QEMU process')} (${gettext('VM only')})`,
+       },
+       {
+           xtype: 'displayfield',
+           value: 'TODO',
+           hidden: true, // see definition of pbs-entries-max field
+       },
+    ],
+
+    columnB: [
+       {
+           xtype: 'component',
+           userCls: 'pmx-hint',
+           padding: '5 1',
+           html: gettext("Note that vzdump.conf is used as a fallback"),
+       },
+    ],
+});