From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id ECFE31FF164 for <inbox@lore.proxmox.com>; Fri, 20 Jun 2025 16:32:01 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id ECC51DB3C; Fri, 20 Jun 2025 16:32:08 +0200 (CEST) From: Daniel Kral <d.kral@proxmox.com> To: pve-devel@lists.proxmox.com Date: Fri, 20 Jun 2025 16:31:19 +0200 Message-Id: <20250620143148.218469-12-d.kral@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250620143148.218469-1-d.kral@proxmox.com> References: <20250620143148.218469-1-d.kral@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.011 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 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 ha-manager v2 07/26] config, env, hw: add rules read and parse methods X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> Adds methods to the HA environment to read and write the rules configuration file for the different environment implementations. Signed-off-by: Daniel Kral <d.kral@proxmox.com> --- changes since v1: - reorder use statements - use property isolation for the rules plugin - introduce `read_and_check_rules_config()` to add rule defaults - add rule defaults also for the test/simulator environment src/PVE/HA/Config.pm | 30 ++++++++++++++++++++++++++++++ src/PVE/HA/Env.pm | 6 ++++++ src/PVE/HA/Env/PVE2.pm | 14 ++++++++++++++ src/PVE/HA/Sim/Env.pm | 16 ++++++++++++++++ src/PVE/HA/Sim/Hardware.pm | 21 +++++++++++++++++++++ 5 files changed, 87 insertions(+) diff --git a/src/PVE/HA/Config.pm b/src/PVE/HA/Config.pm index ec9360e..012ae16 100644 --- a/src/PVE/HA/Config.pm +++ b/src/PVE/HA/Config.pm @@ -7,12 +7,14 @@ use JSON; use PVE::HA::Tools; use PVE::HA::Groups; +use PVE::HA::Rules; use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file); use PVE::HA::Resources; my $manager_status_filename = "ha/manager_status"; my $ha_groups_config = "ha/groups.cfg"; my $ha_resources_config = "ha/resources.cfg"; +my $ha_rules_config = "ha/rules.cfg"; my $crm_commands_filename = "ha/crm_commands"; my $ha_fence_config = "ha/fence.cfg"; @@ -31,6 +33,11 @@ cfs_register_file( sub { PVE::HA::Resources->parse_config(@_); }, sub { PVE::HA::Resources->write_config(@_); }, ); +cfs_register_file( + $ha_rules_config, + sub { PVE::HA::Rules->parse_config(@_); }, + sub { PVE::HA::Rules->write_config(@_); }, +); cfs_register_file($manager_status_filename, \&json_reader, \&json_writer); cfs_register_file( $ha_fence_config, @@ -197,6 +204,29 @@ sub parse_sid { return wantarray ? ($sid, $type, $name) : $sid; } +sub read_rules_config { + + return cfs_read_file($ha_rules_config); +} + +sub read_and_check_rules_config { + + my $rules = cfs_read_file($ha_rules_config); + + # set optional rule parameter's default values + for my $rule (values %{ $rules->{ids} }) { + PVE::HA::Rules->set_rule_defaults($rule); + } + + return $rules; +} + +sub write_rules_config { + my ($cfg) = @_; + + cfs_write_file($ha_rules_config, $cfg); +} + sub read_group_config { return cfs_read_file($ha_groups_config); diff --git a/src/PVE/HA/Env.pm b/src/PVE/HA/Env.pm index 285e440..5cee7b3 100644 --- a/src/PVE/HA/Env.pm +++ b/src/PVE/HA/Env.pm @@ -131,6 +131,12 @@ sub steal_service { return $self->{plug}->steal_service($sid, $current_node, $new_node); } +sub read_rules_config { + my ($self) = @_; + + return $self->{plug}->read_rules_config(); +} + sub read_group_config { my ($self) = @_; diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm index b709f30..1beba7d 100644 --- a/src/PVE/HA/Env/PVE2.pm +++ b/src/PVE/HA/Env/PVE2.pm @@ -22,12 +22,20 @@ use PVE::HA::FenceConfig; use PVE::HA::Resources; use PVE::HA::Resources::PVEVM; use PVE::HA::Resources::PVECT; +use PVE::HA::Rules; +use PVE::HA::Rules::Location; +use PVE::HA::Rules::Colocation; PVE::HA::Resources::PVEVM->register(); PVE::HA::Resources::PVECT->register(); PVE::HA::Resources->init(); +PVE::HA::Rules::Location->register(); +PVE::HA::Rules::Colocation->register(); + +PVE::HA::Rules->init(property_isolation => 1); + my $lockdir = "/etc/pve/priv/lock"; sub new { @@ -189,6 +197,12 @@ sub steal_service { $self->cluster_state_update(); } +sub read_rules_config { + my ($self) = @_; + + return PVE::HA::Config::read_and_check_rules_config(); +} + sub read_group_config { my ($self) = @_; diff --git a/src/PVE/HA/Sim/Env.pm b/src/PVE/HA/Sim/Env.pm index d892a00..fc16d3e 100644 --- a/src/PVE/HA/Sim/Env.pm +++ b/src/PVE/HA/Sim/Env.pm @@ -10,6 +10,9 @@ use Fcntl qw(:DEFAULT :flock); use PVE::HA::Tools; use PVE::HA::Env; use PVE::HA::Resources; +use PVE::HA::Rules; +use PVE::HA::Rules::Location; +use PVE::HA::Rules::Colocation; use PVE::HA::Sim::Resources::VirtVM; use PVE::HA::Sim::Resources::VirtCT; use PVE::HA::Sim::Resources::VirtFail; @@ -20,6 +23,11 @@ PVE::HA::Sim::Resources::VirtFail->register(); PVE::HA::Resources->init(); +PVE::HA::Rules::Location->register(); +PVE::HA::Rules::Colocation->register(); + +PVE::HA::Rules->init(property_isolation => 1); + sub new { my ($this, $nodename, $hardware, $log_id) = @_; @@ -245,6 +253,14 @@ sub exec_fence_agent { return $self->{hardware}->exec_fence_agent($agent, $node, @param); } +sub read_rules_config { + my ($self) = @_; + + $assert_cfs_can_rw->($self); + + return $self->{hardware}->read_rules_config(); +} + sub read_group_config { my ($self) = @_; diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm index 576527d..89dbdfa 100644 --- a/src/PVE/HA/Sim/Hardware.pm +++ b/src/PVE/HA/Sim/Hardware.pm @@ -28,6 +28,7 @@ my $watchdog_timeout = 60; # $testdir/cmdlist Command list for simulation # $testdir/hardware_status Hardware description (number of nodes, ...) # $testdir/manager_status CRM status (start with {}) +# $testdir/rules_config Contraints / Rules configuration # $testdir/service_config Service configuration # $testdir/static_service_stats Static service usage information (cpu, memory) # $testdir/groups HA groups configuration @@ -319,6 +320,22 @@ sub read_crm_commands { return $self->global_lock($code); } +sub read_rules_config { + my ($self) = @_; + + my $filename = "$self->{statusdir}/rules_config"; + my $raw = ''; + $raw = PVE::Tools::file_get_contents($filename) if -f $filename; + my $rules = PVE::HA::Rules->parse_config($filename, $raw); + + # set optional rule parameter's default values + for my $rule (values %{ $rules->{ids} }) { + PVE::HA::Rules->set_rule_defaults($rule); + } + + return $rules; +} + sub read_group_config { my ($self) = @_; @@ -391,6 +408,10 @@ sub new { # copy initial configuartion copy("$testdir/manager_status", "$statusdir/manager_status"); # optional + if (-f "$testdir/rules_config") { + copy("$testdir/rules_config", "$statusdir/rules_config"); + } + if (-f "$testdir/groups") { copy("$testdir/groups", "$statusdir/groups"); } else { -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel