Hi, thank you for the contribution! Please prepend the commit title with "fix #254: ".
Am 16.08.23 um 13:56 schrieb ykonoto...@gnome.org: > From: Yuri Konotopov <ykonoto...@gnome.org> > > Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=254 To accept contributions, we need your Signed-off-by trailer here and you need to agree to the Harmony CLA (assuming you haven't sent it to us already): https://pve.proxmox.com/wiki/Developer_Documentation#Software_License_and_Copyright > --- > PVE/Storage/ISCSIPlugin.pm | 44 +++++++++++++++++++++++--------------- > PVE/Storage/Plugin.pm | 18 ++++++++++++++++ > 2 files changed, 45 insertions(+), 17 deletions(-) > > diff --git a/PVE/Storage/ISCSIPlugin.pm b/PVE/Storage/ISCSIPlugin.pm > index a79fcb0..e056393 100644 > --- a/PVE/Storage/ISCSIPlugin.pm > +++ b/PVE/Storage/ISCSIPlugin.pm > @@ -69,24 +69,30 @@ sub iscsi_test_portal { > } > > sub iscsi_discovery { > - my ($portal) = @_; > + my @portals = @{$_[0]}; Style nit: Usually we'd still write this as my ($portals) = @_; and then use $portals->@* whenever we need to access the array below. Like that it's nicer to extend if a new parameter is added. > > check_iscsi_support (); > > my $res = {}; > - return $res if !iscsi_test_portal($portal); # fixme: raise exception > here? > + foreach my $portal (@portals) > + { Style nit: We use 'for' instead of 'foreach' for new code and the opening bracket should be on the same line > + next if !iscsi_test_portal($portal); # fixme: raise exception here? > > - my $cmd = [$ISCSIADM, '--mode', 'discovery', '--type', 'sendtargets', > '--portal', $portal]; > - run_command($cmd, outfunc => sub { > - my $line = shift; > + my $cmd = [$ISCSIADM, '--mode', 'discovery', '--type', 'sendtargets', > '--portal', $portal]; > + run_command($cmd, outfunc => sub { > + my $line = shift; > > - if ($line =~ m/^((?:$IPV4RE|\[$IPV6RE\]):\d+)\,\S+\s+(\S+)\s*$/) { > - my $portal = $1; > - my $target = $2; > - # one target can have more than one portal (multipath). > - push @{$res->{$target}}, $portal; > - } > - }); > + if ($line =~ m/^((?:$IPV4RE|\[$IPV6RE\]):\d+)\,\S+\s+(\S+)\s*$/) { > + my $portal = $1; > + my $target = $2; > + # one target can have more than one portal (multipath). > + push @{$res->{$target}}, $portal; > + } > + }); > + > + # In case of multipath we want to exit on any portal available> + > last; > + } > > return $res; > } > @@ -96,7 +102,7 @@ sub iscsi_login { > > check_iscsi_support(); > > - eval { iscsi_discovery($portal_in); }; > + eval { iscsi_discovery(PVE::Storage::Plugin::get_portals($portal_in)); }; > warn $@ if $@; > > run_command([$ISCSIADM, '--mode', 'node', '--targetname', $target, > '--login']); > @@ -245,8 +251,8 @@ sub properties { > type => 'string', > }, > portal => { > - description => "iSCSI portal (IP or DNS name with optional port).", > - type => 'string', format => 'pve-storage-portal-dns', > + description => "iSCSI portal (IP or DNS name with optional port). > Multiple portals can be separated by comma (for multipath).", Since separation for lists is (mostly) consistent in our API, you could also just write: "For multipath, multiple portals can be specified." > + type => 'string', format => 'pve-storage-portals-dns', Please note that for lists, you can just use the existing format and append "-list" in our schemas, i.e. using 'pve-storage-portal-dns-list' should give you what you want already and you don't need to register a new format. > }, > }; > } > @@ -403,8 +409,12 @@ sub deactivate_storage { > sub check_connection { > my ($class, $storeid, $scfg) = @_; > > - my $portal = $scfg->{portal}; > - return iscsi_test_portal($portal); > + foreach my $portal > (@{PVE::Storage::Plugin::get_portals($scfg->{portal})}) { > + my $result = iscsi_test_portal($portal); > + return $result if $result; > + } > + > + return 0; > } > > sub volume_resize { > diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm > index c323085..ee69b14 100644 > --- a/PVE/Storage/Plugin.pm > +++ b/PVE/Storage/Plugin.pm > @@ -205,6 +205,13 @@ sub content_hash_to_string { > return join(',', @cta); > } > > +sub get_portals { > + my $portal_cfg = shift; > + my $portals = [split(',', $portal_cfg)]; > + map { s/^\s+|\s+$//g; } @{$portals}; You can use the PVE::Tools::split_list() helper instead of this one. > + return $portals; > +} > + > sub valid_content_types { > my ($type) = @_; > > @@ -301,6 +308,17 @@ sub verify_portal_dns { > return $portal; > } > > +PVE::JSONSchema::register_format('pve-storage-portals-dns', > \&verify_portals_dns); > +sub verify_portals_dns { > + my ($portal_in, $noerr) = @_; > + > + foreach my $portal (@{get_portals($portal_in)}) { > + verify_portal_dns($portal, $noerr); > + } > + > + return $portal_in; > +} > + > PVE::JSONSchema::register_format('pve-storage-content', \&verify_content); > sub verify_content { > my ($ct, $noerr) = @_; Best Regards, Fiona _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel