|
|
|
@ -8,8 +8,15 @@ use IO::Socket::SSL;
|
|
|
|
|
use LWP::UserAgent;
|
|
|
|
|
use Readonly;
|
|
|
|
|
|
|
|
|
|
Readonly my $cfg => Config::Tiny->read("/etc/default/ngcp-api")
|
|
|
|
|
or die "Cannot read /etc/default/ngcp-api: $ERRNO";
|
|
|
|
|
my $config;
|
|
|
|
|
|
|
|
|
|
BEGIN {
|
|
|
|
|
my $cfg_file = "/etc/default/ngcp-api";
|
|
|
|
|
$config = Config::Tiny->read($cfg_file)
|
|
|
|
|
or die "Cannot read $cfg_file: $ERRNO";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Readonly::Scalar my $cfg => $config;
|
|
|
|
|
|
|
|
|
|
my %opts = ();
|
|
|
|
|
|
|
|
|
@ -26,12 +33,14 @@ sub new {
|
|
|
|
|
$opts{auth_pass} = $cfg->{_}->{AUTH_SYSTEM_PASSWORD};
|
|
|
|
|
$opts{verbose} = 0;
|
|
|
|
|
|
|
|
|
|
return bless $self, $class;
|
|
|
|
|
}
|
|
|
|
|
bless $self, $class;
|
|
|
|
|
$self->set_page_rows($cfg->{_}->{NGCP_API_PAGE_ROWS} // 10);
|
|
|
|
|
|
|
|
|
|
sub request {
|
|
|
|
|
my ($self, $method, $uri, $data) = @_;
|
|
|
|
|
return $self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub _create_ua {
|
|
|
|
|
my ($self, $uri) = @_;
|
|
|
|
|
my $ua = LWP::UserAgent->new();
|
|
|
|
|
if ($opts{sslverify} eq 'no' ||
|
|
|
|
|
($opts{sslverify_lb} eq 'no' && $opts{iface} =~ /^(lo|dummy)/)) {
|
|
|
|
@ -42,8 +51,7 @@ sub request {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
my $urlbase = sprintf "%s:%s", @{opts}{qw(host port)};
|
|
|
|
|
my $url = sprintf "https://%s%s", $urlbase, $uri =~ m#^/# ? $uri
|
|
|
|
|
: "/".$uri;
|
|
|
|
|
|
|
|
|
|
$ua->credentials($urlbase, 'api_admin_system',
|
|
|
|
|
@{opts}{qw(auth_user auth_pass)});
|
|
|
|
|
|
|
|
|
@ -53,6 +61,11 @@ sub request {
|
|
|
|
|
$ua->add_handler("response_done", sub { shift->dump; return });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ($ua,$urlbase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub _create_req {
|
|
|
|
|
my ($self, $method, $url) = @_;
|
|
|
|
|
my $req = HTTP::Request->new($method, $url);
|
|
|
|
|
|
|
|
|
|
if ($method eq "PATCH") {
|
|
|
|
@ -62,6 +75,20 @@ sub request {
|
|
|
|
|
}
|
|
|
|
|
$req->header('Prefer' => 'return=representation');
|
|
|
|
|
$req->header('NGCP-UserAgent' => 'NGCP::API::Client');
|
|
|
|
|
return $req;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub _get_url {
|
|
|
|
|
my ($self, $urlbase, $uri) = @_;
|
|
|
|
|
return sprintf "https://%s%s", $urlbase, $uri =~ m#^/# ? $uri : "/".$uri;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub request {
|
|
|
|
|
my ($self, $method, $uri, $data) = @_;
|
|
|
|
|
|
|
|
|
|
my ($ua,$urlbase) = $self->_create_ua($uri);
|
|
|
|
|
|
|
|
|
|
my $req = $self->_create_req($method, $self->_get_url($urlbase,$uri));
|
|
|
|
|
|
|
|
|
|
$data and $req->content(to_json($data));
|
|
|
|
|
|
|
|
|
@ -70,6 +97,42 @@ sub request {
|
|
|
|
|
return NGCP::API::Client::Result->new($res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub next_page {
|
|
|
|
|
my ($self, $uri) = @_;
|
|
|
|
|
|
|
|
|
|
unless ($self->{_ua}) {
|
|
|
|
|
($self->{_ua},$self->{_urlbase}) = $self->_create_ua($uri);
|
|
|
|
|
$self->{_collection_url} = sprintf "https://%s%s%spage=1&rows=%d", $self->{_urlbase},
|
|
|
|
|
$uri =~ m#^/# ? $uri : "/".$uri,
|
|
|
|
|
$uri =~ m#\?# ? '&' : '?',
|
|
|
|
|
$self->{_rows};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return unless $self->{_collection_url};
|
|
|
|
|
|
|
|
|
|
my $req = $self->_create_req('GET', $self->{_collection_url});
|
|
|
|
|
|
|
|
|
|
my $res = NGCP::API::Client::Result->new($self->{_ua}->request($req));
|
|
|
|
|
|
|
|
|
|
undef $self->{_collection_url};
|
|
|
|
|
if ('HASH' eq ref (my $data = $res->as_hash())) {
|
|
|
|
|
$uri = $data->{_links}->{next}->{href};
|
|
|
|
|
$self->{_collection_url} = $self->_get_url($self->{_urlbase},$uri) if $uri;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub set_page_rows {
|
|
|
|
|
my ($self,$rows) = @_;
|
|
|
|
|
|
|
|
|
|
$self->{_rows} = $rows;
|
|
|
|
|
undef $self->{_collection_url};
|
|
|
|
|
undef $self->{_ua};
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub set_verbose {
|
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
|
@ -78,6 +141,7 @@ sub set_verbose {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package NGCP::API::Client::Result;
|
|
|
|
|
use warnings;
|
|
|
|
|
use strict;
|
|
|
|
@ -90,13 +154,15 @@ sub new {
|
|
|
|
|
$res_obj->message,
|
|
|
|
|
$res_obj->headers,
|
|
|
|
|
$res_obj->content);
|
|
|
|
|
$self->{_cached} = undef;
|
|
|
|
|
return $self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub as_hash {
|
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
|
|
return from_json($self->content, { utf8 => 1 });
|
|
|
|
|
return $self->{_cached} if $self->{_cached};
|
|
|
|
|
$self->{_cached} = from_json($self->content, { utf8 => 1 });
|
|
|
|
|
return $self->{_cached};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub result {
|
|
|
|
|