move Storage/CephTools to CephConfig

it is not a storage plugin, and it makes more sense to have it
top-level, but there we cannot name it CephTools because of the
existing ones in pve-manager

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak
2018-12-19 11:24:39 +01:00
committed by Thomas Lamprecht
parent 36d4af9ba8
commit 4050fcc16b
5 changed files with 17 additions and 16 deletions

View File

@ -11,16 +11,16 @@ use PVE::Tools qw(run_command);
use PVE::ProcFSTools;
use PVE::Storage::Plugin;
use PVE::JSONSchema qw(get_standard_option);
use PVE::Storage::CephTools;
use PVE::CephConfig;
use base qw(PVE::Storage::Plugin);
sub cephfs_is_mounted {
my ($scfg, $storeid, $mountdata) = @_;
my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
my $configfile = $cmd_option->{ceph_conf};
my $server = $cmd_option->{mon_host} // PVE::Storage::CephTools::get_monaddr_list($configfile);
my $server = $cmd_option->{mon_host} // PVE::CephConfig::get_monaddr_list($configfile);
my $subdir = $scfg->{subdir} // '/';
my $mountpoint = $scfg->{path};
@ -46,10 +46,10 @@ sub cephfs_mount {
my $mountpoint = $scfg->{path};
my $subdir = $scfg->{subdir} // '/';
my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
my $configfile = $cmd_option->{ceph_conf};
my $secretfile = $cmd_option->{keyring};
my $server = $cmd_option->{mon_host} // PVE::Storage::CephTools::get_monaddr_list($configfile);
my $server = $cmd_option->{mon_host} // PVE::CephConfig::get_monaddr_list($configfile);
# fuse -> client-enforced quotas (kernel doesn't), updates w/ ceph-fuse pkg
# kernel -> better performance, less frequent updates
@ -137,7 +137,7 @@ sub on_add_hook {
return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
PVE::Storage::CephTools::ceph_create_keyfile($scfg->{type}, $storeid);
PVE::CephConfig::ceph_create_keyfile($scfg->{type}, $storeid);
}
sub on_delete_hook {
@ -145,7 +145,7 @@ sub on_delete_hook {
return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
PVE::Storage::CephTools::ceph_remove_keyfile($scfg->{type}, $storeid);
PVE::CephConfig::ceph_remove_keyfile($scfg->{type}, $storeid);
}
sub status {

View File

@ -1,179 +0,0 @@
package PVE::Storage::CephTools;
use strict;
use warnings;
use Net::IP;
use PVE::Tools qw(run_command);
my $parse_ceph_file = sub {
my ($filename) = @_;
my $cfg = {};
return $cfg if ! -f $filename;
my $content = PVE::Tools::file_get_contents($filename);
my @lines = split /\n/, $content;
my $section;
foreach my $line (@lines) {
$line =~ s/[;#].*$//;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
next if !$line;
$section = $1 if $line =~ m/^\[(\S+)\]$/;
if (!$section) {
warn "no section - skip: $line\n";
next;
}
if ($line =~ m/^(.*?\S)\s*=\s*(\S.*)$/) {
$cfg->{$section}->{$1} = $2;
}
}
return $cfg;
};
my $ceph_get_key = sub {
my ($keyfile, $username) = @_;
my $key = $parse_ceph_file->($keyfile);
my $secret = $key->{"client.$username"}->{key};
return $secret;
};
sub get_monaddr_list {
my ($configfile) = shift;
my $server;
if (!defined($configfile)) {
warn "No ceph config specified\n";
return;
}
my $config = $parse_ceph_file->($configfile);
@$server = sort map { $config->{$_}->{'mon addr'} } grep {/mon/} %{$config};
return join(',', @$server);
};
sub hostlist {
my ($list_text, $separator) = @_;
my @monhostlist = PVE::Tools::split_list($list_text);
return join($separator, map {
my ($host, $port) = PVE::Tools::parse_host_and_port($_);
$port = defined($port) ? ":$port" : '';
$host = "[$host]" if Net::IP::ip_is_ipv6($host);
"${host}${port}"
} @monhostlist);
}
my $ceph_check_keyfile = sub {
my ($filename, $type) = @_;
return if ! -f $filename;
my $content = PVE::Tools::file_get_contents($filename);
eval {
die if !$content;
if ($type eq 'rbd') {
die if $content !~ /\s*\[\S+\]\s*key\s*=\s*\S+==\s*$/m;
} elsif ($type eq 'cephfs') {
die if $content !~ /\S+==\s*$/;
}
};
die "Not a proper $type authentication file: $filename\n" if $@;
return undef;
};
sub ceph_connect_option {
my ($scfg, $storeid, %options) = @_;
my $cmd_option = {};
my $ceph_storeid_conf = "/etc/pve/priv/ceph/${storeid}.conf";
my $pveceph_config = '/etc/pve/ceph.conf';
my $keyfile = "/etc/pve/priv/ceph/${storeid}.keyring";
$keyfile = "/etc/pve/priv/ceph/${storeid}.secret" if ($scfg->{type} eq 'cephfs');
my $pveceph_managed = !defined($scfg->{monhost});
$cmd_option->{ceph_conf} = $pveceph_config if $pveceph_managed;
$ceph_check_keyfile->($keyfile, $scfg->{type});
if (-e $ceph_storeid_conf) {
if ($pveceph_managed) {
warn "ignoring custom ceph config for storage '$storeid', 'monhost' is not set (assuming pveceph managed cluster)!\n";
} else {
$cmd_option->{ceph_conf} = $ceph_storeid_conf;
}
}
$cmd_option->{keyring} = $keyfile if (-e $keyfile);
$cmd_option->{auth_supported} = (defined $cmd_option->{keyring}) ? 'cephx' : 'none';
$cmd_option->{userid} = $scfg->{username} ? $scfg->{username} : 'admin';
$cmd_option->{mon_host} = hostlist($scfg->{monhost}, ',') if (defined($scfg->{monhost}));
if (%options) {
foreach my $k (keys %options) {
$cmd_option->{$k} = $options{$k};
}
}
return $cmd_option;
}
sub ceph_create_keyfile {
my ($type, $storeid) = @_;
my $extension = 'keyring';
$extension = 'secret' if ($type eq 'cephfs');
my $ceph_admin_keyring = '/etc/pve/priv/ceph.client.admin.keyring';
my $ceph_storage_keyring = "/etc/pve/priv/ceph/${storeid}.$extension";
die "ceph authx keyring file for storage '$storeid' already exists!\n"
if -e $ceph_storage_keyring;
if (-e $ceph_admin_keyring) {
eval {
if ($type eq 'rbd') {
mkdir '/etc/pve/priv/ceph';
PVE::Tools::file_copy($ceph_admin_keyring, $ceph_storage_keyring);
} elsif ($type eq 'cephfs') {
my $secret = $ceph_get_key->($ceph_admin_keyring, 'admin');
mkdir '/etc/pve/priv/ceph';
PVE::Tools::file_set_contents($ceph_storage_keyring, $secret, 0400);
}
};
if (my $err = $@) {
unlink $ceph_storage_keyring;
die "failed to copy ceph authx $extension for storage '$storeid': $err\n";
}
} else {
warn "$ceph_admin_keyring not found, authentication is disabled.\n";
}
}
sub ceph_remove_keyfile {
my ($type, $storeid) = @_;
my $extension = 'keyring';
$extension = 'secret' if ($type eq 'cephfs');
my $ceph_storage_keyring = "/etc/pve/priv/ceph/${storeid}.$extension";
if (-f $ceph_storage_keyring) {
unlink($ceph_storage_keyring) or warn "removing keyring of storage failed: $!\n";
}
}
1;

View File

@ -1,4 +1,4 @@
SOURCES=Plugin.pm DirPlugin.pm LVMPlugin.pm NFSPlugin.pm CIFSPlugin.pm ISCSIPlugin.pm CephFSPlugin.pm RBDPlugin.pm CephTools.pm SheepdogPlugin.pm ISCSIDirectPlugin.pm GlusterfsPlugin.pm ZFSPoolPlugin.pm ZFSPlugin.pm DRBDPlugin.pm LvmThinPlugin.pm
SOURCES=Plugin.pm DirPlugin.pm LVMPlugin.pm NFSPlugin.pm CIFSPlugin.pm ISCSIPlugin.pm CephFSPlugin.pm RBDPlugin.pm SheepdogPlugin.pm ISCSIDirectPlugin.pm GlusterfsPlugin.pm ZFSPoolPlugin.pm ZFSPlugin.pm DRBDPlugin.pm LvmThinPlugin.pm
.PHONY: install
install:

View File

@ -8,7 +8,7 @@ use PVE::Tools qw(run_command trim);
use PVE::Storage::Plugin;
use PVE::JSONSchema qw(get_standard_option);
use PVE::RADOS;
use PVE::Storage::CephTools;
use PVE::CephConfig;
use JSON;
use base qw(PVE::Storage::Plugin);
@ -30,7 +30,7 @@ my $add_pool_to_disk = sub {
my $build_cmd = sub {
my ($binary, $scfg, $storeid, $op, @options) = @_;
my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
my $pool = $scfg->{pool} ? $scfg->{pool} : 'rbd';
my $cmd = [$binary, '-p', $pool];
@ -63,7 +63,7 @@ my $rados_cmd = sub {
my $librados_connect = sub {
my ($scfg, $storeid, $options) = @_;
my $librados_config = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
my $librados_config = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
my $rados = PVE::RADOS->new(%$librados_config);
@ -283,7 +283,7 @@ sub on_add_hook {
return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
PVE::Storage::CephTools::ceph_create_keyfile($scfg->{type}, $storeid);
PVE::CephConfig::ceph_create_keyfile($scfg->{type}, $storeid);
}
sub on_delete_hook {
@ -291,7 +291,7 @@ sub on_delete_hook {
return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
PVE::Storage::CephTools::ceph_remove_keyfile($scfg->{type}, $storeid);
PVE::CephConfig::ceph_remove_keyfile($scfg->{type}, $storeid);
}
sub parse_volname {
@ -307,7 +307,7 @@ sub parse_volname {
sub path {
my ($class, $scfg, $volname, $storeid, $snapname) = @_;
my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
$name .= '@'.$snapname if $snapname;
@ -318,7 +318,7 @@ sub path {
$path .= ":conf=$cmd_option->{ceph_conf}" if $cmd_option->{ceph_conf};
if (defined($scfg->{monhost})) {
my $monhost = PVE::Storage::CephTools::hostlist($scfg->{monhost}, ';');
my $monhost = PVE::CephConfig::hostlist($scfg->{monhost}, ';');
$monhost =~ s/:/\\:/g;
$path .= ":mon_host=$monhost";
$path .= ":auth_supported=$cmd_option->{auth_supported}";