FreeNAS API v2.0 features

- Allows the use of FreeNAS API v2.0 so we can finally remove a VM drive
from the Proxmox VE GUI.
- Created a Frankenstein of out of FreeNAS.pm to allow 'one module to
rule them all' for v1.0 and v2.0 API's to FreeNAS.
- librest-client-perl changes so the call can have a <body/> to it on
GET and DELETE methods.
- Some spelling mistakes.
- Better syslog entries.
- More debbugging for testing purposes to the syslog.
This commit is contained in:
Kevin Scott Adams 2020-06-09 12:31:31 -04:00
parent 006dacc479
commit 977b00a178
2 changed files with 235 additions and 79 deletions

View File

@ -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;
}

View File

@ -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] )