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 169831FF0AD for ; Sun, 18 Oct 2026 14:47:56 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 51748216FC; Sun, 18 Oct 2026 14:46:48 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DM1+aRooiKVrxogXyzLjV28y/esrMTZ3q9adZntEZhmK4JvjLdq7YyfEEYysE4NkvT6eZFEm+ixjvj4JR+l5j5Xx54dPfY91zkcOcAfBbiy5YZGxgmq+bChAtuhwrOwA6j7zUd3nYuZ4WOpVpmgPBktotyaaGTVdvTVptXg0q7qJz8TCFKlFPt0f3qHuDN5tZldD/9Fp2JPvjP67aXz4isn8OSwNVxemARpSaZZSTcc0jy3gu8J9AKKaI9JnWCe34GxGLp4VS/9UC03FzeB0aRit5HVQaYgLFDwFa9VggBxgxkXHZJGXKvssV8HbgB6vw45KnG8YJfI0IXABycurxQ== 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=O7bELEpxH93ypzJwNw+mUUi8NusjP3p3UIzSw5b0IvoiH9FzyGZ7YeTKFZj2zpoS0AbQBQekFugx7iFb5jR4QzcjmSwfW53CtS2iGiQnVVrLb/u1t73oTmXwCS1Qg0g6Ag9aE4XvNtYw2cIaMEpElPod3xcWqaH8xoKokbnYsu1umvWzaptGMRJqbcD+IhKyZZ0BAUexez0E/IrA6Ztf2haN66v390VfPINhIzOhfmtsC0TpUES3vumaha/Yz5kLvyrfCOt0WGVxqhTeDRR8b0BZpyJZHHtXMDW9y0girbjI8J2070gb7GIlaQy4UcfH9OOp63Lj19fng+ukxsZ+eg== 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=dl4o9pm1qT0l2reYcsyuY7NsQhw11GpPD4ujdStoNi1nGGu8WRV0QMvjWgXLnZX6Jb1It1UwZtnl/0ilJxCuf48ZrZyXKJKhp1nSXWsHRHRL3osMgjDjz1eJ2jqYdYFOEmSZ/gMow/Z3z4N9QEkb42S1/ajyCa/GYidRGXF+v8VnnRFZ+eXcxQPs/+3WQ49ZkzwxqEaR2JR2yRYiysVUmBm09EcrqFnEmMb+98XespEiEn/qxIqy2+gvYeMpTkC/rMu1YD4Avj998cpPt5DjK8HRaP49BGeetgerAkm8DX9UZG62+HBPvXnF2Va3fXz/smHdTA/qxc+wBLDXOTqfeg== Authentication-Results: mx.microsoft.com 1; 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 v2 10/14] sim: hardware: allow setting a base load for nodes Date: Sun, 18 Oct 2026 14:45:54 +0200 Message-ID: <20261018124559.24305-11-Michael@RyomHerold.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261018124559.24305-1-Michael@RyomHerold.dk> References: <20261018124559.24305-1-Michael@RyomHerold.dk> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MM0P280CA0046.SWEP280.PROD.OUTLOOK.COM (2603:10a6:190:b::20) To AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:619::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8PR10MB7231:EE_|PA4PR10MB5706:EE_ X-MS-Office365-Filtering-Correlation-Id: edb5f474-a82c-49b9-452b-08df2d15cd46 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|23010399003|22082099003|10067099003|18002099003|261009223027099003|56012099006; X-Microsoft-Antispam-Message-Info: XfHC8nkDzLgIFlw0Zz0oeYMP+Itk8QvCfkuR0CPn533sLITl/Yb0LzaT+oKFiENBoPOxWxX07XY0clHX6Xxf6lj+rNFdVdtKoKsff7OqsjBHZp2qGZkqRCfZ+KR4+23aaGmiVnM7ckERMSmXpFGl9ptYfMQhI69NaD4gB87Os4TeSbI1pjIglkDIt5pg4/3H6OTzYS2GgnIzumebvPPsvO+MpdR8nVLxTfumFEff2mOkn/2hnjdPFjALZp0cYC2mPY8+gFCHUzx/t3n9b1g0QHZn4MET4R0xzDhefjBAI4yx4URsDLGcwrfCg0RbmXox44YA1CKvbZfuqtJkOCGmF15BabQ3c2UJRrNVHBEGUnPpXBuu6gRnf1egI9jbuuDnxGnt6v8/h8sFSp9kkA0hPNPTv6aJGUHaPNObDEZwT+vrajQtg4TaX9sRfIBEdmXa+WbQaQMoqLa9TFq2ZeN3couFu9ytfgQnblGWeWbBOkFJ45JLf9YPQ7aQgHpg40zPfhBAqe0uyuLVhpG0WNpsAofPZM4lDlmHnTN7OBTYvYV8K4btnRymo0alnM9PHRq0XUIHF6C44IM5OSwCXaNEmXtt/qA/f0mId5L/LVVJKBNfHebEetwuf7p+SC/dXt4DpEnBuL8jWlTLO8Q4KAwMoJCS6MWnjirmS3siU+23ELo= 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)(1800799024)(366016)(376014)(23010399003)(22082099003)(10067099003)(18002099003)(261009223027099003)(56012099006);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Nn9IoQr5gmK3UHHh7SQr20RtdY8NonJfCaKq1QCUMqWQbVU5XWlZxPvAuztO?= =?us-ascii?Q?FzIYlWWai0X7pyeXaxzHyMGTLM48dcpI+8OFOIK/HV6PChSDPvlrvYUp7dfR?= =?us-ascii?Q?KyJ1sh/y19Gi2J2JAUipZVid3NhxkXPSjvY1/oNDPULLriDSwGWvV1Xfth1c?= =?us-ascii?Q?3iI9ZEsRyYTibnSpc+9NbD15VqcyBAAvm/TP5kh+xCFMdh5ihbbcsU7WAfkb?= =?us-ascii?Q?uNVUEi+j4xRU21LC6irPg0iMxbm8566WauE4t6t4O+mhcYIgfNxL+V865EGk?= =?us-ascii?Q?QTu8n8ElFQORz1eF2yIQRwKRbVX3nwVIqRz8j0sHgbKdKJVl4GAxjueQUdkh?= =?us-ascii?Q?NymhyiXP6sa6qciEjq46heVPI5Mx14FKdiojtyCrasjz1JTKnko0HpJRkVxK?= =?us-ascii?Q?ATiRI2r2U4LTerTPP7N08DrGeVQqgm0/oeQsgXOKsZfaO22e1jGgVHTeZ6s6?= =?us-ascii?Q?CmMHrayrOzqfHVQpYrE0MiBTthCNzGlDLVp1a2H8y1pCfdYc+1xQK4txjJqP?= =?us-ascii?Q?wNqtDXgrGt6xBTHt2BpBKGk+Wq8eYFGcsTg85YFu0juP7Wt0XCM0hVjzPoqe?= =?us-ascii?Q?CbTZyBAm8eA3bmLPgjpad/DyPqpsu8zjzs/EnwfqizjLRk3ehCzHTwYgdHmS?= =?us-ascii?Q?qgbUYLdZ6gCALiCq21+0fwSmZsSGrfpoVjCA1Qf0giulQxGb1Yy8DnpikrhA?= =?us-ascii?Q?fM9nwYTJ+Js9UAqz1yyaLTEkpgfkAgYDuEiWlTOWpgV54QNH3VM4DYXjPFPL?= =?us-ascii?Q?WQj96XqvZs559dAdbSafZbUCrP5iSkpNNJvYmnZFMokUQXlI5enm3UBNsZfw?= =?us-ascii?Q?muRhEBu49ZcvvwdLxdS83vd5ZkOBHyHL9Wg4fO3Pz5jMZbsqixP2tFERfOQA?= =?us-ascii?Q?kuHn+RabgVKQ6hRTJRbp4ndd1W1k51HP25tgme2kAb6kjtZB6qPOTrkuZ4xX?= =?us-ascii?Q?NJ1ASs0uEBbz96ftLlc2f7/CdNRD+ABhCq5rzzqs2aOIVbjJTOVLunNzwyr9?= =?us-ascii?Q?f5cudq99a+KKi/08nQNx2V1tDXaBRuQRWeKWW2v8jOeOgG2LtQ16s1j0uoJ+?= =?us-ascii?Q?Xc0Z7esSqxwWlh4CfX5xtOzZfvKNIAk7rhtgd+yUymHeMbqW8oVyQaNXbdc0?= =?us-ascii?Q?1/x+py0SO4o3Yc3n0qnitHoUB8yeYAfeDPh4InYiUWzC6d3Day0y1JfAjuwk?= =?us-ascii?Q?wFGYEp8QJCXrIbPyfAgAoBldBvwOqFQFl5bjJIDglHjHeDiWJ/iDmaP8NnrK?= =?us-ascii?Q?7CV/0ec8Obz0QNsYOr2t+RAANQPPMQSxBcQQzkN6hup+s5MsXEWYgesJtv2Z?= =?us-ascii?Q?KyYMu5IsfWxunfjzVONxokGrnWQrJqPlz4+BezGLx9uLmu6/DCiMGMqGJxeT?= =?us-ascii?Q?rk9OXjxCvTiK58QouV/lboMXQgPvhotG5sSNhk1Zabgpyh3aSUoJIVGN2W6F?= =?us-ascii?Q?uTKJwCTYaRiljrV2Ixl4OVGLfDDx4UgSQ4nmrCmfWVhEJ3yvRj2PjWC2VoOS?= =?us-ascii?Q?T6ykejWusYTbTizZUJ0tcYkDF3wjV5y63PY+rgeQR0cpv3oy+opCPZOAeiSJ?= =?us-ascii?Q?6fouwVF6ecf4X9x1OeqTBc3jnsFKW90HivKVGhMAHhNYRqSAfhuWwlJhUuKO?= =?us-ascii?Q?VBNMUwoa6hXShkIl82DJ/hLUfxrfUm4bgXa+hKZE/vWrXwNd1hboQfe+tsXS?= =?us-ascii?Q?kKX2mAt7D6yqj4MIzU8JkFZKMu5s1F2VbZxMX4lGeYtsD5O32/AWk6fBDvb+?= =?us-ascii?Q?YO0eVWBrMQ=3D=3D?= X-OriginatorOrg: RyomHerold.dk X-MS-Exchange-CrossTenant-Network-Message-Id: edb5f474-a82c-49b9-452b-08df2d15cd46 X-MS-Exchange-CrossTenant-AuthSource: AS8PR10MB7231.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Oct 2026 12:46:17.3390 (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: 0Jl4G60mJP4Hil3dnExXSDj7V0I2Wu+tWBhhbm0KHlsHSBr0RjFUg6HTQO9uyDwK75Ba9jZSgUvjtDdZTZnkkw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR10MB5706 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.003 Adjusted score from AWL reputation of From: address 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 GB_MSAUTHSOURCE_EUROPE 0.01 Mail authenticated via Microsoft Europe (EURP) datacenter RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: PK4Z7UVOKQJ5JZXI3LO7NBZROMX72AXQ X-Message-ID-Hash: PK4Z7UVOKQJ5JZXI3LO7NBZROMX72AXQ 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