Add a new package PVE::HA::HashTools to provide helpers for the common operations done on hashes.
These helper subroutines implement basic set operations done on hash sets, which will be used in an upcoming patch for the resource affinity rules. Signed-off-by: Daniel Kral <d.k...@proxmox.com> --- debian/pve-ha-manager.install | 1 + src/PVE/HA/HashTools.pm | 90 +++++++++++++++++++++++++++++++++++ src/PVE/HA/Makefile | 4 +- 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/PVE/HA/HashTools.pm diff --git a/debian/pve-ha-manager.install b/debian/pve-ha-manager.install index b4eff279..79f86d24 100644 --- a/debian/pve-ha-manager.install +++ b/debian/pve-ha-manager.install @@ -27,6 +27,7 @@ /usr/share/perl5/PVE/HA/Fence.pm /usr/share/perl5/PVE/HA/FenceConfig.pm /usr/share/perl5/PVE/HA/Groups.pm +/usr/share/perl5/PVE/HA/HashTools.pm /usr/share/perl5/PVE/HA/LRM.pm /usr/share/perl5/PVE/HA/Manager.pm /usr/share/perl5/PVE/HA/NodeStatus.pm diff --git a/src/PVE/HA/HashTools.pm b/src/PVE/HA/HashTools.pm new file mode 100644 index 00000000..cf5c7a20 --- /dev/null +++ b/src/PVE/HA/HashTools.pm @@ -0,0 +1,90 @@ +package PVE::HA::HashTools; + +use strict; +use warnings; + +use base qw(Exporter); + +our @EXPORT_OK = qw( + set_intersect + set_union + sets_are_disjoint +); + +=head1 NAME + +PVE::HA::HashTools - Helpers for Hashes + +=head1 DESCRIPTION + +This packages provides helpers for common operations on hashes. + +Even though these operations' implementation are often one-liners, they are +meant to improve code readability by stating a operation name instead of the +more verbose implementation. + +=cut + +=head1 FUNCTIONS + +=cut + +=head3 set_intersect($hash1, $hash2) + +Returns a hash set of the intersection of the hash sets C<$hash1> and +C<$hash2>, i.e. the elements that are both in C<$hash1> and C<$hash2>. + +The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e. +key-value pairs are always set to C<1> or another truthy value. + +=cut + +sub set_intersect : prototype($$) { + my ($hash1, $hash2) = @_; + + my $result = { map { $hash1->{$_} && $hash2->{$_} ? ($_ => 1) : () } keys %$hash1 }; + + return $result; +} + +=head3 set_union($hash1, $hash2) + +Returns a hash set of the union of the hash sets C<$hash1> and C<$hash2>, i.e. +the elements that are in either C<$hash1> or C<$hash2>. + +The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e. +key-value pairs are always set to C<1> or another truthy value. + +=cut + +sub set_union : prototype($$) { + my ($hash1, $hash2) = @_; + + my $result = { map { $_ => 1 } keys %$hash1, keys %$hash2 }; + + return $result; +} + +=head3 sets_are_disjoint($hash1, $hash2) + +Checks whether the two given hash sets C<$hash1> and C<$hash2> are disjoint, +i.e. have no common element in both of them. + +The hashes C<$hash1> and C<$hash2> are expected to be hash sets, i.e. +key-value pairs are always set to C<1> or another truthy value. + +Returns C<1> if they are disjoint, C<0> otherwise. + +=cut + +sub sets_are_disjoint : prototype($$) { + my ($hash1, $hash2) = @_; + + for my $key (keys %$hash1) { + return 0 if $hash2->{$key}; + } + + return 1; +} + +1; diff --git a/src/PVE/HA/Makefile b/src/PVE/HA/Makefile index e386cbfc..88629074 100644 --- a/src/PVE/HA/Makefile +++ b/src/PVE/HA/Makefile @@ -1,5 +1,5 @@ -SIM_SOURCES=CRM.pm Env.pm Groups.pm Rules.pm Resources.pm LRM.pm Manager.pm \ - NodeStatus.pm Tools.pm FenceConfig.pm Fence.pm Usage.pm +SIM_SOURCES=CRM.pm Env.pm Groups.pm HashTools.pm Rules.pm Resources.pm LRM.pm \ + Manager.pm NodeStatus.pm Tools.pm FenceConfig.pm Fence.pm Usage.pm SOURCES=${SIM_SOURCES} Config.pm -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel