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:
parent
977b00a178
commit
aa11d596bd
|
|
@ -12,31 +12,44 @@ use JSON;
|
|||
|
||||
# Max LUNS per target on the iSCSI server
|
||||
my $MAX_LUNS = 255;
|
||||
my $freenas_rest_connection = undef;
|
||||
my $freenas_global_config = undef;
|
||||
my $dev_prefix = "";
|
||||
my $product_name = undef;
|
||||
|
||||
# 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 = "v1.0"; # Default to v1.0 of the API's
|
||||
my $freenas_api_methods = undef; # API Methods Nested HASH Ref
|
||||
my $freenas_api_variables = undef; # API Variable Nested HASH Ref
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
my $freenas_api_version_variables = {
|
||||
my $freenas_api_version_matrix = {
|
||||
"v1.0" => {
|
||||
"methods" => {
|
||||
"config" => {
|
||||
"resource" => "/api/v1.0/services/iscsi/globalconfiguration/",
|
||||
},
|
||||
"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",
|
||||
|
|
@ -44,8 +57,41 @@ my $freenas_api_version_variables = {
|
|||
"extentpath" => "iscsi_target_extent_path",
|
||||
"extentnaa" => "iscsi_target_extent_naa",
|
||||
"targetname" => "iscsi_target_name",
|
||||
}
|
||||
},
|
||||
"v2.0" => {
|
||||
"methods" => {
|
||||
"config" => {
|
||||
"resource" => "/api/v2.0/iscsi/global",
|
||||
},
|
||||
"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",
|
||||
|
|
@ -54,23 +100,9 @@ my $freenas_api_version_variables = {
|
|||
"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';
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
|
|
@ -162,13 +195,12 @@ sub run_list_lu {
|
|||
my $object = $params[0];
|
||||
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) {
|
||||
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'}};
|
||||
if ($dev_prefix . $lun->{$freenas_api_variables->{'extentpath'}} eq $object) {
|
||||
$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");
|
||||
last;
|
||||
}
|
||||
|
|
@ -189,12 +221,11 @@ sub run_list_extent {
|
|||
|
||||
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) {
|
||||
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'}};
|
||||
syslog("info","FreeNAS::list_extent($object): naa found $result");
|
||||
last;
|
||||
|
|
@ -248,12 +279,11 @@ sub run_delete_lu {
|
|||
|
||||
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($adddev . $item->{ $freenas_api_variables->{'extentpath'}} eq $lun_path) {
|
||||
if($dev_prefix . $item->{ $freenas_api_variables->{'extentpath'}} eq $lun_path) {
|
||||
$lun = $item;
|
||||
last;
|
||||
}
|
||||
|
|
@ -294,6 +324,33 @@ sub run_delete_lu {
|
|||
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
|
||||
# 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");
|
||||
|
||||
my $client = undef;
|
||||
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/';
|
||||
|
||||
$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);
|
||||
}
|
||||
# Check if the APIs are accessable via the selected host and scheme
|
||||
my $code = $client->request('GET', $apiping)->responseCode();
|
||||
if ($code != 200) {
|
||||
freenas_api_log_error($client, "freenas_api_call");
|
||||
die "Unable to connect to the FreeNAS API service at '" . $apihost . "' using the '" . $scheme . "' protocol";
|
||||
}
|
||||
my $result = decode_json($client->responseContent());
|
||||
if (! defined $freenas_rest_connection) {
|
||||
freenas_api_connect($scfg);
|
||||
my $result = decode_json($freenas_rest_connection->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);
|
||||
$product_name = $1;
|
||||
syslog("info", (caller(0))[3] . " : ". $product_name . " Unformatted Version: " . $freenas_version);
|
||||
if ($freenas_version >= 11030100) {
|
||||
$freenas_api_version = "v2.0";
|
||||
$dev_prefix = "/dev/";
|
||||
}
|
||||
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};
|
||||
} else {
|
||||
syslog("info", (caller(0))[3] . " : REST Client already initialized");
|
||||
}
|
||||
syslog("info", (caller(0))[3] . " : Using " . $product_name ." API version " . $freenas_api_version);
|
||||
$freenas_api_methods = $freenas_api_version_matrix->{$freenas_api_version}->{'methods'};
|
||||
$freenas_api_variables = $freenas_api_version_matrix->{$freenas_api_version}->{'variables'};
|
||||
$freenas_global_config = (!defined($freenas_global_config)) ? freenas_iscsi_get_globalconfiguration($scfg) : $freenas_global_config;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
### FREENAS API CALLING ###
|
||||
### FREENAS API CALLING ROUTINE ###
|
||||
#
|
||||
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);
|
||||
syslog("info", (caller(0))[3] . " : called");
|
||||
|
||||
$method = uc($method);
|
||||
if (! $method =~ /^(?>GET|DELETE|POST)$/) {
|
||||
syslog("info", (caller(0))[3] . " : Invalid HTTP RESTful service method '$method'");
|
||||
die "Invalid HTTP RESTful service method '$method' used.";
|
||||
}
|
||||
|
||||
if (! defined $freenas_rest_connection) {
|
||||
freenas_api_check($scfg);
|
||||
}
|
||||
my $json_data = (defined $data) ? encode_json($data) : undef;
|
||||
if ($method eq 'GET') {
|
||||
$client->GET($path, $json_data);
|
||||
}
|
||||
if ($method eq 'DELETE') {
|
||||
$client->DELETE($path, $json_data);
|
||||
}
|
||||
if ($method eq 'POST') {
|
||||
$client->POST($path, $json_data);
|
||||
}
|
||||
$freenas_rest_connection->$method($path, $json_data);
|
||||
syslog("info", (caller(0))[3] . " : successful");
|
||||
|
||||
return $client
|
||||
return;
|
||||
}
|
||||
|
||||
#
|
||||
# Writes the Response and Content to SysLog
|
||||
#
|
||||
sub freenas_api_log_error {
|
||||
my ($client, $method) = @_;
|
||||
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response code: " . $client->responseCode());
|
||||
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response content: " . $client->responseContent());
|
||||
my ($method) = @_;
|
||||
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response code: " . $freenas_rest_connection->responseCode());
|
||||
syslog("info","[ERROR]FreeNAS::API::" . $method . " : Response content: " . $freenas_rest_connection->responseContent());
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -385,15 +422,15 @@ sub freenas_api_log_error {
|
|||
sub freenas_iscsi_get_globalconfiguration {
|
||||
my ($scfg) = @_;
|
||||
syslog("info", (caller(0))[3] . " : called");
|
||||
my $client = freenas_api_call($scfg, 'GET', "$freenas_api_methods->{'config'}", undef);
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'GET', $freenas_api_methods->{'config'}->{'resource'}, $freenas_api_methods->{'config'}->{'get'});
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
|
||||
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'}});
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "get_globalconfig");
|
||||
freenas_api_log_error("get_globalconfig");
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
|
@ -407,14 +444,14 @@ sub freenas_iscsi_get_extent {
|
|||
|
||||
syslog("info", (caller(0))[3] . " : called");
|
||||
|
||||
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'extent'} . "?limit=0", undef);
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'GET', $freenas_api_methods->{'extent'}->{'resource'} . "?limit=0", $freenas_api_methods->{'extent'}->{'get'});
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
if ($code == 200) {
|
||||
my $result = decode_json($client->responseContent());
|
||||
my $result = decode_json($freenas_rest_connection->responseContent());
|
||||
syslog("info", (caller(0))[3] . " : successful");
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "get_extent");
|
||||
freenas_api_log_error("get_extent");
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
|
@ -438,27 +475,19 @@ sub freenas_iscsi_create_extent {
|
|||
my $device = $lun_path;
|
||||
$device =~ s/^\/dev\///; # strip /dev/
|
||||
|
||||
my $request = {
|
||||
"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 $post_body = {};
|
||||
while ((my $key, my $value) = each %{$freenas_api_methods->{'extent'}->{'post_body'}}) {
|
||||
$post_body->{$key} = ($value =~ /^\$.+$/) ? eval $value : $value;
|
||||
}
|
||||
|
||||
my $client = freenas_api_call($scfg, 'POST', $freenas_api_methods->{'extent'}, $request->{$freenas_api_version});
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'POST', $freenas_api_methods->{'extent'}->{'resource'}, $post_body);
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
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");
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "create_extent");
|
||||
freenas_api_log_error("create_extent");
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
|
@ -472,21 +501,15 @@ sub freenas_iscsi_create_extent {
|
|||
#
|
||||
sub freenas_iscsi_remove_extent {
|
||||
my ($scfg, $extent_id) = @_;
|
||||
my $request = {
|
||||
"v2.0" => {
|
||||
"remove" => \1,
|
||||
"force" => \1,
|
||||
},
|
||||
};
|
||||
|
||||
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();
|
||||
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 = $freenas_rest_connection->responseCode();
|
||||
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");
|
||||
freenas_api_log_error("remove_extent");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -500,14 +523,14 @@ sub freenas_iscsi_get_target {
|
|||
|
||||
syslog("info", (caller(0))[3] . " : called");
|
||||
|
||||
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'target'} . "?limit=0", undef);
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'GET', $freenas_api_methods->{'target'}->{'resource'} . "?limit=0", $freenas_api_methods->{'target'}->{'get'});
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
if ($code == 200) {
|
||||
my $result = decode_json($client->responseContent());
|
||||
my $result = decode_json($freenas_rest_connection->responseContent());
|
||||
syslog("info", (caller(0))[3] . " : successful");
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "get_target");
|
||||
freenas_api_log_error("get_target");
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
|
@ -521,10 +544,10 @@ sub freenas_iscsi_get_target_to_extent {
|
|||
|
||||
syslog("info", (caller(0))[3] . " : called");
|
||||
|
||||
my $client = freenas_api_call($scfg, 'GET', $freenas_api_methods->{'targetextent'} . "?limit=0", undef);
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'GET', $freenas_api_methods->{'targetextent'}->{'resource'} . "?limit=0", $freenas_api_methods->{'targetextent'}->{'get'});
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
if ($code == 200) {
|
||||
my $result = decode_json($client->responseContent());
|
||||
my $result = decode_json($freenas_rest_connection->responseContent());
|
||||
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.
|
||||
|
|
@ -537,7 +560,7 @@ sub freenas_iscsi_get_target_to_extent {
|
|||
}
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "get_target_to_extent");
|
||||
freenas_api_log_error("get_target_to_extent");
|
||||
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)");
|
||||
|
||||
my $request = {
|
||||
"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 $post_body = {};
|
||||
while ((my $key, my $value) = each %{$freenas_api_methods->{'targetextent'}->{'post_body'}}) {
|
||||
$post_body->{$key} = ($value =~ /^\$.+$/) ? eval $value : $value;
|
||||
}
|
||||
|
||||
my $client = freenas_api_call($scfg, 'POST', $freenas_api_methods->{'targetextent'}, $request->{$freenas_api_version});
|
||||
my $code = $client->responseCode();
|
||||
freenas_api_call($scfg, 'POST', $freenas_api_methods->{'targetextent'}->{'resource'}, $post_body);
|
||||
my $code = $freenas_rest_connection->responseCode();
|
||||
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");
|
||||
return $result;
|
||||
} else {
|
||||
freenas_api_log_error($client, "create_target_to_extent");
|
||||
freenas_api_log_error("create_target_to_extent");
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
|
@ -598,13 +613,13 @@ sub freenas_iscsi_remove_target_to_extent {
|
|||
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();
|
||||
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 = $freenas_rest_connection->responseCode();
|
||||
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");
|
||||
freenas_api_log_error("remove_target_to_extent");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -687,12 +702,11 @@ sub freenas_get_targetid {
|
|||
|
||||
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->{$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}) {
|
||||
$target_id = $target->{'id'};
|
||||
last;
|
||||
|
|
|
|||
Loading…
Reference in New Issue