On 11/20/19 5:43 PM, Stefan Reiter wrote: > 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.
can we have a APIVERSION and APIAGE ? I.e., APIVERSION for newest feature set and APIAGE for oldest (APIVERSION - APIAGE) still compatible? It has bitten us in storage plugin ABI so I'd like to start here out with this. > > 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; > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel