Skip to content

Commit

Permalink
use PVE::RADOS perl bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
maurerdietmar committed Jan 17, 2014
1 parent f481098 commit 1ee65ae
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 76 deletions.
138 changes: 63 additions & 75 deletions PVE/API2/Ceph.pm
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ use PVE::RESTHandler;
use PVE::RPCEnvironment;
use PVE::JSONSchema qw(get_standard_option);
use JSON;
use PVE::RADOS;

use base qw(PVE::RESTHandler);

Expand Down Expand Up @@ -128,59 +129,6 @@ my $parse_ceph_config = sub {
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 ($cfg) = @_;

Expand Down Expand Up @@ -568,7 +516,8 @@ __PACKAGE__->register_method ({
}

eval {
my $monstat = ceph_mon_status();
my $rados = PVE::RADOS::new();
my $monstat = $rados->mon_command({ prefix => 'mon_status' });
my $mons = $monstat->{monmap}->{mons};
foreach my $d (@$mons) {
next if !defined($d->{name});
Expand Down Expand Up @@ -785,8 +734,9 @@ __PACKAGE__->register_method ({
mkdir $mondir;

if ($moncount > 0) {
my $monstat = ceph_mon_status(); # online test
&$run_ceph_cmd(['mon', 'getmap', '-o', $monmap]);
my $rados = PVE::RADOS::new();
my $mapdata = $rados->mon_command({ prefix => 'mon getmap', format => 'plain' });
PVE::Tools::file_set_contents($monmap, $mapdata);
} else {
run_command("monmaptool --create --clobber --add $monid $monaddr --print $monmap");
}
Expand Down Expand Up @@ -845,13 +795,13 @@ __PACKAGE__->register_method ({
my $monid = $param->{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};

die "no such monitor id '$monid'\n"
if !defined($cfg->{$monsection});


my $mondir = "/var/lib/ceph/mon/$ccname-$monid";
-d $mondir || die "monitor filesystem '$mondir' does not exist on this node\n";

Expand All @@ -860,7 +810,7 @@ __PACKAGE__->register_method ({
my $worker = sub {
my $upid = shift;

&$run_ceph_cmd(['mon', 'remove', $monid]);
$rados->mon_command({ prefix => "mon remove", name => $monid });

eval { &$ceph_service_cmd('stop', $monsection); };
warn $@ if $@;
Expand Down Expand Up @@ -986,7 +936,8 @@ __PACKAGE__->register_method ({

&$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 ({
Expand Down Expand Up @@ -1019,7 +970,8 @@ __PACKAGE__->register_method ({

&$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 = [];
foreach my $e (@{$res->{pools}}) {
Expand Down Expand Up @@ -1094,15 +1046,38 @@ __PACKAGE__->register_method ({
my $pg_num = $param->{pg_num} || 64;
my $size = $param->{size} || 2;
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]);

&$run_ceph_cmd(['osd', 'pool', 'set', $param->{name}, 'min_size', $min_size]);
$rados->mon_command({
prefix => "osd pool set",
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})) {
&$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;
Expand Down Expand Up @@ -1131,7 +1106,13 @@ __PACKAGE__->register_method ({

&$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;
}});
Expand All @@ -1157,7 +1138,8 @@ __PACKAGE__->register_method ({

&$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});

Expand Down Expand Up @@ -1274,12 +1256,14 @@ __PACKAGE__->register_method ({
die "device '$param->{dev}' is in use\n"
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};
my $fsid = $monstat->{monmap}->{fsid};

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 {
Expand Down Expand Up @@ -1342,7 +1326,8 @@ __PACKAGE__->register_method ({

# 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} || [];

Expand Down Expand Up @@ -1371,13 +1356,13 @@ __PACKAGE__->register_method ({
warn $@ if $@;

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";
&$run_ceph_cmd(['auth', 'del', $osdsection]);
$rados->mon_command({ prefix => "auth del", entity => $osdsection });

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
my $mountpoint = "/var/lib/ceph/osd/ceph-$osdid";
Expand Down Expand Up @@ -1462,8 +1447,11 @@ __PACKAGE__->register_method ({
my $mapfile = "/var/tmp/ceph-crush.map.$$";
my $mapdata = "/var/tmp/ceph-crush.txt.$$";

my $rados = PVE::RADOS::new();

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]);
$txt = PVE::Tools::file_get_contents($mapdata);
};
Expand Down
2 changes: 1 addition & 1 deletion debian/control.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Version: @VERSION@-@PACKAGERELEASE@
Section: admin
Priority: optional
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
Replaces: vzdump
Provides: vzdump
Expand Down

0 comments on commit 1ee65ae

Please sign in to comment.