Prepare for adding support for istgt and openiscsi Refactor code. Move any LUN related to proper LUN module.
Signed-off-by: Michael Rasmussen <mir@datanom.net>
This commit is contained in:
committed by
Dietmar Maurer
parent
bf8e86150d
commit
a7d56be676
@ -6,43 +6,64 @@ use IO::File;
|
|||||||
use POSIX;
|
use POSIX;
|
||||||
use PVE::Tools qw(run_command);
|
use PVE::Tools qw(run_command);
|
||||||
use PVE::Storage::Plugin;
|
use PVE::Storage::Plugin;
|
||||||
use Digest::MD5 qw(md5_hex);
|
|
||||||
|
|
||||||
use base qw(PVE::Storage::Plugin);
|
use base qw(PVE::Storage::Plugin);
|
||||||
|
use PVE::Storage::LunCmd::Comstar;
|
||||||
|
use PVE::Storage::LunCmd::Istgt;
|
||||||
|
|
||||||
my @ssh_opts = ('-o', 'BatchMode=yes');
|
my @ssh_opts = ('-o', 'BatchMode=yes');
|
||||||
my @ssh_cmd = ('/usr/bin/ssh', @ssh_opts);
|
my @ssh_cmd = ('/usr/bin/ssh', @ssh_opts);
|
||||||
|
|
||||||
|
my $lun_cmds = {
|
||||||
|
create_lu => 1,
|
||||||
|
delete_lu => 1,
|
||||||
|
import_lu => 1,
|
||||||
|
modify_lu => 1,
|
||||||
|
add_view => 1,
|
||||||
|
list_view => 1,
|
||||||
|
list_lu => 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
my $zfs_unknown_scsi_provider = sub {
|
||||||
|
my ($provider) = @_;
|
||||||
|
|
||||||
|
die "$provider: unknown iscsi provider. Available [comstar, istgt]";
|
||||||
|
};
|
||||||
|
|
||||||
|
my $zfs_get_base = sub {
|
||||||
|
my ($scfg) = @_;
|
||||||
|
|
||||||
|
if ($scfg->{iscsiprovider} eq 'comstar') {
|
||||||
|
return PVE::Storage::LunCmd::Comstar::get_base;
|
||||||
|
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
||||||
|
return PVE::Storage::LunCmd::Istgt::get_base;
|
||||||
|
} else {
|
||||||
|
$zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
sub zfs_request {
|
sub zfs_request {
|
||||||
my ($scfg, $timeout, $method, @params) = @_;
|
my ($scfg, $timeout, $method, @params) = @_;
|
||||||
|
|
||||||
my $cmdmap;
|
my $cmdmap;
|
||||||
my $zfscmd;
|
my $zfscmd;
|
||||||
my $target;
|
my $target;
|
||||||
|
my $msg;
|
||||||
|
|
||||||
$timeout = 5 if !$timeout;
|
$timeout = 5 if !$timeout;
|
||||||
|
|
||||||
|
if ($lun_cmds->{$method}) {
|
||||||
if ($scfg->{iscsiprovider} eq 'comstar') {
|
if ($scfg->{iscsiprovider} eq 'comstar') {
|
||||||
my $stmfadmcmd = "/usr/sbin/stmfadm";
|
$msg = PVE::Storage::LunCmd::Comstar::run_lun_command($scfg, $timeout, $method, @params);
|
||||||
my $sbdadmcmd = "/usr/sbin/sbdadm";
|
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
||||||
|
$msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params);
|
||||||
$cmdmap = {
|
|
||||||
create_lu => { cmd => $stmfadmcmd, method => 'create-lu' },
|
|
||||||
delete_lu => { cmd => $stmfadmcmd, method => 'delete-lu' },
|
|
||||||
import_lu => { cmd => $stmfadmcmd, method => 'import-lu' },
|
|
||||||
modify_lu => { cmd => $stmfadmcmd, method => 'modify-lu' },
|
|
||||||
add_view => { cmd => $stmfadmcmd, method => 'add-view' },
|
|
||||||
list_view => { cmd => $stmfadmcmd, method => 'list-view' },
|
|
||||||
list_lu => { cmd => $sbdadmcmd, method => 'list-lu' },
|
|
||||||
zpool_list => { cmd => 'zpool', method => 'list' },
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
die 'unknown iscsi provider. Available [comstar]';
|
$zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
if ($cmdmap->{$method}) {
|
if ($method eq 'zpool_list') {
|
||||||
$zfscmd = $cmdmap->{$method}->{cmd};
|
$zfscmd = 'zpool';
|
||||||
$method = $cmdmap->{$method}->{method};
|
$method = 'list',
|
||||||
} else {
|
} else {
|
||||||
$zfscmd = 'zfs';
|
$zfscmd = 'zfs';
|
||||||
}
|
}
|
||||||
@ -51,7 +72,7 @@ sub zfs_request {
|
|||||||
|
|
||||||
my $cmd = [@ssh_cmd, $target, $zfscmd, $method, @params];
|
my $cmd = [@ssh_cmd, $target, $zfscmd, $method, @params];
|
||||||
|
|
||||||
my $msg = '';
|
$msg = '';
|
||||||
|
|
||||||
my $output = sub {
|
my $output = sub {
|
||||||
my $line = shift;
|
my $line = shift;
|
||||||
@ -59,6 +80,7 @@ sub zfs_request {
|
|||||||
};
|
};
|
||||||
|
|
||||||
run_command($cmd, outfunc => $output, timeout => $timeout);
|
run_command($cmd, outfunc => $output, timeout => $timeout);
|
||||||
|
}
|
||||||
|
|
||||||
return $msg;
|
return $msg;
|
||||||
}
|
}
|
||||||
@ -152,17 +174,17 @@ sub zfs_get_lu_name {
|
|||||||
my ($scfg, $zvol) = @_;
|
my ($scfg, $zvol) = @_;
|
||||||
my $object;
|
my $object;
|
||||||
|
|
||||||
|
my $base = $zfs_get_base->($scfg);
|
||||||
if ($zvol =~ /^.+\/.+/) {
|
if ($zvol =~ /^.+\/.+/) {
|
||||||
$object = "/dev/zvol/rdsk/$zvol";
|
$object = "$base/$zvol";
|
||||||
} else {
|
} else {
|
||||||
$object = "/dev/zvol/rdsk/$scfg->{pool}/$zvol";
|
$object = "$base/$scfg->{pool}/$zvol";
|
||||||
}
|
}
|
||||||
|
|
||||||
my $text = zfs_request($scfg, undef, 'list_lu');
|
my $lu_name = zfs_request($scfg, undef, 'list_lu', $object);
|
||||||
my @lines = split /\n/, $text;
|
|
||||||
foreach my $line (@lines) {
|
return $lu_name if $lu_name;
|
||||||
return $1 if ($line =~ /(\w+)\s+\d+\s+$object$/);
|
|
||||||
}
|
|
||||||
die "Could not find lu_name for zvol $zvol";
|
die "Could not find lu_name for zvol $zvol";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,12 +221,8 @@ sub zfs_delete_lu {
|
|||||||
sub zfs_create_lu {
|
sub zfs_create_lu {
|
||||||
my ($scfg, $zvol) = @_;
|
my ($scfg, $zvol) = @_;
|
||||||
|
|
||||||
my $prefix = '600144f';
|
my $base = $zfs_get_base->($scfg);
|
||||||
my $digest = md5_hex($zvol);
|
my $guid = zfs_request($scfg, undef, 'create_lu', "$base/$scfg->{pool}/$zvol");
|
||||||
$digest =~ /(\w{7}(.*))/;
|
|
||||||
my $guid = "$prefix$2";
|
|
||||||
|
|
||||||
zfs_request($scfg, undef, 'create_lu', '-p', 'wcd=false', '-p', "guid=$guid", "/dev/zvol/rdsk/$scfg->{pool}/$zvol");
|
|
||||||
|
|
||||||
return $guid;
|
return $guid;
|
||||||
}
|
}
|
||||||
@ -212,7 +230,8 @@ sub zfs_create_lu {
|
|||||||
sub zfs_import_lu {
|
sub zfs_import_lu {
|
||||||
my ($scfg, $zvol) = @_;
|
my ($scfg, $zvol) = @_;
|
||||||
|
|
||||||
zfs_request($scfg, undef, 'import_lu', "/dev/zvol/rdsk/$scfg->{pool}/$zvol");
|
my $base = $zfs_get_base->($scfg);
|
||||||
|
zfs_request($scfg, undef, 'import_lu', "$base/$scfg->{pool}/$zvol");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zfs_resize_lu {
|
sub zfs_resize_lu {
|
||||||
@ -220,7 +239,7 @@ sub zfs_resize_lu {
|
|||||||
|
|
||||||
my $guid = zfs_get_lu_name($scfg, $zvol);
|
my $guid = zfs_get_lu_name($scfg, $zvol);
|
||||||
|
|
||||||
zfs_request($scfg, undef, 'modify_lu', '-s', "${size}K", $guid);
|
zfs_request($scfg, undef, 'modify_lu', "${size}K", $guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zfs_create_zvol {
|
sub zfs_create_zvol {
|
||||||
@ -237,20 +256,10 @@ sub zfs_delete_zvol {
|
|||||||
|
|
||||||
sub zfs_get_lun_number {
|
sub zfs_get_lun_number {
|
||||||
my ($scfg, $guid) = @_;
|
my ($scfg, $guid) = @_;
|
||||||
my $lunnum = undef;
|
|
||||||
|
|
||||||
die "could not find lun_number for guid $guid" if !$guid;
|
die "could not find lun_number for guid $guid" if !$guid;
|
||||||
|
|
||||||
my $text = zfs_request($scfg, undef, 'list_view', '-l', $guid);
|
return zfs_request($scfg, undef, 'list_view', $guid);
|
||||||
my @lines = split /\n/, $text;
|
|
||||||
foreach my $line (@lines) {
|
|
||||||
if ($line =~ /^\s*LUN\s*:\s*(\d+)$/) {
|
|
||||||
$lunnum = $1;
|
|
||||||
last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $lunnum;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub zfs_list_zvol {
|
sub zfs_list_zvol {
|
||||||
|
|||||||
Reference in New Issue
Block a user