Code efficiency improvements.

- Cleaned up the API calling routine so it will only create one instance
of the REST::Client module. Typically was 10 to 30+ instances per VM
disk CRUD.
- Due to this some variables needed to be “global” to the plugin.
- Removed some superfluous hashes and variables.
- Repetitive code reduced to only on call.
- Created one “Frankenstein” hash that retains all API methods,
variables and json body structures for each API version used by the
plugin.
- One call to the global configuration in the version check to reduce
execution time.
- Cleanup some code and formatting.
- Added some comments.
This commit is contained in:
Kevin Scott Adams 2020-06-11 12:49:28 -04:00
parent 977b00a178
commit aa11d596bd
1 changed files with 190 additions and 176 deletions

View File

@ -12,65 +12,97 @@ use JSON;
# Max LUNS per target on the iSCSI server # Max LUNS per target on the iSCSI server
my $MAX_LUNS = 255; my $MAX_LUNS = 255;
my $freenas_rest_connection = undef;
my $freenas_global_config = undef;
my $dev_prefix = "";
my $product_name = undef;
# FreeNAS API Definitions # FreeNAS API Definitions
my $freenas_api_version = "v1.0"; my $freenas_api_version = "v1.0"; # Default to v1.0 of the API's
my $freenas_api_methods = undef; my $freenas_api_methods = undef; # API Methods Nested HASH Ref
my $freenas_api_variables = undef; my $freenas_api_variables = undef; # API Variable Nested HASH Ref
my $freenas_api_version_methods = {
#
my $freenas_api_version_matrix = {
"v1.0" => { "v1.0" => {
"config" => "/api/v1.0/services/iscsi/globalconfiguration/", "methods" => {
"target" => "/api/v1.0/services/iscsi/target/", "config" => {
"extent" => "/api/v1.0/services/iscsi/extent/", "resource" => "/api/v1.0/services/iscsi/globalconfiguration/",
"targetextent" => "/api/v1.0/services/iscsi/targettoextent/", },
"target" => {
"resource" => "/api/v1.0/services/iscsi/target/",
},
"extent" => {
"resource" => "/api/v1.0/services/iscsi/extent/",
"post_body" => {
"iscsi_target_extent_type" => "Disk",
"iscsi_target_extent_name" => "\$name",
"iscsi_target_extent_disk" => "\$device",
},
},
"targetextent" => {
"resource" => "/api/v1.0/services/iscsi/targettoextent/",
"post_body" => {
"iscsi_target" => "\$target_id",
"iscsi_extent" => "\$extent_id",
"iscsi_lunid" => "\$lun_id",
},
},
},
"variables" => {
"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" => { "v2.0" => {
"config" => "/api/v2.0/iscsi/global", "methods" => {
"target" => "/api/v2.0/iscsi/target/", "config" => {
"extent" => "/api/v2.0/iscsi/extent/", "resource" => "/api/v2.0/iscsi/global",
"targetextent" => "/api/v2.0/iscsi/targetextent/", },
"target" => {
"resource" => "/api/v2.0/iscsi/target/",
},
"extent" => {
"resource" => "/api/v2.0/iscsi/extent/",
"delete_body" => {
"remove" => \1,
"force" => \1,
},
"post_body" => {
"type" => "DISK",
"name" => "\$name",
"disk" => "\$device",
},
},
"targetextent" => {
"resource" => "/api/v2.0/iscsi/targetextent/",
"delete_body" => {
"force" => \1,
},
"post_body" => {
"target" => "\$target_id",
"extent" => "\$extent_id",
"lunid" => "\$lun_id",
},
},
},
"variables" => {
"basename" => "basename",
"lunid" => "lunid",
"extentid" => "extent",
"targetid" => "target",
"extentpath" => "path",
"extentnaa" => "naa",
"targetname" => "name",
},
}, },
}; };
#
#
#
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",
},
};
# #
# #
@ -79,6 +111,7 @@ sub get_base {
return '/dev/zvol'; return '/dev/zvol';
} }
# #
# #
# #
@ -162,13 +195,12 @@ sub run_list_lu {
my $object = $params[0]; my $object = $params[0];
syslog("info", (caller(0))[3] . " : called with (method=$method; result_value_type=$result_value_type; object=$object)"); 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 $result = undef;
my $luns = freenas_list_lu($scfg); my $luns = freenas_list_lu($scfg);
foreach my $lun (@$luns) { foreach my $lun (@$luns) {
syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'"); syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'");
if ($adddev . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) { if ($dev_prefix . $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'}}; $result = $result_value_type eq "lun-id" ? $lun->{$freenas_api_variables->{'lunid'}} : $dev_prefix . $lun->{$freenas_api_variables->{'extentpath'}};
syslog("info",(caller(0))[3] . "($object) '$result_value_type' found $result"); syslog("info",(caller(0))[3] . "($object) '$result_value_type' found $result");
last; last;
} }
@ -189,12 +221,11 @@ sub run_list_extent {
syslog("info", (caller(0))[3] . " : called with (method=$method; object=$object)"); syslog("info", (caller(0))[3] . " : called with (method=$method; object=$object)");
my $adddev = ($freenas_api_version eq "v2.0") ? "/dev/" : "";
my $result = undef; my $result = undef;
my $luns = freenas_list_lu($scfg); my $luns = freenas_list_lu($scfg);
foreach my $lun (@$luns) { foreach my $lun (@$luns) {
syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'"); syslog("info", (caller(0))[3] . " : Verifing '$lun->{$freenas_api_variables->{'extentpath'}}' and '$object'");
if ($adddev . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) { if ($dev_prefix . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) {
$result = $lun->{$freenas_api_variables->{'extentnaa'}}; $result = $lun->{$freenas_api_variables->{'extentnaa'}};
syslog("info","FreeNAS::list_extent($object): naa found $result"); syslog("info","FreeNAS::list_extent($object): naa found $result");
last; last;
@ -248,12 +279,11 @@ sub run_delete_lu {
syslog("info", (caller(0))[3] . " : called with (method=$method; param[0]=$lun_path)"); 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 $luns = freenas_list_lu($scfg);
my $lun = undef; my $lun = undef;
my $link = undef; my $link = undef;
foreach my $item (@$luns) { foreach my $item (@$luns) {
if($adddev . $item->{ $freenas_api_variables->{'extentpath'}} eq $lun_path) { if($dev_prefix . $item->{ $freenas_api_variables->{'extentpath'}} eq $lun_path) {
$lun = $item; $lun = $item;
last; last;
} }
@ -294,6 +324,33 @@ sub run_delete_lu {
return ""; return "";
} }
sub freenas_api_connect {
my ($scfg) = @_;
syslog("info", (caller(0))[3] . " : called");
my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http";
my $apihost = defined($scfg->{freenas_apiv4_host}) ? $scfg->{freenas_apiv4_host} : $scfg->{portal};
my $apiping = '/api/v1.0/system/version/';
$freenas_rest_connection = REST::Client->new();
$freenas_rest_connection->setHost($scheme . '://' . $apihost);
$freenas_rest_connection->addHeader('Content-Type', 'application/json');
$freenas_rest_connection->addHeader('Authorization', 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password}));
# If using SSL, don't verify SSL certs
if ($scfg->{freenas_use_ssl}) {
$freenas_rest_connection->getUseragent()->ssl_opts(verify_hostname => 0);
$freenas_rest_connection->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE);
}
# Check if the APIs are accessable via the selected host and scheme
my $code = $freenas_rest_connection->request('GET', $apiping)->responseCode();
if ($code != 200) {
freenas_api_log_error($freenas_rest_connection, "freenas_api_call");
die "Unable to connect to the FreeNAS API service at '" . $apihost . "' using the '" . $scheme . "' protocol";
}
}
# #
# Check to see what FreeNAS version we are running and set # Check to see what FreeNAS version we are running and set
# the FreeNAS.pm to use the correct API version of FreeNAS # the FreeNAS.pm to use the correct API version of FreeNAS
@ -303,79 +360,59 @@ sub freenas_api_check {
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $client = undef; if (! defined $freenas_rest_connection) {
my $scheme = $scfg->{freenas_use_ssl} ? "https" : "http"; freenas_api_connect($scfg);
my $apihost = defined($scfg->{freenas_apiv4_host}) ? $scfg->{freenas_apiv4_host} : $scfg->{portal}; my $result = decode_json($freenas_rest_connection->responseContent());
my $apiping = '/api/v1.0/system/version/'; syslog("info", (caller(0))[3] . " : successful : Server version: " . $result->{'fullversion'});
$result->{'fullversion'} =~ s/^(\w+)\-(\d+)\.(\d+)\-U(\d+)\.?(\d?)//;
$client = REST::Client->new(); my $freenas_version = sprintf("%02d%02d%02d%02d", $2, $3, $4, $5);
$client->setHost($scheme . '://' . $apihost); $product_name = $1;
$client->addHeader('Content-Type', 'application/json'); syslog("info", (caller(0))[3] . " : ". $product_name . " Unformatted Version: " . $freenas_version);
$client->addHeader('Authorization', 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); if ($freenas_version >= 11030100) {
# If using SSL, don't verify SSL certs $freenas_api_version = "v2.0";
if ($scfg->{freenas_use_ssl}) { $dev_prefix = "/dev/";
$client->getUseragent()->ssl_opts(verify_hostname => 0); }
$client->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE); } else {
syslog("info", (caller(0))[3] . " : REST Client already initialized");
} }
# Check if the APIs are accessable via the selected host and scheme syslog("info", (caller(0))[3] . " : Using " . $product_name ." API version " . $freenas_api_version);
my $code = $client->request('GET', $apiping)->responseCode(); $freenas_api_methods = $freenas_api_version_matrix->{$freenas_api_version}->{'methods'};
if ($code != 200) { $freenas_api_variables = $freenas_api_version_matrix->{$freenas_api_version}->{'variables'};
freenas_api_log_error($client, "freenas_api_call"); $freenas_global_config = (!defined($freenas_global_config)) ? freenas_iscsi_get_globalconfiguration($scfg) : $freenas_global_config;
die "Unable to connect to the FreeNAS API service at '" . $apihost . "' using the '" . $scheme . "' protocol"; return;
}
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 ### ### FREENAS API CALLING ROUTINE ###
# #
sub freenas_api_call { sub freenas_api_call {
my ($scfg, $method, $path, $data) = @_; 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(); syslog("info", (caller(0))[3] . " : called");
$client->setHost($scheme . '://' . $apihost);
$client->addHeader('Content-Type' , 'application/json'); $method = uc($method);
$client->addHeader('Authorization' , 'Basic ' . encode_base64($scfg->{freenas_user} . ':' . $scfg->{freenas_password})); if (! $method =~ /^(?>GET|DELETE|POST)$/) {
# If using SSL, don't verify SSL certs syslog("info", (caller(0))[3] . " : Invalid HTTP RESTful service method '$method'");
if ($scfg->{freenas_use_ssl}) { die "Invalid HTTP RESTful service method '$method' used.";
$client->getUseragent()->ssl_opts(verify_hostname => 0); }
$client->getUseragent()->ssl_opts(SSL_verify_mode => SSL_VERIFY_NONE);
if (! defined $freenas_rest_connection) {
freenas_api_check($scfg);
} }
my $json_data = (defined $data) ? encode_json($data) : undef; my $json_data = (defined $data) ? encode_json($data) : undef;
if ($method eq 'GET') { $freenas_rest_connection->$method($path, $json_data);
$client->GET($path, $json_data);
}
if ($method eq 'DELETE') {
$client->DELETE($path, $json_data);
}
if ($method eq 'POST') {
$client->POST($path, $json_data);
}
syslog("info", (caller(0))[3] . " : successful"); syslog("info", (caller(0))[3] . " : successful");
return;
return $client
} }
# #
# Writes the Response and Content to SysLog # Writes the Response and Content to SysLog
# #
sub freenas_api_log_error { sub freenas_api_log_error {
my ($client, $method) = @_; my ($method) = @_;
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response code: " . $client->responseCode()); syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response code: " . $freenas_rest_connection->responseCode());
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response content: " . $client->responseContent()); syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response content: " . $freenas_rest_connection->responseContent());
return 1; return 1;
} }
@ -385,15 +422,15 @@ sub freenas_api_log_error {
sub freenas_iscsi_get_globalconfiguration { sub freenas_iscsi_get_globalconfiguration {
my ($scfg) = @_; my ($scfg) = @_;
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $client = freenas_api_call($scfg, 'GET', "$freenas_api_methods->{'config'}", undef); freenas_api_call($scfg, 'GET', $freenas_api_methods->{'config'}->{'resource'}, $freenas_api_methods->{'config'}->{'get'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200) { if ($code == 200) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", (caller(0))[3] . " : target_basename=" . $result->{$freenas_api_variables->{'basename'}}); syslog("info", (caller(0))[3] . " : target_basename=" . $result->{$freenas_api_variables->{'basename'}});
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "get_globalconfig"); freenas_api_log_error("get_globalconfig");
return undef; return undef;
} }
} }
@ -407,14 +444,14 @@ sub freenas_iscsi_get_extent {
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'extent'} . "?limit=0", undef); freenas_api_call($scfg, 'GET', $freenas_api_methods->{'extent'}->{'resource'} . "?limit=0", $freenas_api_methods->{'extent'}->{'get'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200) { if ($code == 200) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", (caller(0))[3] . " : successful"); syslog("info", (caller(0))[3] . " : successful");
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "get_extent"); freenas_api_log_error("get_extent");
return undef; return undef;
} }
} }
@ -438,27 +475,19 @@ sub freenas_iscsi_create_extent {
my $device = $lun_path; my $device = $lun_path;
$device =~ s/^\/dev\///; # strip /dev/ $device =~ s/^\/dev\///; # strip /dev/
my $request = { my $post_body = {};
"v1.0" => { while ((my $key, my $value) = each %{$freenas_api_methods->{'extent'}->{'post_body'}}) {
"iscsi_target_extent_type" => "Disk", $post_body->{$key} = ($value =~ /^\$.+$/) ? eval $value : $value;
"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', $freenas_api_methods->{'extent'}, $request->{$freenas_api_version}); freenas_api_call($scfg, 'POST', $freenas_api_methods->{'extent'}->{'resource'}, $post_body);
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200 || $code == 201) { if ($code == 200 || $code == 201) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", "FreeNAS::API::create_extent(lun_path=" . $result->{$freenas_api_variables->{'extentpath'}} . ") : successful"); syslog("info", "FreeNAS::API::create_extent(lun_path=" . $result->{$freenas_api_variables->{'extentpath'}} . ") : successful");
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "create_extent"); freenas_api_log_error("create_extent");
return undef; return undef;
} }
} }
@ -472,21 +501,15 @@ sub freenas_iscsi_create_extent {
# #
sub freenas_iscsi_remove_extent { sub freenas_iscsi_remove_extent {
my ($scfg, $extent_id) = @_; my ($scfg, $extent_id) = @_;
my $request = {
"v2.0" => {
"remove" => \1,
"force" => \1,
},
};
syslog("info", (caller(0))[3] . " : called with (extent_id=$extent_id)"); 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}); freenas_api_call($scfg, 'DELETE', $freenas_api_methods->{'extent'}->{'resource'} . (($freenas_api_version eq "v2.0") ? "id/" : "") . "$extent_id/", $freenas_api_methods->{'extent'}->{'delete_body'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200 || $code == 204) { if ($code == 200 || $code == 204) {
syslog("info", (caller(0))[3] . "(extent_id=$extent_id) : successful"); syslog("info", (caller(0))[3] . "(extent_id=$extent_id) : successful");
return 1; return 1;
} else { } else {
freenas_api_log_error($client, "remove_extent"); freenas_api_log_error("remove_extent");
return 0; return 0;
} }
} }
@ -500,14 +523,14 @@ sub freenas_iscsi_get_target {
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'target'} . "?limit=0", undef); freenas_api_call($scfg, 'GET', $freenas_api_methods->{'target'}->{'resource'} . "?limit=0", $freenas_api_methods->{'target'}->{'get'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200) { if ($code == 200) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", (caller(0))[3] . " : successful"); syslog("info", (caller(0))[3] . " : successful");
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "get_target"); freenas_api_log_error("get_target");
return undef; return undef;
} }
} }
@ -521,10 +544,10 @@ sub freenas_iscsi_get_target_to_extent {
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'targetextent'} . "?limit=0", undef); freenas_api_call($scfg, 'GET', $freenas_api_methods->{'targetextent'}->{'resource'} . "?limit=0", $freenas_api_methods->{'targetextent'}->{'get'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200) { if ($code == 200) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", (caller(0))[3] . " : successful"); syslog("info", (caller(0))[3] . " : successful");
# If 'iscsi_lunid' is undef then it is set to 'Auto' in FreeNAS # If 'iscsi_lunid' is undef then it is set to 'Auto' in FreeNAS
# which should be '0' in our eyes. # which should be '0' in our eyes.
@ -537,7 +560,7 @@ sub freenas_iscsi_get_target_to_extent {
} }
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "get_target_to_extent"); freenas_api_log_error("get_target_to_extent");
return undef; return undef;
} }
} }
@ -556,27 +579,19 @@ sub freenas_iscsi_create_target_to_extent {
syslog("info", (caller(0))[3] . " : called with (target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id)"); syslog("info", (caller(0))[3] . " : called with (target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id)");
my $request = { my $post_body = {};
"v1.0" => { while ((my $key, my $value) = each %{$freenas_api_methods->{'targetextent'}->{'post_body'}}) {
"iscsi_target" => $target_id, $post_body->{$key} = ($value =~ /^\$.+$/) ? eval $value : $value;
"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', $freenas_api_methods->{'targetextent'}, $request->{$freenas_api_version}); freenas_api_call($scfg, 'POST', $freenas_api_methods->{'targetextent'}->{'resource'}, $post_body);
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200 || $code == 201) { if ($code == 200 || $code == 201) {
my $result = decode_json($client->responseContent()); my $result = decode_json($freenas_rest_connection->responseContent());
syslog("info", (caller(0))[3] . "(target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id) : successful"); syslog("info", (caller(0))[3] . "(target_id=$target_id, extent_id=$extent_id, lun_id=$lun_id) : successful");
return $result; return $result;
} else { } else {
freenas_api_log_error($client, "create_target_to_extent"); freenas_api_log_error("create_target_to_extent");
return undef; return undef;
} }
} }
@ -598,13 +613,13 @@ sub freenas_iscsi_remove_target_to_extent {
return 1; return 1;
} }
my $client = freenas_api_call($scfg, 'DELETE', $freenas_api_methods->{'targetextent'} . (($freenas_api_version eq "v2.0") ? "id/" : "") . "$link_id/", undef); freenas_api_call($scfg, 'DELETE', $freenas_api_methods->{'targetextent'}->{'resource'} . (($freenas_api_version eq "v2.0") ? "id/" : "") . "$link_id/", $freenas_api_methods->{'targetextent'}->{'delete_body'});
my $code = $client->responseCode(); my $code = $freenas_rest_connection->responseCode();
if ($code == 200 || $code == 204) { if ($code == 200 || $code == 204) {
syslog("info", (caller(0))[3] . "(link_id=$link_id) : successful"); syslog("info", (caller(0))[3] . "(link_id=$link_id) : successful");
return 1; return 1;
} else { } else {
freenas_api_log_error($client, "remove_target_to_extent"); freenas_api_log_error("remove_target_to_extent");
return 0; return 0;
} }
} }
@ -687,12 +702,11 @@ sub freenas_get_targetid {
syslog("info", (caller(0))[3] . " : called"); syslog("info", (caller(0))[3] . " : called");
my $global = freenas_iscsi_get_globalconfiguration($scfg);
my $targets = freenas_iscsi_get_target($scfg); my $targets = freenas_iscsi_get_target($scfg);
my $target_id = undef; my $target_id = undef;
foreach my $target (@$targets) { foreach my $target (@$targets) {
my $iqn = $global->{$freenas_api_variables->{'basename'}} . ':' . $target->{$freenas_api_variables->{'targetname'}}; my $iqn = $freenas_global_config->{$freenas_api_variables->{'basename'}} . ':' . $target->{$freenas_api_variables->{'targetname'}};
if($iqn eq $scfg->{target}) { if($iqn eq $scfg->{target}) {
$target_id = $target->{'id'}; $target_id = $target->{'id'};
last; last;