diff --git a/PVE/API2/Storage/Scan.pm b/PVE/API2/Storage/Scan.pm index d67df8c..7686e05 100644 --- a/PVE/API2/Storage/Scan.pm +++ b/PVE/API2/Storage/Scan.pm @@ -44,11 +44,43 @@ __PACKAGE__->register_method ({ { method => 'nfs' }, { method => 'glusterfs' }, { method => 'usb' }, + { method => 'zfs' }, ]; return $res; }}); +__PACKAGE__->register_method ({ + name => 'zfsscan', + path => 'zfs', + method => 'GET', + description => "Scan zfs pool list on local node.", + protected => 1, + proxyto => "node", + permissions => { + check => ['perm', '/storage', ['Datastore.Allocate']], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + }, + }, + returns => { + type => 'array', + items => { + type => "object", + properties => { + pool => { type => 'string'}, + }, + }, + }, + code => sub { + my ($param) = @_; + + return PVE::Storage::scan_zfs(); + }}); + __PACKAGE__->register_method ({ name => 'nfsscan', path => 'nfs', diff --git a/PVE/Storage.pm b/PVE/Storage.pm index b491484..8711710 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -911,6 +911,25 @@ sub scan_nfs { return $res; } +sub scan_zfs { + + my $cmd = ['zpool', 'list', '-H', '-o', 'name,size,free']; + + my $res = []; + run_command($cmd, outfunc => sub { + my $line = shift; + + if ($line =~m/^(\S+)\s+(\S+)\s+(\S+)$/) { + my ($pool, $size_str, $free_str) = ($1, $2, $3); + my $size = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($size_str); + my $free = PVE::Storage::ZFSPoolPlugin::zfs_parse_size($free_str); + push @$res, { pool => $pool, size => $size, free => $free }; + } + }); + + return $res; +} + sub resolv_portal { my ($portal, $noerr) = @_; diff --git a/pvesm b/pvesm index 76d345c..79213e0 100755 --- a/pvesm +++ b/pvesm @@ -172,6 +172,14 @@ my $cmddef = { printf "$rec->{vg}\n"; } }], + zfsscan => [ "PVE::API2::Storage::Scan", 'zfsscan', [], + { node => $nodename }, sub { + my $res = shift; + + foreach my $rec (@$res) { + printf "$rec->{pool}\n"; + } + }], path => [ __PACKAGE__, 'path', ['volume']], };