[pve-devel] [PATCH 1/3] Prepare for adding support for istgt and openiscsi Refactor code. Move any LUN related to proper LUN module.
mir at datanom.net
mir at datanom.net
Thu Oct 17 01:18:48 CEST 2013
From: Michael Rasmussen <mir at datanom.net>
Signed-off-by: Michael Rasmussen <mir at datanom.net>
---
PVE/Storage/ZFSPlugin.pm | 151 +++++++++++++++++++++++++----------------------
1 file changed, 80 insertions(+), 71 deletions(-)
diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index a50f7cb..7bc9d49 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -6,59 +6,81 @@ use IO::File;
use POSIX;
use PVE::Tools qw(run_command);
use PVE::Storage::Plugin;
-use Digest::MD5 qw(md5_hex);
use base qw(PVE::Storage::Plugin);
+use PVE::Storage::LunCmd::Comstar;
+use PVE::Storage::LunCmd::Istgt;
my @ssh_opts = ('-o', 'BatchMode=yes');
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 {
my ($scfg, $timeout, $method, @params) = @_;
my $cmdmap;
my $zfscmd;
my $target;
+ my $msg;
$timeout = 5 if !$timeout;
- if ($scfg->{iscsiprovider} eq 'comstar') {
- my $stmfadmcmd = "/usr/sbin/stmfadm";
- my $sbdadmcmd = "/usr/sbin/sbdadm";
-
- $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 {
- die 'unknown iscsi provider. Available [comstar]';
- }
-
- if ($cmdmap->{$method}) {
- $zfscmd = $cmdmap->{$method}->{cmd};
- $method = $cmdmap->{$method}->{method};
- } else {
- $zfscmd = 'zfs';
- }
-
- $target = 'root@' . $scfg->{portal};
-
- my $cmd = [@ssh_cmd, $target, $zfscmd, $method, @params];
-
- my $msg = '';
-
- my $output = sub {
- my $line = shift;
- $msg .= "$line\n";
- };
-
- run_command($cmd, outfunc => $output, timeout => $timeout);
+ if ($lun_cmds->{$method}) {
+ if ($scfg->{iscsiprovider} eq 'comstar') {
+ $msg = PVE::Storage::LunCmd::Comstar::run_lun_command($scfg, $timeout, $method, @params);
+ } elsif ($scfg->{iscsiprovider} eq 'istgt') {
+ $msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params);
+ } else {
+ $zfs_unknown_scsi_provider->($scfg->{iscsiprovider});
+ }
+ } else {
+ if ($method eq 'zpool_list') {
+ $zfscmd = 'zpool';
+ $method = 'list',
+ } else {
+ $zfscmd = 'zfs';
+ }
+
+ $target = 'root@' . $scfg->{portal};
+
+ my $cmd = [@ssh_cmd, $target, $zfscmd, $method, @params];
+
+ $msg = '';
+
+ my $output = sub {
+ my $line = shift;
+ $msg .= "$line\n";
+ };
+
+ run_command($cmd, outfunc => $output, timeout => $timeout);
+ }
return $msg;
}
@@ -152,17 +174,17 @@ sub zfs_get_lu_name {
my ($scfg, $zvol) = @_;
my $object;
+ my $base = $zfs_get_base->($scfg);
if ($zvol =~ /^.+\/.+/) {
- $object = "/dev/zvol/rdsk/$zvol";
+ $object = "$base/$zvol";
} else {
- $object = "/dev/zvol/rdsk/$scfg->{pool}/$zvol";
+ $object = "$base/$scfg->{pool}/$zvol";
}
- my $text = zfs_request($scfg, undef, 'list_lu');
- my @lines = split /\n/, $text;
- foreach my $line (@lines) {
- return $1 if ($line =~ /(\w+)\s+\d+\s+$object$/);
- }
+ my $lu_name = zfs_request($scfg, undef, 'list_lu', $object);
+
+ return $lu_name if $lu_name;
+
die "Could not find lu_name for zvol $zvol";
}
@@ -184,7 +206,7 @@ sub zfs_add_lun_mapping_entry {
if (! defined($guid)) {
$guid = zfs_get_lu_name($scfg, $zvol);
}
-
+
zfs_request($scfg, undef, 'add_view', $guid);
}
@@ -199,12 +221,8 @@ sub zfs_delete_lu {
sub zfs_create_lu {
my ($scfg, $zvol) = @_;
- my $prefix = '600144f';
- my $digest = md5_hex($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");
+ my $base = $zfs_get_base->($scfg);
+ my $guid = zfs_request($scfg, undef, 'create_lu', "$base/$scfg->{pool}/$zvol");
return $guid;
}
@@ -212,7 +230,8 @@ sub zfs_create_lu {
sub zfs_import_lu {
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 {
@@ -220,7 +239,7 @@ sub zfs_resize_lu {
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 {
@@ -237,20 +256,10 @@ sub zfs_delete_zvol {
sub zfs_get_lun_number {
my ($scfg, $guid) = @_;
- my $lunnum = undef;
die "could not find lun_number for guid $guid" if !$guid;
- my $text = zfs_request($scfg, undef, 'list_view', '-l', $guid);
- my @lines = split /\n/, $text;
- foreach my $line (@lines) {
- if ($line =~ /^\s*LUN\s*:\s*(\d+)$/) {
- $lunnum = $1;
- last;
- }
- }
-
- return $lunnum;
+ return zfs_request($scfg, undef, 'list_view', $guid);
}
sub zfs_list_zvol {
@@ -314,11 +323,11 @@ sub properties {
sub options {
return {
- nodes => { optional => 1 },
- disable => { optional => 1 },
- portal => { fixed => 1 },
+ nodes => { optional => 1 },
+ disable => { optional => 1 },
+ portal => { fixed => 1 },
target => { fixed => 1 },
- pool => { fixed => 1 },
+ pool => { fixed => 1 },
blocksize => { fixed => 1 },
iscsiprovider => { fixed => 1 },
content => { optional => 1 },
@@ -347,9 +356,9 @@ sub path {
my $guid = zfs_get_lu_name($scfg, $name);
my $lun = zfs_get_lun_number($scfg, $guid);
-
+
my $path = "iscsi://$portal/$target/$lun";
-
+
return ($path, $vmid, $vtype);
}
--
1.8.4.rc3
More information about the pve-devel
mailing list