Returns all relevant information for joining this cluster over the current connected node securely over the API: wrapped in the corosync nodelist are address and fingerprint of the node, further totem config section and (not directly needed but possibly useful) cluster configuration digest are passed.
Signed-off-by: Thomas Lamprecht <[email protected]> --- changes v4 -> v5: * return the information of all known cluster nodes * thus use array as return type, this allows to still verify the returned data * pass the preferred node, if explicitly pass * add checks, i.e., is a cluster configured and is the passed node a known member data/PVE/API2/ClusterConfig.pm | 69 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/data/PVE/API2/ClusterConfig.pm b/data/PVE/API2/ClusterConfig.pm index 8c88a17..9c1a038 100644 --- a/data/PVE/API2/ClusterConfig.pm +++ b/data/PVE/API2/ClusterConfig.pm @@ -396,6 +396,74 @@ __PACKAGE__->register_method ({ }}); __PACKAGE__->register_method ({ + name => 'join_info', + path => 'join', + method => 'GET', + description => "Get information needed to join this cluster over the connected node.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node', { + description => "The node for which the joinee gets the nodeinfo. ", + default => "current connected node", + optional => 1, + }), + }, + }, + returns => { + type => 'object', + additionalProperties => 0, + properties => { + nodelist => { + type => 'array', + items => { + type => "object", + additionalProperties => 1, + properties => { + pve_addr => { type => 'string', format => 'ip' }, + pve_fp => get_standard_option('fingerprint-sha256'), + }, + }, + }, + prefered_node => get_standard_option('pve-node'), + totem => { type => 'object' }, + config_digest => { type => 'string' }, + }, + }, + code => sub { + my ($param) = @_; + + my $nodename = $param->{node} // PVE::INotify::nodename(); + + PVE::Cluster::cfs_update(1); + my $conf = PVE::Cluster::cfs_read_file('corosync.conf'); + + die "node is not in a cluster, no join info available!\n" + if !($conf && $conf->{main}); + + my $totem_cfg = $conf->{main}->{totem} // {}; + my $nodelist = $conf->{main}->{nodelist}->{node} // {}; + my $corosync_config_digest = $conf->{digest}; + + die "unknown node '$nodename'\n" if ! $nodelist->{$nodename}; + + foreach my $name (keys %$nodelist) { + my $node = $nodelist->{$name}; + $node->{pve_fp} = PVE::Cluster::get_node_fingerprint($name); + $node->{pve_addr} = scalar(PVE::Cluster::remote_node_ip($name)); + } + + my $res = { + nodelist => [ values %$nodelist ], + preferred_node => $nodename, + totem => $totem_cfg, + config_digest => $corosync_config_digest, + }; + + return $res; + }}); + +__PACKAGE__->register_method ({ name => 'join', path => 'join', method => 'POST', -- 2.11.0 _______________________________________________ pve-devel mailing list [email protected] https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
