diff --git a/lib/NGCP/API/Client.pm b/lib/NGCP/API/Client.pm index 77d8593..698ae29 100644 --- a/lib/NGCP/API/Client.pm +++ b/lib/NGCP/API/Client.pm @@ -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 {