allows to join clusters with more than the two links/rings we and
corosync supported earlier, further it reduced the special treatment
of link0 a lot.

Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com>
---

new in v2

 data/PVE/API2/ClusterConfig.pm | 37 ++++++++++++++++------------------
 data/PVE/Cluster.pm            | 21 +++++++++++--------
 2 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/data/PVE/API2/ClusterConfig.pm b/data/PVE/API2/ClusterConfig.pm
index e4eeda7..58982b0 100644
--- a/data/PVE/API2/ClusterConfig.pm
+++ b/data/PVE/API2/ClusterConfig.pm
@@ -204,8 +204,7 @@ __PACKAGE__->register_method ({
                description => "Do not throw error if node already exists.",
                optional => 1,
            },
-           link0 => get_standard_option('corosync-link'),
-           link1 => get_standard_option('corosync-link'),
+           %$corosync_link_options,
        },
     },
     returns => {
@@ -250,20 +249,20 @@ __PACKAGE__->register_method ({
                }
            };
 
-           my $link0 = PVE::Cluster::parse_corosync_link($param->{link0});
-           my $link1 = PVE::Cluster::parse_corosync_link($param->{link1});
+           my $links = PVE::Cluster::parse_corosync_links($param);
 
-           $check_duplicate_addr->($link0);
-           $check_duplicate_addr->($link1);
+           for my $id (keys %$links) {
+               die "corosync: using 'link$id' parameter requires an interface 
with linknumber '$id' configured!\n"
+                   if !defined($totem_cfg->{interface}->{$id});
+               $check_duplicate_addr->($links->{$id});
+           }
 
-           # FIXME: handle all links (0-7), they're all independent now
-           $link0->{address} //= $name if exists($totem_cfg->{interface}->{0});
+           for my $id (keys %{$totem_cfg->{interface}}) {
+               die "corosync: totem interface with linknumber $id configured 
but 'link$id' parameter not defined!\n"
+                   if !defined($links->{id});
+           }
 
-           die "corosync: using 'link1' parameter needs a interface with 
linknumber '1' configured!\n"
-               if $link1 && !defined($totem_cfg->{interface}->{1});
-
-           die "corosync: totem interface with linknumber 1 configured but 
'link1' parameter not defined!\n"
-               if defined($totem_cfg->{interface}->{1}) && !defined($link1);
+           $links->{0}->{address} //= $name if 
exists($totem_cfg->{interface}->{0});
 
            if (defined(my $res = $nodelist->{$name})) {
                $param->{nodeid} = $res->{nodeid} if !$param->{nodeid};
@@ -301,11 +300,12 @@ __PACKAGE__->register_method ({
            warn $@ if $@;
 
            $nodelist->{$name} = {
-               ring0_addr => $link0->{address},
                nodeid => $param->{nodeid},
                name => $name,
            };
-           $nodelist->{$name}->{ring1_addr} = $link1->{address} if 
defined($link1);
+           for my $id (keys %$links) {
+               $nodelist->{$name}->{"ring${id}_addr"} = $links->{$id};
+           }
            $nodelist->{$name}->{quorum_votes} = $param->{votes} if 
$param->{votes};
 
            PVE::Cluster::log_msg('notice', 'root@pam', "adding node $name to 
cluster");
@@ -414,7 +414,7 @@ __PACKAGE__->register_method ({
                    properties => {
                        name => get_standard_option('pve-node'),
                        nodeid => get_standard_option('corosync-nodeid'),
-                       link0 => get_standard_option('corosync-link'),
+                       %$corosync_link_options,
                        quorum_votes => { type => 'integer', minimum => 0 },
                        pve_addr => { type => 'string', format => 'ip' },
                        pve_fp => get_standard_option('fingerprint-sha256'),
@@ -484,10 +484,7 @@ __PACKAGE__->register_method ({
                description => "Do not throw error if node already exists.",
                optional => 1,
            },
-           link0 => get_standard_option('corosync-link', {
-               default => "IP resolved by node's hostname",
-           }),
-           link1 => get_standard_option('corosync-link'),
+           %$corosync_link_options,
            fingerprint => get_standard_option('fingerprint-sha256'),
            password => {
                description => "Superuser (root) password of peer node.",
diff --git a/data/PVE/Cluster.pm b/data/PVE/Cluster.pm
index bd7c61b..31a40d3 100644
--- a/data/PVE/Cluster.pm
+++ b/data/PVE/Cluster.pm
@@ -1889,7 +1889,7 @@ sub parse_corosync_links {
 }
 
 sub assert_joinable {
-    my ($local_addr, $link0, $link1, $force) = @_;
+    my ($local_addr, $links, $force) = @_;
 
     my $errors = '';
     my $error = sub { $errors .= "* $_[0]\n"; };
@@ -1932,8 +1932,10 @@ sub assert_joinable {
     };
 
     $check_ip->($local_addr, 'local node address');
-    $check_ip->($link0->{address}, 'ring0') if defined($link0);
-    $check_ip->($link1->{address}, 'ring1') if defined($link1);
+
+    for my $id (keys %$links) {
+       $check_ip->($links->{$id}->{address}, "link${id}");
+    }
 
     if ($errors) {
        warn "detected the following error(s):\n$errors";
@@ -1973,11 +1975,10 @@ sub join {
     my $nodename = PVE::INotify::nodename();
     my $local_ip_address = remote_node_ip($nodename);
 
-    my $link0 = parse_corosync_link($param->{link0});
-    my $link1 = parse_corosync_link($param->{link1});
+    my $links = parse_corosync_links($param);
 
     # check if we can join with the given parameters and current node state
-    assert_joinable($local_ip_address, $link0, $link1, $param->{force});
+    assert_joinable($local_ip_address, $links, $param->{force});
 
     setup_sshd_config();
     setup_rootsshconfig();
@@ -2017,8 +2018,12 @@ sub join {
     $args->{votes} = $param->{votes} if defined($param->{votes});
     # just pass the un-parsed string through, or as we've address as the
     # default_key, we can just pass the fallback directly too
-    $args->{link0} = $param->{link0} // $local_ip_address;
-    $args->{link1} = $param->{link1} if defined($param->{link1});
+
+    $args->{$_} = $param->{$_} for grep { /^link\d+$/ } keys %$param;
+
+    # only set this if no link was passed, as one could theoretically also
+    # just pass link3 if the cluster has historically changed to use that one
+    $args->{link0} //= $local_ip_address if !grep { /^link\d+$/ } keys %$args;
 
     print "Request addition of this node\n";
     my $res = $conn->post("/cluster/config/nodes/$nodename", $args);
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to