From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 0FC381FF0AD for ; Sun, 20 Sep 2026 18:55:54 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 348E1214C3; Sun, 20 Sep 2026 18:55:53 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IlG4qohrFXMQrQU08ovQrVh0NzS7FfW7n+ctjABztPV87wUb6bgEGwbdHzB5RspGWL6yexmJZshO9b1XTWZvhBvoXAhkSVW4k8pvsrv55DM66ilf6lYJTtwA/0afvwxesKkpk6RYGSqH6txZJyY/mx5/atc08INtWVOKVThSZnMZCsN//R8mctveDKzb9PKKtWFtF26AeVQA0c20VBg2lIu04hEVvA4KUID2Wk9TyS9rlyZNSwWqu5J/RvPJx1grbZ5KhJ3ywydouSE+AwQuQuuljRNIvz/xkoOPJuN2cyT0b/vKEMyMSuVybnrcqAEGWuZRU8kFEqHUPrCJfERZcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mqfE+RTLwwckmGsB//5TXhq9kZWW5kYtBSWjYld7ZcY=; b=CD0rdkkCmSN7uuBG7isVE8enbctFN7Orj8MT2h6bM0TNqnuZYzeFy/iTKWqGQ+v/LEm25/mnU2aQKz5x/0Us5fEYNGTYebgG9ZBgDabepdBMsXk+lHojJZ3WbPWUtVJJMtNYQDQr4pCmS+knVctMHFVxQUQ4GW8Cjc94IiLu1R5dDb7ya/TBS2avTECkwH2aAAmjV2bSLE4h76pVALD5C4Dwik5HF6MGdDJevZkcUfNvqAnOBZJhRvsnWp/s7WETL+neEALu+5/aB7KJcual16Hs5BzSk6BiIqzklvYbxmJa0ZzNDeGk92xVvSy/9ZSE/mTJuV7Gv64TkmpRG4Y31g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ryomherold.dk; dmarc=pass action=none header.from=ryomherold.dk; dkim=pass header.d=ryomherold.dk; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=RyomHerold.dk; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mqfE+RTLwwckmGsB//5TXhq9kZWW5kYtBSWjYld7ZcY=; b=UjxgKMBOyy5HjwE/VZ/0Lq8cn3v6Isi+gYgV4tLgChxE5qmWo9nZh0TK8oaY4fbTDnrbuKpaCbKJQfy5YXhEbT21Id7oHOu9tHIejBxzKXU1LPkE1p6IMtWlaTejZrYVA3pfDqoW9DruUfENkCNurn1SWmZpncN1ycVRPpza+9KxE50GHCrgEs0cM0HM1YD6VaEr5a1mv+rRNe1mJO4fxRqPuUbs9KDR69HSib+Eei6AXrJRsVWeknYlDXbCVaDsWQ69DqYeK2jB9upudiAB/Xql/EZqSEd3PuSVciWG67x6ggJPc6Jc+EHBVsrW9ioBC/O3QXWejT0lzSRgQCkH3g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=RyomHerold.dk; From: Michael Ryom To: pve-devel@lists.proxmox.com Subject: [PATCH ha-manager 5/7] sim: hardware: allow setting a base load for nodes Date: Sun, 20 Sep 2026 18:22:12 +0200 Message-ID: <20260920162220.574802-6-Michael@RyomHerold.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260920162220.574802-1-Michael@RyomHerold.dk> References: <20260920162220.574802-1-Michael@RyomHerold.dk> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: TL2P290CA0008.ISRP290.PROD.OUTLOOK.COM (2603:1096:950:2::11) To AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:619::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8PR10MB7231:EE_|AM0PR10MB883391:EE_ X-MS-Office365-Filtering-Correlation-Id: de9ed782-f2cf-40b7-c62b-08df173373f8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|376014|1800799024|366016|10067099003|22082099003|18002099003|56012099006; X-Microsoft-Antispam-Message-Info: ZgQWrLQtuBBrO+5trjxw8n0DCj1e8Y6w9izfwRuIJfLay35gPgVRA7A/qtf7SwZgfj/27/a6OqQQ5N4IvckvZEWAxGHon3ICZBEA5d3JzuROluoWwaedf+byXIEggEuo84edSsMcWEro41Ng8gqWjp+yuy14vSUQOynBqQAejqiEaCX4dlVZ+IQFM5d6kPCh2TQaqMm/N9qkkTdlbO+YuIVKZ/Ef9JTKNLCG92z3FzOTEpvHw7aHyHCqfV2LczVWWVPaXFrk3aQipbsE1qk5X30ge2vGPuugU6uP8rV4yORg5WiPxcGAnHQUMDuL4hDQGwoXdRHIIQ9trZnyjMov99IdJcrG2F+ozCZnCMJUfGNaDQkjYL5xOKq6TeBtcgmnHkBTGcSPiHb87FvBJrkRhnfyyrI2ajp22SR309MV10eNCXVa5rW7OY/+hbLI6oB4NMhj96l59XgHpvzg6QKv9dYxoiTP3T3ygp62Qf3dzI4I5CK0yAeU6jLwmVoRWk1XJDbvWDUTrg7ATy/EwPRX87p+7Qii4ptpg6oY7xq77c8fjKAnVeNR/q7B03M9kLx7mPSRHuCoazYaY/JE3oO4tVHvkt1vs1QrL0FP28SOVtpVKYv7avMHepPzQhqWvg+O5wneQ3U9SoaT8vzvwp1t5+28ANy/q7T9fN7ygfYn2EY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(376014)(1800799024)(366016)(10067099003)(22082099003)(18002099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?UgwWwcbkyekE7VWseXDj5z/vw3WiDEs3/T7yMiwhpCGIjvUUebI//aMHLxpg?= =?us-ascii?Q?lqU3ScZZfHkRCR38A1CBjV/liArZ4ZqOb2grUT9FrPyvmcG+nu37ooU+jUOq?= =?us-ascii?Q?en/HErq42F16HXxulGWbBzrs2v6AnUARJCUYG1Dp3sbf18QNQNkmiEYovlqO?= =?us-ascii?Q?6Joi3H8SS/+GQl7J4eudlaCq0mTJyDvmZ1joTFREfWkbJC7q8ePCNNWxcaeT?= =?us-ascii?Q?uZYSG1u0UNEQMHzfj09tEuNuerkmpgkYQkFTjEUXZUISbrHCWM9IpTGELshb?= =?us-ascii?Q?CkdbhdK59yWlTIY4LYzOSGyip65RWeIcRcEoxnTvjXXydlqqvUlU+lhUTCtf?= =?us-ascii?Q?vFuvOpt33efI7fqiBRZEiDRcT5wzOu0H/hMwvMiSjRQ3hfE20CfF/JNFkpyJ?= =?us-ascii?Q?8TnRlBrA+qPk2OKYEVkBPIog5yZ3ff1EDwAfaqjMKhOnEUNE0qykPKfDhgxz?= =?us-ascii?Q?NYtwTJeqX3sR1vk9ECVmdhfCPgyaTz4QQY9Cr3+5nX7QRClXQ8FXQXXgGVGJ?= =?us-ascii?Q?PCLCIWbhELd3xxFrmXPt97npn8K+xuGO5ms6Gv6mvgit7cKQkVOoKUQiKF24?= =?us-ascii?Q?MDqquKiggYsm83PRLRvWYS2/J+o0VTGgGdMxKxtaosGR71lozzvviguPXteg?= =?us-ascii?Q?o9m4KvLCZJVXlcwngtm1mgqB6fUVPAzanKGtV2EagLgu83SKXcK6Pakmyoqb?= =?us-ascii?Q?/gmHDyRUE6jfjVMzWg5evSsSOjFXhmmfXiJyJn0ehDSwAZERiiR3kim9jRKj?= =?us-ascii?Q?dSWEIYQzQvvWJf7Nr70f0eZEch5d2cVx+645D9n2VaT9s1s3LzN/gQmQCqmn?= =?us-ascii?Q?Je5Tcp2Ly572FUv8Rg1t3XtLtBlW6AkcUU1r9T28rS+Gg7+qCZuqQ38gVgT4?= =?us-ascii?Q?hOCqpnz6oIADCsEjkTilOCjhsIJ803zZJojKj5a0JswXcjqp7I/z7GAkiwVu?= =?us-ascii?Q?w7kYFFUC2A22ELl7bhGhf4v0qoGdHwWtrLrNhvwY5fV9LCgzMakYg7YLZyH6?= =?us-ascii?Q?GJxO/DVZOC27a2/Jjlu+iT2rkwCyT6j9It+tHHgvbH4rcE2JlWTUEzmFATkj?= =?us-ascii?Q?Wwvli13zTYHv8dg8E2L0SRgwcycZTrkT3rfZLPQ+69ETsGt4hiBj+vsLJMKA?= =?us-ascii?Q?E6j+nVxKozJJfI/Kwbobr269A+Tbz4LNLRm5nt+g/Yw3ZSk4kMOhjHdx25ab?= =?us-ascii?Q?01WTnytCWkKphCPOr39WGnCOqX46RIc85NmCfXjDX49eb4op1X6qts9wACc1?= =?us-ascii?Q?3TEteYf35D+OaG5udwaNlB5MNJ58EEebwHc/wcon0q4FwwRjjCCXCFz9ZA6O?= =?us-ascii?Q?j49bCdVZLsCrjwH2xyc15Mms+1qNiJKeo78M1rwgJ+IZ76oi6eGcssODqz3Z?= =?us-ascii?Q?qqezJM/NawelBYiCOBGc+m30uFs6dfDHPVF6OD9bRW0geuF9qJURhS+nd+LH?= =?us-ascii?Q?zRgzwf7Bk81os2jtAALJAE38fy9xKbk4f5abOlKIrBIE5zGQpLhUYNeb2AWf?= =?us-ascii?Q?x/cqZlXZxjA63rtOfxz/63eD+SiXK4ksUOvIvqspc7mzGY3K77QDzXLBkviY?= =?us-ascii?Q?yf+OgzDmTdLuZ5E59gacXKvoSyU3UAxg16WNlUDnHWFHM+RbOQy0wUPF9oJ3?= =?us-ascii?Q?h4X2U8NILV5WWZwgGOTCmElXlhnuoaIowRbcGWK5x2l5Ve0oNFQG+6YQOqlL?= =?us-ascii?Q?OzP98ztxPYCfC1OD3Ex+qxL7/QOWdlUrmUq39cqZ0GWwNzaiSvxSNnQBW6rQ?= =?us-ascii?Q?zJLPEO11zQ=3D=3D?= X-OriginatorOrg: RyomHerold.dk X-MS-Exchange-CrossTenant-Network-Message-Id: de9ed782-f2cf-40b7-c62b-08df173373f8 X-MS-Exchange-CrossTenant-AuthSource: AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Sep 2026 16:23:06.8274 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 26a2499e-4646-4888-a695-c64736a56807 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ZLPdffFEjp1VkcSBmtVj0l2LbrEPHCt+1OC3MvTg/Tb5QwYKYwUJTS4BEn7t52zfMZxjScgMik9ybVuK8IlbzA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR10MB883391 X-SPAM-LEVEL: Spam detection results: 0 DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: IT3RZRFGYK2OQL3TFEP45VTWSXT6HIM6 X-Message-ID-Hash: IT3RZRFGYK2OQL3TFEP45VTWSXT6HIM6 X-MailFrom: Michael@RyomHerold.dk X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Michael Ryom X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: The dynamic node usage stats of the simulated hardware only consisted of the usage of the running HA-managed services. On a real cluster, the node usage additionally contains everything else running on the node: non-HA guests, storage daemons like Ceph or the ZFS ARC, and other host processes, which fluctuate independently of the HA-managed services. Read an optional base load ('cpu' and 'mem') for each node from the hardware status and add a hardware command node set-dynamic-stats [cpu ] [mem ] to change it during a test, so that regression tests can simulate load that cannot be attributed to any HA-managed service. Signed-off-by: Michael Ryom --- src/PVE/HA/Sim/Hardware.pm | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm index 538bc4e..aa1a886 100644 --- a/src/PVE/HA/Sim/Hardware.pm +++ b/src/PVE/HA/Sim/Hardware.pm @@ -791,6 +791,7 @@ sub get_cfs_state { # crm enable-node-maintenance # crm disable-node-maintenance # pve-manager-version set # note: this is NOT the *ha*-manager version +# node set-dynamic-stats [cpu ] [mem ] # load outside HA services # reboot # shutdown # restart-lrm @@ -881,6 +882,26 @@ sub sim_hardware_cmd { $self->write_hardware_status_nolock($cstatus); + } elsif ($cmd eq 'node') { + die "sim_hardware_cmd: unknown node action '$action'" + if $action ne 'set-dynamic-stats'; + die "sim_hardware_cmd: missing target stat for '$action' command" + if !@params; + + my $conversions = { cpu => sub { 0.0 + $_[0] }, mem => sub { $_[0] * 1024**2 } }; + + for my ($target, $val) (@params) { + die "sim_hardware_cmd: missing value for '$action $target' command" + if !defined($val); + + my $convert = $conversions->{$target} + or die "sim_hardware_cmd: unknown target stat '$target' for '$action' command"; + + $cstatus->{$node}->{$target} = $convert->($val); + } + + $self->write_hardware_status_nolock($cstatus); + } elsif ($cmd eq 'cfs') { die "sim_hardware_cmd: unknown cfs action '$action' for node '$node'" if $action !~ m/^(rw|update)$/; @@ -1281,18 +1302,21 @@ sub get_static_node_stats { sub get_dynamic_node_stats { my ($self) = @_; + my $cstatus = $self->read_hardware_status_nolock(); + my $stats = $self->get_static_node_stats(); for my $node (keys %$stats) { $stats->{$node}->{maxcpu} = $stats->{$node}->{maxcpu} // $default_node_maxcpu; - $stats->{$node}->{cpu} = $stats->{$node}->{cpu} // 0.0; + # base load of the node outside of the HA-managed services, e.g. + # non-HA guests or other host processes + $stats->{$node}->{cpu} = $cstatus->{$node}->{cpu} // 0.0; $stats->{$node}->{maxmem} = $stats->{$node}->{maxmem} // $default_node_maxmem; - $stats->{$node}->{mem} = $stats->{$node}->{mem} // 0; + $stats->{$node}->{mem} = $cstatus->{$node}->{mem} // 0; } my $service_conf = $self->read_service_config(); my $dynamic_service_stats = $self->get_dynamic_service_stats(); - my $cstatus = $self->read_hardware_status_nolock(); my $node_service_status = { map { $_ => $self->read_service_status($_) } keys %$cstatus }; for my $sid (keys %$service_conf) { -- 2.47.3