148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
| --- ZFSPlugin.pm.orig	2019-04-30 09:54:55.000000000 -0400
 | |
| +++ ZFSPlugin.pm	2019-05-11 10:32:36.326734352 -0400
 | |
| @@ -10,6 +10,7 @@
 | |
|  
 | |
|  use base qw(PVE::Storage::ZFSPoolPlugin);
 | |
|  use PVE::Storage::LunCmd::Comstar;
 | |
| +use PVE::Storage::LunCmd::FreeNAS;
 | |
|  use PVE::Storage::LunCmd::Istgt;
 | |
|  use PVE::Storage::LunCmd::Iet;
 | |
|  use PVE::Storage::LunCmd::LIO;
 | |
| @@ -26,13 +27,14 @@
 | |
|      modify_lu   => 1,
 | |
|      add_view    => 1,
 | |
|      list_view   => 1,
 | |
| +    list_extent => 1,
 | |
|      list_lu     => 1,
 | |
|  };
 | |
|  
 | |
|  my $zfs_unknown_scsi_provider = sub {
 | |
|      my ($provider) = @_;
 | |
|  
 | |
| -    die "$provider: unknown iscsi provider. Available [comstar, istgt, iet, LIO]";
 | |
| +    die "$provider: unknown iscsi provider. Available [comstar, freenas, istgt, iet, LIO]";
 | |
|  };
 | |
|  
 | |
|  my $zfs_get_base = sub {
 | |
| @@ -40,6 +42,8 @@
 | |
|  
 | |
|      if ($scfg->{iscsiprovider} eq 'comstar') {
 | |
|          return PVE::Storage::LunCmd::Comstar::get_base;
 | |
| +    } elsif ($scfg->{iscsiprovider} eq 'freenas') {
 | |
| +        return PVE::Storage::LunCmd::FreeNAS::get_base;
 | |
|      } elsif ($scfg->{iscsiprovider} eq 'istgt') {
 | |
|          return PVE::Storage::LunCmd::Istgt::get_base;
 | |
|      } elsif ($scfg->{iscsiprovider} eq 'iet') {
 | |
| @@ -62,6 +66,8 @@
 | |
|      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 'freenas') {
 | |
| +            $msg = PVE::Storage::LunCmd::FreeNAS::run_lun_command($scfg, $timeout, $method, @params);
 | |
|          } elsif ($scfg->{iscsiprovider} eq 'istgt') {
 | |
|              $msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params);
 | |
|          } elsif ($scfg->{iscsiprovider} eq 'iet') {
 | |
| @@ -160,6 +166,15 @@
 | |
|      return $class->zfs_request($scfg, undef, 'list_view', $guid);
 | |
|  }
 | |
|  
 | |
| +# Part of the multipath enhancement
 | |
| +sub zfs_get_wwid_number {
 | |
| +    my ($class, $scfg, $guid) = @_;
 | |
| +
 | |
| +    die "could not find lun_number for guid $guid" if !$guid;
 | |
| +
 | |
| +    return $class->zfs_request($scfg, undef, 'list_extent', $guid);
 | |
| +}
 | |
| +
 | |
|  # Configuration
 | |
|  
 | |
|  sub type {
 | |
| @@ -178,6 +193,24 @@
 | |
|  	    description => "iscsi provider",
 | |
|  	    type => 'string',
 | |
|  	},
 | |
| +	# This is for FreeNAS iscsi and API intergration
 | |
| +	# And some enhancements asked by the community
 | |
| +	freenas_user => {
 | |
| +	    description => "FreeNAS API Username",
 | |
| +	    type => 'string',
 | |
| +	},
 | |
| +	freenas_password => {
 | |
| +	    description => "FreeNAS API Password",
 | |
| +	    type => 'string',
 | |
| +	},
 | |
| +	freenas_use_ssl => {
 | |
| +	    description => "FreeNAS API access via SSL",
 | |
| +	    type => 'boolean',
 | |
| +	},
 | |
| +	freenas_apiv4_host => {
 | |
| +	    description => "FreeNAS API Host",
 | |
| +	    type => 'string',
 | |
| +	},
 | |
|  	# this will disable write caching on comstar and istgt.
 | |
|  	# it is not implemented for iet. iet blockio always operates with
 | |
|  	# writethrough caching when not in readonly mode
 | |
| @@ -205,14 +238,18 @@
 | |
|  	nodes => { optional => 1 },
 | |
|  	disable => { optional => 1 },
 | |
|  	portal => { fixed => 1 },
 | |
| -	target => { fixed => 1 },
 | |
| -	pool => { fixed => 1 },
 | |
| +	target => { fixed => 0 },
 | |
| +	pool => { fixed => 0 },
 | |
|  	blocksize => { fixed => 1 },
 | |
|  	iscsiprovider => { fixed => 1 },
 | |
|  	nowritecache => { optional => 1 },
 | |
|  	sparse => { optional => 1 },
 | |
|  	comstar_hg => { optional => 1 },
 | |
|  	comstar_tg => { optional => 1 },
 | |
| +	freenas_user => { optional => 1 },
 | |
| +	freenas_password => { optional => 1 },
 | |
| +	freenas_use_ssl => { optional => 1 },
 | |
| +	freenas_apiv4_host => { optional => 1 },
 | |
|  	lio_tpg => { optional => 1 },
 | |
|  	content => { optional => 1 },
 | |
|  	bwlimit => { optional => 1 },
 | |
| @@ -237,6 +274,40 @@
 | |
|  
 | |
|      my $path = "iscsi://$portal/$target/$lun";
 | |
|  
 | |
| +    # Multipath enhancement
 | |
| +    eval {
 | |
| +	my $wwid = $class->zfs_get_wwid_number($scfg, $guid);
 | |
| +#	syslog(info,"JD: path get_lun_number guid $guid");
 | |
| +
 | |
| +	if ($wwid =~ /^([-\@\w.]+)$/) {
 | |
| +	    $wwid = $1;                     # $data now untainted
 | |
| +	} else {
 | |
| +	    die "Bad data in '$wwid'";      # log this somewhere
 | |
| +	}
 | |
| +	my $wwid_end = substr $wwid, 16;
 | |
| +
 | |
| +	my $mapper = '';
 | |
| +	sleep 3;
 | |
| +	run_command("iscsiadm -m session --rescan");
 | |
| +	sleep 3;
 | |
| +	my $line = `multipath -ll | grep \"$wwid_end\"`;
 | |
| +	my ($mapper_device) = split(' ', $line);
 | |
| +	$mapper_device = "" unless $mapper_device;
 | |
| +	$mapper .= $mapper_device;
 | |
| +
 | |
| +	if ($mapper =~ /^([-\@\w.]+)$/) {
 | |
| +	    $mapper = $1;                   # $data now untainted
 | |
| +	} else {
 | |
| +	    $mapper = '';
 | |
| +	}
 | |
| +
 | |
| +#	syslog(info,"Multipath mapper found: $mapper\n");
 | |
| +	if ($mapper ne "") {
 | |
| +	    $path = "/dev/mapper/$mapper";
 | |
| +	    sleep 5;
 | |
| +	}
 | |
| +    };
 | |
| +
 | |
|      return ($path, $vmid, $vtype);
 | |
|  }
 | |
|  
 |