[pve-devel] [RFC cluster v2 06/10] pvecm: add: use API by default

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Dec 6 16:47:24 CET 2017


On 12/06/2017 04:10 PM, Fabian Grünbichler wrote:
> On Mon, Dec 04, 2017 at 12:11:13PM +0100, Thomas Lamprecht wrote:
>> Default to using the API for a add node procedure.
>>
>> But, allow the user to manually fall back to the legacy SSH method.
>> Also fallback if the API detected an not up to date peer.
>> This could be removed in a later release.
>>
>> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
>> ---
>>  data/PVE/CLI/pvecm.pm | 45 +++++++++++++++++++++++++++++++++++++++++++--
>>  1 file changed, 43 insertions(+), 2 deletions(-)
>>
>> diff --git a/data/PVE/CLI/pvecm.pm b/data/PVE/CLI/pvecm.pm
>> index 7aedd3d..07ae0af 100755
>> --- a/data/PVE/CLI/pvecm.pm
>> +++ b/data/PVE/CLI/pvecm.pm
>> @@ -10,7 +10,9 @@ use PVE::Tools qw(run_command);
>>  use PVE::Cluster;
>>  use PVE::INotify;
>>  use PVE::JSONSchema;
>> +use PVE::RPCEnvironment;
>>  use PVE::CLIHandler;
>> +use PVE::PTY;
>>  use PVE::API2::ClusterConfig;
>>  use PVE::Corosync;
>>  
>> @@ -26,6 +28,10 @@ my $dbfile = "$libdir/config.db";
>>  my $authfile = "/etc/corosync/authkey";
>>  
>>  
>> +sub setup_environment {
>> +    PVE::RPCEnvironment->setup_default_cli_env();
>> +}
>> +
>>  __PACKAGE__->register_method ({
>>      name => 'keygen',
>>      path => 'keygen',
>> @@ -253,6 +259,17 @@ __PACKAGE__->register_method ({
>>  		    " needs an valid configured ring 1 interface in the cluster.",
>>  		optional => 1,
>>  	    },
>> +	    fingerprint => {
>> +		description => "SSL certificate fingerprint.",
>> +		type => 'string',
>> +		pattern => '^(:?[A-Z0-9][A-Z0-9]:){31}[A-Z0-9][A-Z0-9]$',
>> +		optional => 1,
>> +	    },
>> +	    'use_ssh' => {
>> +		type => 'boolean',
>> +		description => "Always use SSH to join, even if peer may do it over API.",
>> +		optional => 1,
>> +	    },
>>  	},
>>      },
>>      returns => { type => 'null' },
>> @@ -262,14 +279,38 @@ __PACKAGE__->register_method ({
>>  
>>  	my $nodename = PVE::INotify::nodename();
>>  
>> +	my $host = $param->{hostname};
>> +
>> +	if (!$param->{use_ssh}) {
>> +	    print "Please enter superuser (root) password for '$host':\n";
>> +	    my $password = PVE::PTY::read_password("Password for root\@$host: ");
>> +
>> +	    delete $param->{use_ssh};
>> +	    $param->{password} = $password;
>> +
>> +	    eval { PVE::API2::ClusterConfig->join($param) };
>> +
>> +	    if (my $err = $@) {
>> +		if ($err eq "Cannot use API to join, peer is not up to date!\n") {
>> +		    print "$err\n";
>> +		    print "Do you want to fallback to joining over SSH (yes/no)?\n";
> 
> I don't really like this (checking the error string). since this is CLI
> only, couldn't we just abort and include the pointer to CLI + SSH fall
> back in the ClusterConfig API error message?
> 

I guess we could do that too. Would be even the sterner reminder that
this and the cluster nodes should be on the same version, and its
easier to do - never a bad thing.

> otherwise, we'd need to factor out the version check including API
> Client setup, which is also not very nice..
> 
>> +
>> +		    my $answer = <>;
>> +		    die "OK, abort cluster join.\n" if $answer !~ m/^\s*y(es)?\s*$/i;
>> +		} else {
>> +		    die $err;
>> +		}
>> +	    } else {
>> +		return; # all OK, the API joint endpoint successfully set us up
>> +	    }
>> +	}
>> +
>>  	PVE::Cluster::setup_sshd_config();
>>  	PVE::Cluster::setup_rootsshconfig();
>>  	PVE::Cluster::setup_ssh_keys();
>>  
>>  	PVE::Cluster::assert_joinable($param->{ring0_addr}, $param->{ring1_addr}, $param->{force});
>>  
>> -	my $host = $param->{hostname};
>> -
>>  	# make sure known_hosts is on local filesystem
>>  	PVE::Cluster::ssh_unmerge_known_hosts();
>>  
>> -- 
>> 2.11.0





More information about the pve-devel mailing list