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 A277E1FF0C0 for ; Wed, 21 Oct 2026 11:00:53 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 2E0EF21679; Wed, 21 Oct 2026 11:00:05 +0200 (CEST) From: Dominik Rusovac To: pve-devel@lists.proxmox.com Subject: [PATCH pve-ha-manager 11/15] sim: hardware: enable datacenter config changes at runtime Date: Wed, 21 Oct 2026 10:59:28 +0200 Message-ID: <20261021085932.1196302-12-d.rusovac@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261021085932.1196302-1-d.rusovac@proxmox.com> References: <20261021085932.1196302-1-d.rusovac@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1792573177769 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.082 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: FDPOR5XQUGNDSPGAR3D4JQBV4VAF3P7H X-Message-ID-Hash: FDPOR5XQUGNDSPGAR3D4JQBV4VAF3P7H X-MailFrom: d.rusovac@proxmox.com 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 X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: This adds commands to change CRS settings or shutdown policy at test runtime. Signed-off-by: Dominik Rusovac --- src/PVE/HA/Sim/Hardware.pm | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm index e1a9ddd..e75229c 100644 --- a/src/PVE/HA/Sim/Hardware.pm +++ b/src/PVE/HA/Sim/Hardware.pm @@ -59,6 +59,7 @@ my $default_node_maxmem = 131072 * 1024**2; # $testdir/status/service_config Service configuration # $testdir/status/service_status_ Service status # $testdir/status/groups HA groups configuration +# $testdir/status/datacenter.cfg Datacenter wide HA configuration sub read_lrm_status { my ($self, $node) = @_; @@ -699,6 +700,58 @@ sub write_datacenter_conf { PVE::HA::Tools::write_json_to_file($filename, $conf); } +my $datacenter_settings = { + ha => { + shutdown_policy => qr/^(?:conditional|freeze|failover||migrate)$/, + }, + crs => { + ha => qr/^(?:basic|static|dynamic)$/, + 'ha-rebalance-on-start' => qr/^[01]$/, + 'ha-auto-rebalance' => qr/^[01]$/, + 'ha-auto-rebalance-threshold' => qr/^\d+(?:\.\d+)?$/, + 'ha-auto-rebalance-method' => qr/^(?:bruteforce|topsis)$/, + 'ha-auto-rebalance-hold-duration' => qr/^\d+$/, + 'ha-auto-rebalance-margin' => qr/^\d+(?:\.\d+)?$/, + 'ha-auto-rebalance-cpu-weight' => qr/^\d+$/, + 'ha-auto-rebalance-mem-weight' => qr/^\d+$/, + }, +}; + +sub update_datacenter_setting { + my ($self, $section, $action, $key, $value) = @_; + + my $section_props = $datacenter_settings->{$section} + or die "sim_hardware_cmd: unknown datacenter section '$section'\n"; + + die "sim_hardware_cmd: missing property for 'datacenter $section $action' command\n" + if !defined($key); + + my $verifier = $section_props->{$key} + or die "sim_hardware_cmd: unknown datacenter property '$key' in section '$section'\n"; + + my $conf = $self->read_datacenter_conf(); + + if ($action eq 'set') { + die "sim_hardware_cmd: missing value for 'datacenter $section set $key' command\n" + if !defined($value); + die "sim_hardware_cmd: invalid value '$value' for datacenter property '$section.$key'\n" + if $value !~ $verifier; + + $value = $value + 0 if $value =~ m/^\d+(?:\.\d+)?$/; + + $conf->{$section}->{$key} = $value; + } elsif ($action eq 'delete') { + delete $conf->{$section}->{$key} if $conf->{$section}; + delete $conf->{$section} if $conf->{$section} && !%{ $conf->{$section} }; + } else { + die "sim_hardware_cmd: unknown datacenter action '$action'\n"; + } + + $self->write_datacenter_conf($conf); + + return $conf; +} + sub global_lock { my ($self, $code, @param) = @_; @@ -802,6 +855,8 @@ sub get_cfs_state { # service set-static-stats [maxcpu ] [maxmem ] # service set-dynamic-stats [cpu ] [mem ] # service delete +# datacenter set +# datacenter delete sub sim_hardware_cmd { my ($self, $cmdstr, $logid) = @_; @@ -820,6 +875,8 @@ sub sim_hardware_cmd { if ($cmd eq 'service') { $sid = PVE::HA::Tools::pve_verify_ha_resource_id($objid); + } elsif ($cmd eq 'datacenter') { + # cluster-wide, neither node nor service specific } else { $node = $objid; $d = $self->{nodes}->{$node} @@ -1028,6 +1085,11 @@ sub sim_hardware_cmd { die "sim_hardware_cmd: unknown service action '$action' " . "- not implemented\n"; } + } elsif ($cmd eq 'datacenter') { + die "sim_hardware_cmd: missing action for 'datacenter $objid' command\n" + if !defined($action); + + $self->update_datacenter_setting($objid, $action, @params); } else { die "sim_hardware_cmd: unknown command '$cmdstr'\n"; } -- 2.47.3