From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id A2B931FF165 for ; Thu, 17 Jul 2025 16:16:23 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 23BA93C8A9; Thu, 17 Jul 2025 16:16:20 +0200 (CEST) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Thu, 17 Jul 2025 16:15:29 +0200 Message-ID: <20250717141530.1471199-14-c.heiss@proxmox.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250717141530.1471199-1-c.heiss@proxmox.com> References: <20250717141530.1471199-1-c.heiss@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1752761736199 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.118 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_1 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_3 0.1 random spam to be learned in bayes SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v4 13/14] ui: window: Migrate: add checkbox for migrating VM conntrack state X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" 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 --- 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 Changes v3 -> v4: * no changes 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