From 64afc5a70a1fce00d482c3071c5eab29cccacc70 Mon Sep 17 00:00:00 2001 From: Kevin Scott Adams Date: Sun, 28 Oct 2018 21:37:06 -0400 Subject: [PATCH] Fix 'Parameter verification failed' when editing - When changing the 'target' and 'pool' field to be editable in the Edit ZFS over iSCSI panel it created an issue when you went to save any change to that panel. The parameters were defined as { fixed => 1 }. Now I don't know the backend of this but I changed it to { optional => 1} or to { fixed => 0} they both worked. So I went with the { fixed => 0 } on the 'target' and 'pool'. This fixes issue #27. - Added a file with the version of the 'libpve-storage-perl' (e.g. - ZFSPlugin-5.0-30.pm.patch to follow each version has it is changed. --- perl5/PVE/Storage/ZFSPlugin-5.0-30.pm.patch | 140 ++++++++++++++++++++ perl5/PVE/Storage/ZFSPlugin.pm.patch | 115 ++++++++-------- 2 files changed, 203 insertions(+), 52 deletions(-) create mode 100644 perl5/PVE/Storage/ZFSPlugin-5.0-30.pm.patch diff --git a/perl5/PVE/Storage/ZFSPlugin-5.0-30.pm.patch b/perl5/PVE/Storage/ZFSPlugin-5.0-30.pm.patch new file mode 100644 index 0000000..0a1c8a4 --- /dev/null +++ b/perl5/PVE/Storage/ZFSPlugin-5.0-30.pm.patch @@ -0,0 +1,140 @@ +--- ZFSPlugin.pm.orig 2018-10-03 11:02:46.000000000 -0400 ++++ ZFSPlugin.pm 2018-10-28 21:27:44.794732848 -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; +@@ -32,7 +33,7 @@ + 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 +41,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 +65,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 +165,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 +192,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 +237,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 +273,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); + } + diff --git a/perl5/PVE/Storage/ZFSPlugin.pm.patch b/perl5/PVE/Storage/ZFSPlugin.pm.patch index 1896f53..0a1c8a4 100644 --- a/perl5/PVE/Storage/ZFSPlugin.pm.patch +++ b/perl5/PVE/Storage/ZFSPlugin.pm.patch @@ -1,5 +1,5 @@ ---- ZFSPlugin.pm.5.2-8.pm.orig 2018-08-29 12:24:44.171123901 -0400 -+++ ZFSPlugin.pm 2018-10-15 12:17:52.026049903 -0400 +--- ZFSPlugin.pm.orig 2018-10-03 11:02:46.000000000 -0400 ++++ ZFSPlugin.pm 2018-10-28 21:27:44.794732848 -0400 @@ -10,6 +10,7 @@ use base qw(PVE::Storage::ZFSPoolPlugin); @@ -51,77 +51,88 @@ # Configuration sub type { -@@ -178,6 +192,23 @@ +@@ -178,6 +192,24 @@ description => "iscsi provider", type => 'string', }, -+ # This is for FreeNAS iscsi and API intergration -+ 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 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 -@@ -213,6 +244,10 @@ +@@ -205,14 +237,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 }, ++ 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 +272,40 @@ +@@ -237,6 +273,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"); ++ 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; ++ 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; ++ 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 = ''; -+ } ++ 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; -+ } ++# syslog(info,"Multipath mapper found: $mapper\n"); ++ if ($mapper ne "") { ++ $path = "/dev/mapper/$mapper"; ++ sleep 5; ++ } + }; + return ($path, $vmid, $vtype);