[pve-devel] [PATCH cluster v2 4/7] corosync: transform config to allow easier access

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Sep 14 10:00:38 CEST 2017


Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 data/PVE/Corosync.pm | 64 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 36 insertions(+), 28 deletions(-)

diff --git a/data/PVE/Corosync.pm b/data/PVE/Corosync.pm
index 3c4c8c0..1180316 100644
--- a/data/PVE/Corosync.pm
+++ b/data/PVE/Corosync.pm
@@ -15,6 +15,29 @@ my $conf_array_sections = {
     interface => 1,
 };
 
+my $transform_section_to_hash = sub {
+    my ($section, $id_key) = @_;
+
+    my $transformed = {};
+    foreach my $v (@$section) {
+	my $key = $v->{$id_key} // die "section entry misses index key '$id_key'\n";
+	$transformed->{$key} = $v;
+    }
+
+    return $transformed;
+};
+
+my $transform_hash_to_section = sub {
+    my ($hash) = @_;
+
+    my $transformed = [];
+    foreach my $k (sort keys %$hash) {
+	push @$transformed, $hash->{$k};
+    }
+
+    return $transformed;
+};
+
 # a very simply parser ...
 sub parse_conf {
     my ($filename, $raw) = @_;
@@ -70,6 +93,10 @@ sub parse_conf {
 	$section->{$key} = $value;
     }
 
+    # makes working with the config way more easier
+    $conf->{main}->{nodelist}->{node} = &$transform_section_to_hash($conf->{main}->{nodelist}->{node}, 'name');
+    $conf->{main}->{totem}->{interface} = &$transform_section_to_hash($conf->{main}->{totem}->{interface}, 'ringnumber');
+
     $conf->{digest} = $digest;
 
     return $conf;
@@ -108,9 +135,13 @@ $dump_section = sub {
 sub write_conf {
     my ($filename, $conf) = @_;
 
-    die "no main section" if !defined($conf->{main});
+    my $c = clone($conf->{main}) // die "no main section";
 
-    my $raw = &$dump_section($conf->{main}, '');
+    # retransform back for easier dumping
+    $c->{nodelist}->{node} = &$transform_hash_to_section($c->{nodelist}->{node});
+    $c->{totem}->{interface} = &$transform_hash_to_section($c->{totem}->{interface});
+
+    my $raw = &$dump_section($c, '');
 
     return $raw;
 }
@@ -156,7 +187,7 @@ sub update_nodelist {
     my $version = conf_version($conf);
     conf_version($conf, undef, $version + 1);
 
-    $conf->{main}->{nodelist}->{node} = [values %$nodelist];
+    $conf->{main}->{nodelist}->{node} = $nodelist;
 
     PVE::Cluster::cfs_write_file("corosync.conf.new", $conf);
 
@@ -166,35 +197,12 @@ sub update_nodelist {
 
 sub nodelist {
     my ($conf) = @_;
-
-    my $nodelist = {};
-
-    my $nodes = $conf->{main}->{nodelist}->{node};
-
-    foreach my $node (@$nodes) {
-	# use 'name' over 'ring0_addr' if set
-	my $name = $node->{name} // $node->{ring0_addr};
-	if ($name) {
-	    $nodelist->{$name} = $node;
-	}
-    }
-
-    return $nodelist;
+    return clone($conf->{main}->{nodelist}->{node});
 }
 
 sub totem_config {
     my ($conf) = @_;
-
-    # we reorder elements from totem->interface and don't want to change $conf
-    my $totem = clone($conf->{main}->{totem});
-    my $ifs = $totem->{interface};
-
-    $totem->{interface} = {};
-    foreach my $if (@$ifs) {
-	$totem->{interface}->{$if->{ringnumber}} = $if;
-    }
-
-    return $totem;
+    return clone($conf->{main}->{totem});
 }
 
 1;
-- 
2.11.0





More information about the pve-devel mailing list