[pve-devel] [PATCH manager v2] implement checks for ceph version & binaries

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Aug 24 15:44:21 CEST 2017


thanks for v2, looks good!

The single thing I would still change is the die-message if the ceph
version is to old. We strongly go from a specific ceph version to
another in PVE, so the "...or higher..." from the "init" API entry point:

> +	    die "Ceph version luminous or higher is required\n";

line may (or may not, by luck) be wrong. This can be easily fixed up
on/after applying so it does not warrants a v3, IMO.

On 08/24/2017 02:45 PM, Alwin Antreich wrote:
> add version check to ceph init to require luminous or higher and
> fix #1481: check existence of ceph binaries before use
> 
> Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
> ---
>   PVE/API2/Ceph.pm | 17 ++++++++++++++++-
>   PVE/CephTools.pm | 34 +++++++++++++++++++++++++++++-----
>   2 files changed, 45 insertions(+), 6 deletions(-)
> 
> diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm
> index c4d6ffcb..652ab14c 100644
> --- a/PVE/API2/Ceph.pm
> +++ b/PVE/API2/Ceph.pm
> @@ -233,6 +233,8 @@ __PACKAGE__->register_method ({
>   
>   	PVE::CephTools::setup_pve_symlinks();
>   
> +	PVE::CephTools::check_ceph_installed('ceph_osd');
> +
>   	my $bluestore = $param->{bluestore} // 0;
>   
>   	my $journal_dev;
> @@ -827,7 +829,13 @@ __PACKAGE__->register_method ({
>       code => sub {
>   	my ($param) = @_;
>   
> -	PVE::CephTools::check_ceph_installed();
> +	my $version = PVE::CephTools::get_local_version(1);
> +
> +	if (!$version || $version < 12) {
> +	    die "Ceph version luminous or higher is required\n";
> +	} else {
> +	    PVE::CephTools::check_ceph_installed('ceph_bin');
> +	}
>   
>   	# simply load old config if it already exists
>   	my $cfg = PVE::CephTools::parse_ceph_config();
> @@ -982,6 +990,11 @@ __PACKAGE__->register_method ({
>       code => sub {
>   	my ($param) = @_;
>   
> +	PVE::CephTools::check_ceph_installed('ceph_mon');
> +
> +	PVE::CephTools::check_ceph_installed('ceph_mgr')
> +	    if (!$param->{'exclude-manager'});
> +
>   	PVE::CephTools::check_ceph_inited();
>   
>   	PVE::CephTools::setup_pve_symlinks();
> @@ -1220,6 +1233,8 @@ __PACKAGE__->register_method ({
>       code => sub {
>   	my ($param) = @_>   
> +	PVE::CephTools::check_ceph_installed('ceph_mgr');
> +
>   	PVE::CephTools::check_ceph_inited();
>   
>   	my $rpcenv = PVE::RPCEnvironment::get();
> diff --git a/PVE/CephTools.pm b/PVE/CephTools.pm
> index 0c0d7c18..b104b5e8 100644
> --- a/PVE/CephTools.pm
> +++ b/PVE/CephTools.pm
> @@ -20,7 +20,12 @@ my $pve_ckeyring_path = "/etc/pve/priv/$ccname.client.admin.keyring";
>   my $ceph_bootstrap_osd_keyring = "/var/lib/ceph/bootstrap-osd/$ccname.keyring";
>   my $ceph_bootstrap_mds_keyring = "/var/lib/ceph/bootstrap-mds/$ccname.keyring";
>   
> -my $ceph_bin = "/usr/bin/ceph";
> +my $ceph_service = {
> +    ceph_bin => "/usr/bin/ceph",
> +    ceph_mon => "/usr/bin/ceph-mon",
> +    ceph_mgr => "/usr/bin/ceph-mgr",
> +    ceph_osd => "/usr/bin/ceph-osd"
> +};
>   
>   my $config_hash = {
>       ccname => $ccname,
> @@ -32,6 +37,23 @@ my $config_hash = {
>       long_rados_timeout => 60,
>   };
>   
> +sub get_local_version {
> +    my ($noerr) = @_;
> +
> +    if (PVE::CephTools::check_ceph_installed('ceph_bin', $noerr)) {
> +	my $ceph_version;
> +	run_command([$ceph_service->{ceph_bin}, '--version'],
> +	            noerr => $noerr,
> +	            outfunc => sub { $ceph_version = shift; });
> +	if ($ceph_version && $ceph_version =~ /^ceph.*\s((\d+)\.(\d+)\.(\d+))/) {
> +	    # return (version, major, minor, patch) : major;
> +	    return wantarray ? ($1, $2, $3, $4) : $2;
> +	}
> +    }
> +
> +    return undef;
> +}
> +
>   sub get_config {
>       my $key = shift;
>   
> @@ -60,10 +82,12 @@ sub purge_all_ceph_files {
>   }
>   
>   sub check_ceph_installed {
> -    my ($noerr) = @_;
> +    my ($service, $noerr) = @_;
> +
> +    $service = 'ceph_bin' if !defined($service);
>   
> -    if (! -x $ceph_bin) {
> -	die "ceph binaries not installed\n" if !$noerr;
> +    if (! -x $ceph_service->{$service}) {
> +	die "binary not installed: $ceph_service->{$service}\n" if !$noerr;
>   	return undef;
>       }
>   
> @@ -73,7 +97,7 @@ sub check_ceph_installed {
>   sub check_ceph_inited {
>       my ($noerr) = @_;
>   
> -    return undef if !check_ceph_installed($noerr);
> +    return undef if !check_ceph_installed('ceph_bin', $noerr);
>   
>       if (! -f $pve_ceph_cfgpath) {
>   	die "pveceph configuration not initialized\n" if !$noerr;
> 




More information about the pve-devel mailing list