diff --git a/perl5/PVE/Storage/LunCmd/FreeNAS.pm b/perl5/PVE/Storage/LunCmd/FreeNAS.pm index 71d24ec..bf5598a 100644 --- a/perl5/PVE/Storage/LunCmd/FreeNAS.pm +++ b/perl5/PVE/Storage/LunCmd/FreeNAS.pm @@ -13,6 +13,65 @@ use JSON; # Max LUNS per target on the iSCSI server my $MAX_LUNS = 255; +# FreeNAS API Definitions +my $freenas_api_version = "v1.0"; +my $freenas_api_methods = undef; +my $freenas_api_variables = undef; +my $freenas_api_version_methods = { + "v1.0" => { + "config" => "/api/v1.0/services/iscsi/globalconfiguration/", + "target" => "/api/v1.0/services/iscsi/target/", + "extent" => "/api/v1.0/services/iscsi/extent/", + "targetextent" => "/api/v1.0/services/iscsi/targettoextent/", + }, + "v2.0" => { + "config" => "/api/v2.0/iscsi/global", + "target" => "/api/v2.0/iscsi/target/", + "extent" => "/api/v2.0/iscsi/extent/", + "targetextent" => "/api/v2.0/iscsi/targetextent/", + }, +}; + +# +# +# +my $freenas_api_version_variables = { + "v1.0" => { + "basename" => "iscsi_basename", + "lunid" => "iscsi_lunid", + "extentid" => "iscsi_extentid", + "targetid" => "iscsi_targetid", + "extentpath" => "iscsi_target_extent_path", + "extentnaa" => "iscsi_target_extent_naa", + "targetname" => "iscsi_target_name", + }, + "v2.0" => { + "basename" => "basename", + "lunid" => "lunid", + "extentid" => "extent", + "targetid" => "target", + "extentpath" => "path", + "extentnaa" => "naa", + "targetname" => "name", + }, +}; + +# +# +# +my $freenas_apiv2_parameters = { + "target" => { + "none" => undef, + }, + "extent" => { + "force" => "true", + }, + "targetextent" => { + "remove" => "true", + "force" => "true", + }, +}; + # # # @@ -26,11 +85,13 @@ sub get_base { sub run_lun_command { my ($scfg, $timeout, $method, @params) = @_; + syslog("info",(caller(0))[3] . " : $method(@params)"); + if(!defined($scfg->{'freenas_user'}) || !defined($scfg->{'freenas_password'})) { die "Undefined freenas_user and/or freenas_password."; } - syslog("info","FreeNAS::lun_command : $method(@params)"); + freenas_api_check($scfg, $timeout); if($method eq "create_lu") { return run_create_lu($scfg, $timeout, $method, @params); @@ -57,7 +118,7 @@ sub run_lun_command { return run_list_lu($scfg, $timeout, $method, "name", @params); } - syslog("error","FreeNAS::lun_command : unknown method $method"); + syslog("error",(caller(0))[3] . " : unknown method $method"); return undef; } @@ -74,6 +135,9 @@ sub run_add_view { # sub run_modify_lu { my ($scfg, $timeout, $method, @params) = @_; + + syslog("info", (caller(0))[3] . " : called"); + shift(@params); run_delete_lu($scfg, $timeout, $method, @params); return run_create_lu($scfg, $timeout, $method, @params); @@ -84,6 +148,9 @@ sub run_modify_lu { # sub run_list_view { my ($scfg, $timeout, $method, @params) = @_; + + syslog("info", (caller(0))[3] . " : called"); + return run_list_lu($scfg, $timeout, $method, "lun-id", @params); } @@ -93,18 +160,21 @@ sub run_list_view { sub run_list_lu { my ($scfg, $timeout, $method, $result_value_type, @params) = @_; my $object = $params[0]; - my $result = undef; + syslog("info", (caller(0))[3] . " : called with (method=$method; result_value_type=$result_value_type; object=$object)"); + my $adddev = ($freenas_api_version eq "v2.0") ? "/dev/" : ""; + my $result = undef; my $luns = freenas_list_lu($scfg); foreach my $lun (@$luns) { - if ($lun->{'iscsi_target_extent_path'} =~ /^$object$/) { - $result = $result_value_type eq "lun-id" ? $lun->{'iscsi_lunid'} : $lun->{'iscsi_target_extent_path'}; - syslog("info","FreeNAS::list_lu($object):$result_value_type : lun found $result"); + syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'"); + if ($adddev . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) { + $result = $result_value_type eq "lun-id" ? $lun->{$freenas_api_variables->{'lunid'}} : $adddev . $lun->{$freenas_api_variables->{'extentpath'}}; + syslog("info",(caller(0))[3] . "($object) '$result_value_type' found $result"); last; } } if(!defined($result)) { - syslog("info","FreeNAS::list_lu($object):$result_value_type : lun not found"); + syslog("info", (caller(0))[3] . "($object) : $result_value_type : lun not found"); } return $result; @@ -116,12 +186,16 @@ sub run_list_lu { sub run_list_extent { my ($scfg, $timeout, $method, @params) = @_; my $object = $params[0]; - my $result = undef; + syslog("info", (caller(0))[3] . " : called with (method=$method; object=$object)"); + + my $adddev = ($freenas_api_version eq "v2.0") ? "/dev/" : ""; + my $result = undef; my $luns = freenas_list_lu($scfg); foreach my $lun (@$luns) { - if ($lun->{'iscsi_target_extent_path'} =~ /^$object$/) { - $result = $lun->{'iscsi_target_extent_naa'}; + syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'"); + if ($adddev . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) { + $result = $lun->{$freenas_api_variables->{'extentnaa'}}; syslog("info","FreeNAS::list_extent($object): naa found $result"); last; } @@ -138,8 +212,10 @@ sub run_list_extent { # sub run_create_lu { my ($scfg, $timeout, $method, @params) = @_; - my $lun_path = $params[0]; + + syslog("info", (caller(0))[3] . " : called with (method=$method; param[0]=$lun_path)"); + my $lun_id = freenas_get_first_available_lunid($scfg); die "Maximum number of LUNs per target is $MAX_LUNS" if scalar $lun_id >= $MAX_LUNS; @@ -155,7 +231,7 @@ sub run_create_lu { my $link = freenas_iscsi_create_target_to_extent($scfg, $target_id, $extent->{'id'}, $lun_id); if (defined($link)) { - syslog("info","FreeNAS::create_lu(lun_path=$lun_path, lun_id=$lun_id) : sucessfull"); + syslog("info","FreeNAS::create_lu(lun_path=$lun_path, lun_id=$lun_id) : successful"); } else { die "Unable to create lun $lun_path"; } @@ -168,16 +244,18 @@ sub run_create_lu { # sub run_delete_lu { my ($scfg, $timeout, $method, @params) = @_; - my $lun_path = $params[0]; + + syslog("info", (caller(0))[3] . " : called with (method=$method; param[0]=$lun_path)"); + + my $adddev = ($freenas_api_version eq "v2.0") ? "/dev/" : ""; my $luns = freenas_list_lu($scfg); my $lun = undef; my $link = undef; - foreach my $item (@$luns) { - if($item->{'iscsi_target_extent_path'} =~ /^$lun_path$/) { - $lun = $item; - last; + if($adddev . $item->{ $freenas_api_variables->{'extentpath'}} eq $lun_path) { + $lun = $item; + last; } } @@ -189,25 +267,26 @@ sub run_delete_lu { # find the target to extent my $target2extents = freenas_iscsi_get_target_to_extent($scfg); + syslog("info", (caller(0))[3] . " : searching for 'targetextent' with (target_id=$target_id; lun_id=$lun->{$freenas_api_variables->{'lunid'}}; extent_id=$lun->{id})"); foreach my $item (@$target2extents) { - if($item->{'iscsi_target'} == $target_id && - $item->{'iscsi_lunid'} == $lun->{'iscsi_lunid'} && - $item->{'iscsi_extent'} == $lun->{'id'}) { - + if($item->{$freenas_api_variables->{'targetid'}} == $target_id && + $item->{$freenas_api_variables->{'lunid'}} == $lun->{$freenas_api_variables->{'lunid'}} && + $item->{$freenas_api_variables->{'extentid'}} == $lun->{'id'}) { $link = $item; + syslog("info", (caller(0))[3] . " : found 'targetextent'(target_id=$item->{$freenas_api_variables->{'targetid'}}; lun_id=$item->{$freenas_api_variables->{'lunid'}}; extent_id=$item->{$freenas_api_variables->{'extentid'}})"); last; } } die "Unable to find the link for the lun $lun_path for $scfg->{target}" if !defined($link); - # Remove the link - my $remove_link = freenas_iscsi_remove_target_to_extent($scfg, $link->{'id'}); - # Remove the extent my $remove_extent = freenas_iscsi_remove_extent($scfg, $lun->{'id'}); + # Remove the link + my $remove_link = freenas_iscsi_remove_target_to_extent($scfg, $link->{'id'}); + if($remove_link == 1 && $remove_extent == 1) { - syslog("info","FreeNAS::delete_lu(lun_path=$lun_path) : sucessfull"); + syslog("info", (caller(0))[3] . "(lun_path=$lun_path) : successful"); } else { die "Unable to delete lun $lun_path"; } @@ -216,10 +295,14 @@ sub run_delete_lu { } # -### FREENAS API CALLING ### +# Check to see what FreeNAS version we are running and set +# the FreeNAS.pm to use the correct API version of FreeNAS # -sub freenas_api_call { - my ($scfg, $method, $path, $data) = @_; +sub freenas_api_check { + my ($scfg, $timeout) = @_; + + syslog("info", (caller(0))[3] . " : called"); + my $client = undef; my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http"; my $apihost = defined($scfg->{freenas_apiv4_host}) ? $scfg->{freenas_apiv4_host} : $scfg->{portal}; @@ -227,8 +310,8 @@ sub freenas_api_call { $client = REST::Client->new(); $client->setHost($scheme . '://' . $apihost); - $client->addHeader('Content-Type' , 'application/json'); - $client->addHeader('Authorization' , 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); + $client->addHeader('Content-Type', 'application/json'); + $client->addHeader('Authorization', 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); # If using SSL, don't verify SSL certs if ($scfg->{freenas_use_ssl}) { $client->getUseragent()->ssl_opts(verify_hostname => 0); @@ -240,16 +323,48 @@ sub freenas_api_call { freenas_api_log_error($client, "freenas_api_call"); die "Unable to connect to the FreeNAS API service at '" . $apihost . "' using the '" . $scheme . "' protocol"; } - syslog("info","FreeNAS::api_call : setup : sucessfull"); + my $result = decode_json($client->responseContent()); + syslog("info", (caller(0))[3] . " : successful : Server version: " . $result->{'fullversion'}); + $result->{'fullversion'} =~ s/^(\w+)\-(\d+)\.(\d+)\-U(\d+)\.?(\d?)//; + my $freenas_version = sprintf("%02d%02d%02d%02d", $2, $3, $4, $5); + syslog("info", (caller(0))[3] . " : ". $1 . " Unformatted Version: " . $freenas_version); + if ($freenas_version >= 11030100) { + $freenas_api_version = "v2.0"; + } + syslog("info", (caller(0))[3] . " : Using " . $1 ." API version " . $freenas_api_version); + $freenas_api_methods = $freenas_api_version_methods->{$freenas_api_version}; + $freenas_api_variables = $freenas_api_version_variables->{$freenas_api_version}; +} + +# +### FREENAS API CALLING ### +# +sub freenas_api_call { + my ($scfg, $method, $path, $data) = @_; + my $client = undef; + my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http"; + my $apihost = defined($scfg->{freenas_apiv4_host}) ? $scfg->{freenas_apiv4_host} : $scfg->{portal}; + + $client = REST::Client->new(); + $client->setHost($scheme . '://' . $apihost); + $client->addHeader('Content-Type' , 'application/json'); + $client->addHeader('Authorization' , 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); + # If using SSL, don't verify SSL certs + if ($scfg->{freenas_use_ssl}) { + $client->getUseragent()->ssl_opts(verify_hostname => 0); + $client->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE); + } + my $json_data = (defined $data) ? encode_json($data) : undef; if ($method eq 'GET') { - $client->GET($path); + $client->GET($path, $json_data); } if ($method eq 'DELETE') { - $client->DELETE($path); + $client->DELETE($path, $json_data); } if ($method eq 'POST') { - $client->POST($path, encode_json($data)); + $client->POST($path, $json_data); } + syslog("info", (caller(0))[3] . " : successful"); return $client } @@ -269,12 +384,13 @@ sub freenas_api_log_error { # sub freenas_iscsi_get_globalconfiguration { my ($scfg) = @_; - my $client = freenas_api_call($scfg, 'GET', "/api/v1.0/services/iscsi/globalconfiguration/", undef); + syslog("info", (caller(0))[3] . " : called"); + my $client = freenas_api_call($scfg, 'GET', "$freenas_api_methods->{'config'}", undef); my $code = $client->responseCode(); if ($code == 200) { my $result = decode_json($client->responseContent()); - syslog("info","FreeNAS::API::get_globalconfig : target_basename=" . $result->{'iscsi_basename'}); + syslog("info", (caller(0))[3] . " : target_basename=" . $result->{$freenas_api_variables->{'basename'}}); return $result; } else { freenas_api_log_error($client, "get_globalconfig"); @@ -288,12 +404,14 @@ sub freenas_iscsi_get_globalconfiguration { # sub freenas_iscsi_get_extent { my ($scfg) = @_; - my $client = freenas_api_call($scfg, 'GET', "/api/v1.0/services/iscsi/extent/?limit=0", undef); + syslog("info", (caller(0))[3] . " : called"); + + my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'extent'} . "?limit=0", undef); my $code = $client->responseCode(); if ($code == 200) { my $result = decode_json($client->responseContent()); - syslog("info","FreeNAS::API::get_extent : sucessfull"); + syslog("info", (caller(0))[3] . " : successful"); return $result; } else { freenas_api_log_error($client, "get_extent"); @@ -311,6 +429,8 @@ sub freenas_iscsi_get_extent { sub freenas_iscsi_create_extent { my ($scfg, $lun_path) = @_; + syslog("info", (caller(0))[3] . " : called with (lun_path=$lun_path)"); + my $name = $lun_path; $name =~ s/^.*\///; # all from last / $name = $scfg->{'pool'} . '/' . $name; @@ -319,16 +439,23 @@ sub freenas_iscsi_create_extent { $device =~ s/^\/dev\///; # strip /dev/ my $request = { - "iscsi_target_extent_type" => "Disk", - "iscsi_target_extent_name" => $name, - "iscsi_target_extent_disk" => $device, + "v1.0" => { + "iscsi_target_extent_type" => "Disk", + "iscsi_target_extent_name" => $name, + "iscsi_target_extent_disk" => $device, + }, + "v2.0" => { + "type" => "DISK", + "name" => $name, + "disk" => $device, + }, }; - my $client = freenas_api_call($scfg, 'POST', "/api/v1.0/services/iscsi/extent/", $request); + my $client = freenas_api_call($scfg, 'POST', $freenas_api_methods->{'extent'}, $request->{$freenas_api_version}); my $code = $client->responseCode(); - if ($code == 201) { + if ($code == 200 || $code == 201) { my $result = decode_json($client->responseContent()); - syslog("info", "FreeNAS::API::create_extent(lun_path=" . $result->{'iscsi_target_extent_path'} . ") : sucessfull"); + syslog("info", "FreeNAS::API::create_extent(lun_path=" . $result->{$freenas_api_variables->{'extentpath'}} . ") : successful"); return $result; } else { freenas_api_log_error($client, "create_extent"); @@ -345,11 +472,18 @@ sub freenas_iscsi_create_extent { # sub freenas_iscsi_remove_extent { my ($scfg, $extent_id) = @_; + my $request = { + "v2.0" => { + "remove" => \1, + "force" => \1, + }, + }; - my $client = freenas_api_call($scfg, 'DELETE', "/api/v1.0/services/iscsi/extent/$extent_id/", undef); + syslog("info", (caller(0))[3] . " : called with (extent_id=$extent_id)"); + my $client = freenas_api_call($scfg, 'DELETE', $freenas_api_methods->{'extent'} . (($freenas_api_version eq "v2.0") ? "id/" : "") . "$extent_id/", $request->{$freenas_api_version}); my $code = $client->responseCode(); - if ($code == 204) { - syslog("info","FreeNAS::API::remove_extent(extent_id=$extent_id) : sucessfull"); + if ($code == 200 || $code == 204) { + syslog("info", (caller(0))[3] . "(extent_id=$extent_id) : successful"); return 1; } else { freenas_api_log_error($client, "remove_extent"); @@ -364,11 +498,13 @@ sub freenas_iscsi_remove_extent { sub freenas_iscsi_get_target { my ($scfg) = @_; - my $client = freenas_api_call($scfg, 'GET', "/api/v1.0/services/iscsi/target/?limit=0", undef); + syslog("info", (caller(0))[3] . " : called"); + + my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'target'} . "?limit=0", undef); my $code = $client->responseCode(); if ($code == 200) { my $result = decode_json($client->responseContent()); - syslog("info","FreeNAS::API::get_target() : sucessfull"); + syslog("info", (caller(0))[3] . " : successful"); return $result; } else { freenas_api_log_error($client, "get_target"); @@ -383,18 +519,20 @@ sub freenas_iscsi_get_target { sub freenas_iscsi_get_target_to_extent { my ($scfg) = @_; - my $client = freenas_api_call($scfg, 'GET', "/api/v1.0/services/iscsi/targettoextent/?limit=0", undef); + syslog("info", (caller(0))[3] . " : called"); + + my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'targetextent'} . "?limit=0", undef); my $code = $client->responseCode(); if ($code == 200) { my $result = decode_json($client->responseContent()); - syslog("info","FreeNAS::API::get_target_to_extent() : sucessfull"); + syslog("info", (caller(0))[3] . " : successful"); # If 'iscsi_lunid' is undef then it is set to 'Auto' in FreeNAS # which should be '0' in our eyes. # This gave Proxmox 5.x and FreeNAS 11.1 a few issues. foreach my $item (@$result) { - if (!defined($item->{'iscsi_lunid'})) { - $item->{'iscsi_lunid'} = 0; - syslog("info", "FreeNAS::API::get_target_to_extent() : change undef iscsi_lunid to 0"); + if (!defined($item->{$freenas_api_variables->{'lunid'}})) { + $item->{$freenas_api_variables->{'lunid'}} = 0; + syslog("info", (caller(0))[3] . " : change undef iscsi_lunid to 0"); } } return $result; @@ -416,17 +554,26 @@ sub freenas_iscsi_get_target_to_extent { sub freenas_iscsi_create_target_to_extent { my ($scfg, $target_id, $extent_id, $lun_id) = @_; + syslog("info", (caller(0))[3] . " : called with (target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id)"); + my $request = { - "iscsi_target" => $target_id, - "iscsi_extent" => $extent_id, - "iscsi_lunid" => $lun_id + "v1.0" => { + "iscsi_target" => $target_id, + "iscsi_extent" => $extent_id, + "iscsi_lunid" => $lun_id, + }, + "v2.0" => { + "target" => $target_id, + "extent" => $extent_id, + "lunid" => $lun_id, + }, }; - my $client = freenas_api_call($scfg, 'POST', "/api/v1.0/services/iscsi/targettoextent/", $request); + my $client = freenas_api_call($scfg, 'POST', $freenas_api_methods->{'targetextent'}, $request->{$freenas_api_version}); my $code = $client->responseCode(); - if ($code == 201) { + if ($code == 200 || $code == 201) { my $result = decode_json($client->responseContent()); - syslog("info","FreeNAS::API::create_target_to_extent(target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id) : sucessfull"); + syslog("info", (caller(0))[3] . "(target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id) : successful"); return $result; } else { freenas_api_log_error($client, "create_target_to_extent"); @@ -444,10 +591,17 @@ sub freenas_iscsi_create_target_to_extent { sub freenas_iscsi_remove_target_to_extent { my ($scfg, $link_id) = @_; - my $client = freenas_api_call($scfg, 'DELETE', "/api/v1.0/services/iscsi/targettoextent/$link_id/", undef); + syslog("info", (caller(0))[3] . " : called with (link_id=$link_id)"); + + if ($freenas_api_version eq "v2.0") { + syslog("info", (caller(0))[3] . "(link_id=$link_id) : V2.0 API's so NOT Needed...successful"); + return 1; + } + + my $client = freenas_api_call($scfg, 'DELETE', $freenas_api_methods->{'targetextent'} . (($freenas_api_version eq "v2.0") ? "id/" : "") . "$link_id/", undef); my $code = $client->responseCode(); - if ($code == 204) { - syslog("info","FreeNAS::API::remove_target_to_extent(link_id=$link_id) : sucessfull"); + if ($code == 200 || $code == 204) { + syslog("info", (caller(0))[3] . "(link_id=$link_id) : successful"); return 1; } else { freenas_api_log_error($client, "remove_target_to_extent"); @@ -463,6 +617,8 @@ sub freenas_iscsi_remove_target_to_extent { sub freenas_list_lu { my ($scfg) = @_; + syslog("info", (caller(0))[3] . " : called"); + my $targets = freenas_iscsi_get_target($scfg); my $target_id = freenas_get_targetid($scfg); @@ -474,23 +630,23 @@ sub freenas_list_lu { my $extents = freenas_iscsi_get_extent($scfg); foreach my $item (@$target2extents) { - if($item->{'iscsi_target'} == $target_id) { + if($item->{$freenas_api_variables->{'targetid'}} == $target_id) { foreach my $node (@$extents) { - if($node->{'id'} == $item->{'iscsi_extent'}) { - if ($item->{'iscsi_lunid'} =~ /(\d+)/) { + if($node->{'id'} == $item->{$freenas_api_variables->{'extentid'}}) { + if ($item->{$freenas_api_variables->{'lunid'}} =~ /(\d+)/) { $iscsi_lunid = "$1"; } else { - syslog("info", "FreeNAS::API::freenas_list_lu : iscsi_lunid did not pass tainted testing"); + syslog("info", (caller(0))[3] . " : iscsi_lunid did not pass tainted testing"); next; } - $node->{'iscsi_lunid'} .= $iscsi_lunid; + $node->{$freenas_api_variables->{'lunid'}} .= $iscsi_lunid; push(@luns , $node); } } } } } - syslog("info", "FreeNAS::API::freenas_list_lu : sucessfull"); + syslog("info", (caller(0))[3] . " : successful"); return \@luns; } @@ -500,12 +656,14 @@ sub freenas_list_lu { sub freenas_get_first_available_lunid { my ($scfg) = @_; + syslog("info", (caller(0))[3] . " : called"); + my $target_id = freenas_get_targetid($scfg); my $target2extents = freenas_iscsi_get_target_to_extent($scfg); my @luns = (); foreach my $item (@$target2extents) { - push(@luns, $item->{'iscsi_lunid'}) if ($item->{'iscsi_target'} == $target_id); + push(@luns, $item->{$freenas_api_variables->{'lunid'}}) if ($item->{$freenas_api_variables->{'targetid'}} == $target_id); } my @sorted_luns = sort {$a <=> $b} @luns; @@ -517,7 +675,7 @@ sub freenas_get_first_available_lunid { $lun_id = $lun_id + 1; } - syslog("info", "FreeNAS::API::freenas_get_first_available_lunid : return $lun_id"); + syslog("info", (caller(0))[3] . " : $lun_id"); return $lun_id; } @@ -527,18 +685,20 @@ sub freenas_get_first_available_lunid { sub freenas_get_targetid { my ($scfg) = @_; + syslog("info", (caller(0))[3] . " : called"); + my $global = freenas_iscsi_get_globalconfiguration($scfg); my $targets = freenas_iscsi_get_target($scfg); my $target_id = undef; foreach my $target (@$targets) { - my $iqn = $global->{'iscsi_basename'} . ':' . $target->{'iscsi_target_name'}; + my $iqn = $global->{$freenas_api_variables->{'basename'}} . ':' . $target->{$freenas_api_variables->{'targetname'}}; if($iqn eq $scfg->{target}) { $target_id = $target->{'id'}; last; } } - + syslog("info", (caller(0))[3] . " : successful : $target_id"); return $target_id; } diff --git a/perl5/REST/Client.pm b/perl5/REST/Client.pm index fa35fec..1b23167 100644 --- a/perl5/REST/Client.pm +++ b/perl5/REST/Client.pm @@ -233,9 +233,7 @@ Preform an HTTP GET to the resource specified. Takes an optional hashref of cust sub GET { my $self = shift; - my $url = shift; - my $headers = shift; - return $self->request('GET', $url, undef, $headers); + return $self->request('GET', @_); } =head3 PUT ($url, [$body_content, %$headers] ) @@ -279,9 +277,7 @@ Preform an HTTP DELETE to the resource specified. Takes an optional hashref of c sub DELETE { my $self = shift; - my $url = shift; - my $headers = shift; - return $self->request('DELETE', $url, undef, $headers); + return $self->request('DELETE', @_); } =head3 OPTIONS ( $url, [%$headers] )