Adds a new checkbox to the migration dialog, if it is a live/online-migration and both the source and target nodes have support for our dbus-vmstate helper.
If the checkbox is active, it passes along the `with-conntrack-state` parameter to the migrate API call. Signed-off-by: Christoph Heiss <c.he...@proxmox.com> --- Changes v1 -> v2: * rebased on latest master Changes v2 -> v3: * reformatted using biome * log warning in case /capabilities/qemu/migration is not (yet) supported by the target node www/manager6/window/Migrate.js | 82 ++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/www/manager6/window/Migrate.js b/www/manager6/window/Migrate.js index 4103ad135..8b52f9e90 100644 --- a/www/manager6/window/Migrate.js +++ b/www/manager6/window/Migrate.js @@ -29,9 +29,10 @@ Ext.define('PVE.window.Migrate', { allowedNodes: undefined, overwriteLocalResourceCheck: false, hasLocalResources: false, + withConntrackState: true, + bothHaveDbusVmstate: false, }, }, - formulas: { setMigrationMode: function (get) { if (get('running')) { @@ -62,6 +63,10 @@ Ext.define('PVE.window.Migrate', { return false; } }, + conntrackStateCheckboxHidden: (get) => + !get('running') || + get('vmtype') !== 'qemu' || + !get('migration.bothHaveDbusVmstate'), }, }, @@ -141,6 +146,10 @@ Ext.define('PVE.window.Migrate', { params.force = 1; } + if (vm.get('migration.bothHaveDbusVmstate') && vm.get('migration.withConntrackState')) { + params['with-conntrack-state'] = 1; + } + Proxmox.Utils.API2Request({ params: params, url: @@ -227,12 +236,29 @@ Ext.define('PVE.window.Migrate', { method: 'GET', }); migrateStats = result.data; - me.fetchingNodeMigrateInfo = false; } catch (error) { Ext.Msg.alert(Proxmox.Utils.errorText, error.htmlStatus); + me.fetchingNodeMigrateInfo = false; return; } + const target = me.lookup('pveNodeSelector').value; + let targetCapabilities = {}; + + try { + const { result } = await Proxmox.Async.api2({ + url: `/nodes/${target}/capabilities/qemu/migration`, + method: 'GET', + }); + targetCapabilities = result.data; + } catch (err) { + // Only emit a warning in the case the target node does not (yet) support the + // `capabilites/qemu/migration` endpoint and simply treat all features as unsupported. + console.warn(`failed to query /capabilites/qemu/migration on '${target}': ${err}`); + } + + me.fetchingNodeMigrateInfo = false; + if (migrateStats.running) { vm.set('running', true); } @@ -242,7 +268,6 @@ Ext.define('PVE.window.Migrate', { migration.possible = true; } migration.preconditions = []; - let target = me.lookup('pveNodeSelector').value; let disallowed = migrateStats.not_allowed_nodes?.[target] ?? {}; if (migrateStats.allowed_nodes && !vm.get('running')) { @@ -361,6 +386,36 @@ Ext.define('PVE.window.Migrate', { }); } + migration.bothHaveDbusVmstate = + migrateStats['has-dbus-vmstate'] && targetCapabilities['has-dbus-vmstate']; + if (vm.get('running')) { + if (migration.withConntrackState && !migrateStats['has-dbus-vmstate']) { + migration.preconditions.push({ + text: gettext( + 'Cannot migrate conntrack state, source node is lacking support. Active network connections might get dropped.', + ), + severity: 'warning', + }); + } + if (migration.withConntrackState && !targetCapabilities['has-dbus-vmstate']) { + migration.preconditions.push({ + text: gettext( + 'Cannot migrate conntrack state, target node is lacking support. Active network connections might get dropped.', + ), + severity: 'warning', + }); + } + + if (migration.bothHaveDbusVmstate && !migration.withConntrackState) { + migration.preconditions.push({ + text: gettext( + 'Conntrack state migration disabled. Active network connections might get dropped.', + ), + severity: 'warning', + }); + } + } + vm.set('migration', migration); }, checkLxcPreconditions: function (resetMigrationPossible) { @@ -456,6 +511,27 @@ Ext.define('PVE.window.Migrate', { }, }, }, + { + xtype: 'proxmoxcheckbox', + name: 'withConntrackState', + fieldLabel: gettext('Conntrack state'), + autoEl: { + tag: 'div', + 'data-qtip': gettext( + 'Enables live migration of conntrack entries for this VM.', + ), + }, + bind: { + hidden: '{conntrackStateCheckboxHidden}', + value: '{migration.withConntrackState}', + }, + listeners: { + change: { + fn: 'checkMigratePreconditions', + extraArg: true, + }, + }, + }, ], }, ], -- 2.49.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel