[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