Adds API call GET /cluster/config/apiversion to retrieve remote clusters join-API version (0 is assumed for versions without this endpoint).
Warn user if remote version differs, and select new fallback method only if available. This ensures full compatibility between nodes/clusters with and without new fallback behaviour. Signed-off-by: Stefan Reiter <s.rei...@proxmox.com> --- Technically optional, but needed to ensure full compatibility across versions before and after this series. data/PVE/API2/ClusterConfig.pm | 18 ++++++++++++++++++ data/PVE/Cluster/Setup.pm | 16 ++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/data/PVE/API2/ClusterConfig.pm b/data/PVE/API2/ClusterConfig.pm index 2d15f97..bff0c48 100644 --- a/data/PVE/API2/ClusterConfig.pm +++ b/data/PVE/API2/ClusterConfig.pm @@ -58,11 +58,29 @@ __PACKAGE__->register_method({ { name => 'totem' }, { name => 'join' }, { name => 'qdevice' }, + { name => 'apiversion' }, ]; return $result; }}); +__PACKAGE__->register_method ({ + name => 'join_api_version', + path => 'apiversion', + method => 'GET', + description => "Return the version of the cluster join API available on this node.", + permissions => { + check => ['perm', '/', [ 'Sys.Audit' ]], + }, + parameters => { + additionalProperties => 0, + properties => {}, + }, + returns => { type => 'integer' }, + code => sub { + return PVE::Cluster::Setup::JOIN_API_VERSION; + }}); + __PACKAGE__->register_method ({ name => 'create', path => '', diff --git a/data/PVE/Cluster/Setup.pm b/data/PVE/Cluster/Setup.pm index 9850299..c6f6c9e 100644 --- a/data/PVE/Cluster/Setup.pm +++ b/data/PVE/Cluster/Setup.pm @@ -19,6 +19,8 @@ use PVE::JSONSchema; use PVE::Network; use PVE::Tools; +use constant JOIN_API_VERSION => 1; + my $pmxcfs_base_dir = PVE::Cluster::base_dir(); my $pmxcfs_auth_dir = PVE::Cluster::auth_dir(); @@ -660,6 +662,13 @@ sub join { # login raises an exception on failure, so if we get here we're good print "Login succeeded.\n"; + # check cluster join API version and warn user + my $apiver = eval { $conn->get("/cluster/config/apiversion"); } // 0; + warn "warning: local join API version (" . JOIN_API_VERSION . ") differs" + . " from remote ($apiver), make sure all nodes are upgraded to the" + . " latest version. Cluster join might fail!\n" + if $apiver != JOIN_API_VERSION; + my $args = {}; $args->{force} = $param->{force} if defined($param->{force}); $args->{nodeid} = $param->{nodeid} if $param->{nodeid}; @@ -668,8 +677,11 @@ sub join { $args->{"link$link"} = PVE::Corosync::print_corosync_link($links->{$link}); } - # this will be used as fallback if no links are specified - $args->{new_node_ip} = $local_ip_address; + # specify fallback if no links are given according to remote api version + if (!%$links) { + $args->{link0} = $local_ip_address if $apiver == 0; + $args->{new_node_ip} = $local_ip_address if $apiver >= 1; + } print "No local links given, will attempt fallback to $local_ip_address\n" if !%$links; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel