Commit 1ee65aec authored by Dietmar Maurer's avatar Dietmar Maurer

use PVE::RADOS perl bindings

parent f481098d
...@@ -21,6 +21,7 @@ use PVE::RESTHandler; ...@@ -21,6 +21,7 @@ use PVE::RESTHandler;
use PVE::RPCEnvironment; use PVE::RPCEnvironment;
use PVE::JSONSchema qw(get_standard_option); use PVE::JSONSchema qw(get_standard_option);
use JSON; use JSON;
use PVE::RADOS;
use base qw(PVE::RESTHandler); use base qw(PVE::RESTHandler);
...@@ -128,59 +129,6 @@ my $parse_ceph_config = sub { ...@@ -128,59 +129,6 @@ my $parse_ceph_config = sub {
return $cfg; return $cfg;
}; };
my $run_ceph_cmd = sub {
my ($cmd, %params) = @_;
my $timeout = 5;
run_command(['ceph', '-c', $pve_ceph_cfgpath,
'--connect-timeout', $timeout,
@$cmd], %params);
};
my $run_ceph_cmd_text = sub {
my ($cmd, %opts) = @_;
my $out = '';
my $quiet = delete $opts{quiet};
my $parser = sub {
my $line = shift;
$out .= "$line\n";
};
my $errfunc = sub {
my $line = shift;
print "$line\n" if !$quiet;
};
&$run_ceph_cmd($cmd, outfunc => $parser, errfunc => $errfunc);
return $out;
};
my $run_ceph_cmd_json = sub {
my ($cmd, %opts) = @_;
my $json = &$run_ceph_cmd_text([@$cmd, '--format', 'json'], %opts);
return decode_json($json);
};
sub ceph_mon_status {
my ($quiet) = @_;
return &$run_ceph_cmd_json(['mon_status'], quiet => $quiet);
}
my $ceph_osd_status = sub {
my ($quiet) = @_;
return &$run_ceph_cmd_json(['osd', 'dump'], quiet => $quiet);
};
my $write_ceph_config = sub { my $write_ceph_config = sub {
my ($cfg) = @_; my ($cfg) = @_;
...@@ -568,7 +516,8 @@ __PACKAGE__->register_method ({ ...@@ -568,7 +516,8 @@ __PACKAGE__->register_method ({
} }
eval { eval {
my $monstat = ceph_mon_status(); my $rados = PVE::RADOS::new();
my $monstat = $rados->mon_command({ prefix => 'mon_status' });
my $mons = $monstat->{monmap}->{mons}; my $mons = $monstat->{monmap}->{mons};
foreach my $d (@$mons) { foreach my $d (@$mons) {
next if !defined($d->{name}); next if !defined($d->{name});
...@@ -785,8 +734,9 @@ __PACKAGE__->register_method ({ ...@@ -785,8 +734,9 @@ __PACKAGE__->register_method ({
mkdir $mondir; mkdir $mondir;
if ($moncount > 0) { if ($moncount > 0) {
my $monstat = ceph_mon_status(); # online test my $rados = PVE::RADOS::new();
&$run_ceph_cmd(['mon', 'getmap', '-o', $monmap]); my $mapdata = $rados->mon_command({ prefix => 'mon getmap', format => 'plain' });
PVE::Tools::file_set_contents($monmap, $mapdata);
} else { } else {
run_command("monmaptool --create --clobber --add $monid $monaddr --print $monmap"); run_command("monmaptool --create --clobber --add $monid $monaddr --print $monmap");
} }
...@@ -845,13 +795,13 @@ __PACKAGE__->register_method ({ ...@@ -845,13 +795,13 @@ __PACKAGE__->register_method ({
my $monid = $param->{monid}; my $monid = $param->{monid};
my $monsection = "mon.$monid"; my $monsection = "mon.$monid";
my $monstat = ceph_mon_status(); my $rados = PVE::RADOS::new();
my $monstat = $rados->mon_command({ prefix => 'mon_status' });
my $monlist = $monstat->{monmap}->{mons}; my $monlist = $monstat->{monmap}->{mons};
die "no such monitor id '$monid'\n" die "no such monitor id '$monid'\n"
if !defined($cfg->{$monsection}); if !defined($cfg->{$monsection});
my $mondir = "/var/lib/ceph/mon/$ccname-$monid"; my $mondir = "/var/lib/ceph/mon/$ccname-$monid";
-d $mondir || die "monitor filesystem '$mondir' does not exist on this node\n"; -d $mondir || die "monitor filesystem '$mondir' does not exist on this node\n";
...@@ -860,7 +810,7 @@ __PACKAGE__->register_method ({ ...@@ -860,7 +810,7 @@ __PACKAGE__->register_method ({
my $worker = sub { my $worker = sub {
my $upid = shift; my $upid = shift;
&$run_ceph_cmd(['mon', 'remove', $monid]); $rados->mon_command({ prefix => "mon remove", name => $monid });
eval { &$ceph_service_cmd('stop', $monsection); }; eval { &$ceph_service_cmd('stop', $monsection); };
warn $@ if $@; warn $@ if $@;
...@@ -986,7 +936,8 @@ __PACKAGE__->register_method ({ ...@@ -986,7 +936,8 @@ __PACKAGE__->register_method ({
&$check_ceph_enabled(); &$check_ceph_enabled();
return &$run_ceph_cmd_json(['status'], quiet => 1); my $rados = PVE::RADOS::new();
return $rados->mon_command({ prefix => 'status' });
}}); }});
__PACKAGE__->register_method ({ __PACKAGE__->register_method ({
...@@ -1019,7 +970,8 @@ __PACKAGE__->register_method ({ ...@@ -1019,7 +970,8 @@ __PACKAGE__->register_method ({
&$check_ceph_inited(); &$check_ceph_inited();
my $res = &$run_ceph_cmd_json(['osd', 'dump'], quiet => 1); my $rados = PVE::RADOS::new();
my $res = $rados->mon_command({ prefix => 'osd dump' });
my $data = []; my $data = [];
foreach my $e (@{$res->{pools}}) { foreach my $e (@{$res->{pools}}) {
...@@ -1094,15 +1046,38 @@ __PACKAGE__->register_method ({ ...@@ -1094,15 +1046,38 @@ __PACKAGE__->register_method ({
my $pg_num = $param->{pg_num} || 64; my $pg_num = $param->{pg_num} || 64;
my $size = $param->{size} || 2; my $size = $param->{size} || 2;
my $min_size = $param->{min_size} || 1; my $min_size = $param->{min_size} || 1;
my $ruleset = $param->{crush_ruleset} || 0;
my $rados = PVE::RADOS::new();
$rados->mon_command({
prefix => "osd pool create",
pool => $param->{name},
pg_num => int($pg_num),
# this does not work for unknown reason
# properties => ["size=$size", "min_size=$min_size", "crush_ruleset=$ruleset"],
});
&$run_ceph_cmd(['osd', 'pool', 'create', $param->{name}, $pg_num]); $rados->mon_command({
prefix => "osd pool set",
&$run_ceph_cmd(['osd', 'pool', 'set', $param->{name}, 'min_size', $min_size]); pool => $param->{name},
var => 'min_size',
val => $min_size
});
&$run_ceph_cmd(['osd', 'pool', 'set', $param->{name}, 'size', $size]); $rados->mon_command({
prefix => "osd pool set",
pool => $param->{name},
var => 'size',
val => $size,
});
if (defined($param->{crush_ruleset})) { if (defined($param->{crush_ruleset})) {
&$run_ceph_cmd(['osd', 'pool', 'set', $param->{name}, 'crush_ruleset', $param->{crush_ruleset}]); $rados->mon_command({
prefix => "osd pool set",
pool => $param->{name},
var => 'crush_ruleset',
val => $param->{crush_ruleset},
});
} }
return undef; return undef;
...@@ -1131,7 +1106,13 @@ __PACKAGE__->register_method ({ ...@@ -1131,7 +1106,13 @@ __PACKAGE__->register_method ({
&$check_ceph_inited(); &$check_ceph_inited();
&$run_ceph_cmd(['osd', 'pool', 'delete', $param->{name}, $param->{name}, '--yes-i-really-really-mean-it']); my $rados = PVE::RADOS::new();
# fixme: '--yes-i-really-really-mean-it'
$rados->mon_command({
prefix => "osd pool delete",
pool => $param->{name},
pool2 => $param->{name},
sure => '--yes-i-really-really-mean-it'});
return undef; return undef;
}}); }});
...@@ -1157,7 +1138,8 @@ __PACKAGE__->register_method ({ ...@@ -1157,7 +1138,8 @@ __PACKAGE__->register_method ({
&$check_ceph_inited(); &$check_ceph_inited();
my $res = &$run_ceph_cmd_json(['osd', 'tree'], quiet => 1); my $rados = PVE::RADOS::new();
my $res = $rados->mon_command({ prefix => 'osd tree' });
die "no tree nodes found\n" if !($res && $res->{nodes}); die "no tree nodes found\n" if !($res && $res->{nodes});
...@@ -1274,12 +1256,14 @@ __PACKAGE__->register_method ({ ...@@ -1274,12 +1256,14 @@ __PACKAGE__->register_method ({
die "device '$param->{dev}' is in use\n" die "device '$param->{dev}' is in use\n"
if $diskinfo->{used}; if $diskinfo->{used};
my $monstat = ceph_mon_status(1); my $rados = PVE::RADOS::new();
my $monstat = $rados->mon_command({ prefix => 'mon_status' });
die "unable to get fsid\n" if !$monstat->{monmap} || !$monstat->{monmap}->{fsid}; die "unable to get fsid\n" if !$monstat->{monmap} || !$monstat->{monmap}->{fsid};
my $fsid = $monstat->{monmap}->{fsid}; my $fsid = $monstat->{monmap}->{fsid};
if (! -f $ceph_bootstrap_osd_keyring) { if (! -f $ceph_bootstrap_osd_keyring) {
&$run_ceph_cmd(['auth', 'get', 'client.bootstrap-osd', '-o', $ceph_bootstrap_osd_keyring]); my $bindata = $rados->mon_command({ prefix => 'auth get client.bootstrap-osd', format => 'plain' });
PVE::Tools::file_set_contents($ceph_bootstrap_osd_keyring, $bindata);
}; };
my $worker = sub { my $worker = sub {
...@@ -1342,7 +1326,8 @@ __PACKAGE__->register_method ({ ...@@ -1342,7 +1326,8 @@ __PACKAGE__->register_method ({
# fixme: not 100% sure what we should do here # fixme: not 100% sure what we should do here
my $stat = &$ceph_osd_status(); my $rados = PVE::RADOS::new();
my $stat = $rados->mon_command({ prefix => 'osd dump' });
my $osdlist = $stat->{osds} || []; my $osdlist = $stat->{osds} || [];
...@@ -1371,13 +1356,13 @@ __PACKAGE__->register_method ({ ...@@ -1371,13 +1356,13 @@ __PACKAGE__->register_method ({
warn $@ if $@; warn $@ if $@;
print "Remove $osdsection from the CRUSH map\n"; print "Remove $osdsection from the CRUSH map\n";
&$run_ceph_cmd(['osd', 'crush', 'remove', $osdsection]); $rados->mon_command({ prefix => "osd crush remove", name => $osdsection });
print "Remove the $osdsection authentication key.\n"; print "Remove the $osdsection authentication key.\n";
&$run_ceph_cmd(['auth', 'del', $osdsection]); $rados->mon_command({ prefix => "auth del", entity => $osdsection });
print "Remove OSD $osdsection\n"; print "Remove OSD $osdsection\n";
&$run_ceph_cmd(['osd', 'rm', $osdid]); $rados->mon_command({ prefix => "osd rm", ids => "$osdid" });
# try to unmount from standard mount point # try to unmount from standard mount point
my $mountpoint = "/var/lib/ceph/osd/ceph-$osdid"; my $mountpoint = "/var/lib/ceph/osd/ceph-$osdid";
...@@ -1462,8 +1447,11 @@ __PACKAGE__->register_method ({ ...@@ -1462,8 +1447,11 @@ __PACKAGE__->register_method ({
my $mapfile = "/var/tmp/ceph-crush.map.$$"; my $mapfile = "/var/tmp/ceph-crush.map.$$";
my $mapdata = "/var/tmp/ceph-crush.txt.$$"; my $mapdata = "/var/tmp/ceph-crush.txt.$$";
my $rados = PVE::RADOS::new();
eval { eval {
&$run_ceph_cmd(['osd', 'getcrushmap', '-o', $mapfile]); my $bindata = $rados->mon_command({ prefix => 'osd getcrushmap', format => 'plain' });
PVE::Tools::file_set_contents($mapfile, $bindata);
run_command(['crushtool', '-d', $mapfile, '-o', $mapdata]); run_command(['crushtool', '-d', $mapfile, '-o', $mapdata]);
$txt = PVE::Tools::file_get_contents($mapdata); $txt = PVE::Tools::file_get_contents($mapdata);
}; };
......
...@@ -3,7 +3,7 @@ Version: @VERSION@-@PACKAGERELEASE@ ...@@ -3,7 +3,7 @@ Version: @VERSION@-@PACKAGERELEASE@
Section: admin Section: admin
Priority: optional Priority: optional
Architecture: amd64 Architecture: amd64
Depends: perl (>= 5.10.0-19), libtimedate-perl, libauthen-pam-perl, libintl-perl, rsync, libjson-perl, liblockfile-simple-perl, vncterm, qemu-server (>= 1.1-1), libwww-perl (>= 6.04-1), libnet-http-perl (>= 6.06-1), libhttp-daemon-perl, wget, libnet-dns-perl, vlan, ifenslave-2.6 (>= 1.1.0-10), liblinux-inotify2-perl, debconf (>= 0.5) | debconf-2.0, netcat-traditional, pve-cluster (>= 1.0-29), libpve-common-perl, libpve-storage-perl, libterm-readline-gnu-perl, libpve-access-control (>= 3.0-2), libio-socket-ssl-perl, libfilesys-df-perl, libfile-readbackwards-perl, libfile-sync-perl, redhat-cluster-pve, resource-agents-pve, fence-agents-pve, cstream, postfix | mail-transport-agent, libxml-parser-perl, lzop, dtach, libanyevent-perl, liburi-perl, logrotate, libanyevent-http-perl, apt-transport-https, libapt-pkg-perl, libcrypt-ssleay-perl, liblwp-protocol-https-perl, spiceterm, libuuid-perl, hdparm, gdisk Depends: perl (>= 5.10.0-19), libtimedate-perl, libauthen-pam-perl, libintl-perl, rsync, libjson-perl, liblockfile-simple-perl, vncterm, qemu-server (>= 1.1-1), libwww-perl (>= 6.04-1), libnet-http-perl (>= 6.06-1), libhttp-daemon-perl, wget, libnet-dns-perl, vlan, ifenslave-2.6 (>= 1.1.0-10), liblinux-inotify2-perl, debconf (>= 0.5) | debconf-2.0, netcat-traditional, pve-cluster (>= 1.0-29), libpve-common-perl, libpve-storage-perl, libterm-readline-gnu-perl, libpve-access-control (>= 3.0-2), libio-socket-ssl-perl, libfilesys-df-perl, libfile-readbackwards-perl, libfile-sync-perl, redhat-cluster-pve, resource-agents-pve, fence-agents-pve, cstream, postfix | mail-transport-agent, libxml-parser-perl, lzop, dtach, libanyevent-perl, liburi-perl, logrotate, libanyevent-http-perl, apt-transport-https, libapt-pkg-perl, libcrypt-ssleay-perl, liblwp-protocol-https-perl, spiceterm, libuuid-perl, hdparm, gdisk, librados2-perl
Conflicts: netcat-openbsd, vzdump Conflicts: netcat-openbsd, vzdump
Replaces: vzdump Replaces: vzdump
Provides: vzdump Provides: vzdump
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment