MT#15883 import comx API client

Change-Id: I6bc6784706beb44fb0144dc421f3ce1b0f79816c
changes/25/3425/6
Gerhard Jungwirth 10 years ago
parent 492f58786e
commit 59bb04b69d

@ -0,0 +1,202 @@
package NGCP::Panel::Utils::ComxAPIClient;
use warnings;
use strict;
use Moo;
# use Digest::MD5 qw/md5_hex/;
# use HTTP::Tiny;
# use Storable qw/freeze/;
use Types::Standard qw(Int HashRef);
# with 'Role::REST::Client';
use LWP::UserAgent;
use JSON qw/decode_json encode_json/;
has 'ua' => ( is => 'rw', default => sub {
return LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
timeout => 20,
);
});
has 'host' => (is => 'rw', default => 'https://www.api-cdk.tld:8191');
has 'login_status' => (is => 'rw',
#isa => 'HTTP::Response',
);
sub mytest {
my $c = NGCP::Panel::Utils::ComxAPIClient->new(
host => 'https://rtcengine.sipwise.com/rtcengine/api',
);
$c->login('gjungwirth@sipwise', '***', 'rtcengine.sipwise.com:443');
#p $c->get_sessions;
#p $c->create_session_and_account('npa4V0YkavioQ1GW7Yob', 'sip', 'user1@bar.com', '123456', 'YAqON76yLVtgMgBYeg6v');
#p $c->create_session_and_account('npa4V0YkavioQ1GW7Yob', 'sip4', 'sip:alice@192.168.51.150', 'alicepass', 'YAqON76yLVtgMgBYeg6v');
#p $c->get_networks;
$c->create_network('sip', 'sip-connector', {xms => JSON::false}, 'YAqON76yLVtgMgBYeg6v');
print "done\n";
return;
}
# returns appid or 0
sub login {
my ( $self, $username, $password, $netloc ) = @_;
my $ua = $self->ua;
$netloc //= $self->host =~ s!^https?://(.*:[0-9]*)(/.*$|$)!$1!r;
$ua->credentials($netloc, "ComX", $username, $password);
my $resp = $ua->get($self->host . '/users');
$self->login_status( $self->_create_response($resp) );
return;
}
sub create_session_and_account {
my ($self, $appid, $network, $identifier, $accessToken, $owner) = @_;
my $ua = $self->ua;
my $session_content = encode_json({
app => $appid,
owner => $owner,
});
my $session = $self->_create_response(
$ua->post($self->host . '/sessions', 'Content-Type' => 'application/json', Content => $session_content),
);
my $account_content = encode_json({
session => $session->{data}{id},
network => $network,
identifier => $identifier,
accessToken => $accessToken,
owner => $owner,
});
#p $account_content;
my $account = $self->_create_response(
$ua->post($self->host . '/accounts', 'Content-Type' => 'application/json', Content => $account_content),
);
$account->{data}{session} = $session->{data};
return $account;
}
sub create_network {
my ($self, $tag, $connector, $config, $owner) = @_;
my $ua = $self->ua;
my $network_content = encode_json({
tag => $tag,
connector => $connector,
config => encode_json($config),
owner => $owner,
});
my $network = $self->_create_response(
$ua->post($self->host . '/networks', 'Content-Type' => 'application/json', Content => $network_content),
);
return $network;
}
sub delete_network {
my ($self, $network_id) = @_;
my $ua = $self->ua;
$network_id //= "";
my $resp;
$resp = $ua->delete($self->host . "/networks/id/$network_id");
return $self->_create_response($resp);
}
sub create_app {
my ($self, $name, $domain, $owner) = @_;
my $ua = $self->ua;
my $app_content = encode_json({
name => $name,
domain => $domain,
owner => $owner,
});
my $app = $self->_create_response(
$ua->post($self->host . '/apps', 'Content-Type' => 'application/json', Content => $app_content),
);
return $app;
}
sub get_sessions {
my ($self, $max_rows) = @_;
my $sessions = $self->_resolve_collection( '/sessions', $max_rows );
if ('ARRAY' eq ref $sessions && @{ $sessions }) {
for my $session (@{ $sessions }) {
$session->{accounts} = $self->_resolve_collection( $session->{accounts}{href} );
}
}
return $sessions;
}
sub get_session {
my ($self, $session_id) = @_;
my $ua = $self->ua;
return $self->_create_response(
$ua->get($self->host . "/sessions/id/$session_id")
);
}
sub delete_all_sessions {
my ($self) = @_;
my $ua = $self->ua;
my $resp;
for my $session_data ($self->get_sessions) {
my $session_id = $session_data->{id};
$resp = $ua->delete($self->host . "/sessions/id/$session_id");
last if $resp->code >= 300;
}
return $resp;
}
sub get_users {
my ($self, $max_rows) = @_;
my $users = $self->_resolve_collection( '/users', $max_rows );
return $users;
}
sub get_networks {
my ($self) = @_;
my $networks = $self->_resolve_collection( '/networks' );
return $networks;
}
sub _resolve_collection {
my ($self, $bare_url, $max_rows) = @_;
my $ua = $self->ua;
my $rel_url = $self->_strip_host( $bare_url );
my $res = $ua->get($self->host . $rel_url);
my @result;
return [] unless $res->code == 200;
my $collection = JSON::decode_json($res->content);
return [] unless $collection;
for my $item (@{ $collection->{items} }) {
last if (defined $max_rows && $max_rows-- <= 0);
my $url = $self->_strip_host( $item->{href} );
my $item_res = $ua->get($self->host . $url);
my $item_data = decode_json($item_res->content);
push @result, $item_data;
}
return \@result;
}
sub _strip_host {
my ($self, $url) = @_;
my $url_orig = $self->host;
my $url_noip = $url_orig =~ s!:\d+!!r;
return $url =~ s!$url_orig|$url_noip!!r;
}
sub _create_response {
my ($self, $res) = @_;
my $data;
if ($res->is_success && $res->content) {
$data = decode_json($res->content);
}
return {
code => $res->code,
data => $data,
response => $res,
};
}
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,33 @@
use warnings;
use strict;
use Test::More;
use NGCP::Panel::Utils::ComxAPIClient;
my $comx_host = $ENV{COMX_HOST} // 'https://rtcengine.sipwise.com/rtcengine/api';
my $comx_user = $ENV{COMX_USER} // 'gjungwirth@sipwise';
my $comx_pass = $ENV{COMX_PASS};
my $comx_netloc = $comx_host =~ s!^https://([^/:]*)(:[0-9]*)?/.*$!$1.($2||":443")!re; # 'rtcengine.sipwise.com:443'
my $c = NGCP::Panel::Utils::ComxAPIClient->new(
host => $comx_host,
);
my $login_response = $c->login($comx_user, $comx_pass, $comx_netloc);
ok($c->login_status, "Login done");
is($c->login_status->{code}, 200, "Login successful");
#p $c->get_sessions;
#p $c->create_session_and_account('npa4V0YkavioQ1GW7Yob', 'sip4', 'sip:alice@192.168.51.150', 'alicepass', 'YAqON76yLVtgMgBYeg6v');
#p $c->get_networks;
my $network = $c->create_network('gjungwirth_test', 'sip-connector', {xms => JSON::false}, 'YAqON76yLVtgMgBYeg6v');
ok($network, "Create Network");
is($network->{code}, 201, "Create Network successful");
ok($network->{data}{id}, "Got a network id");
#p $c->create_session_and_account('npa4V0YkavioQ1GW7Yob', 'sip', 'user1@bar.com', '123456', 'YAqON76yLVtgMgBYeg6v');
my $tmp_resp = $c->delete_network($network->{data}{id});
is($tmp_resp->{code}, 200, "Delete Network");
ok(1,"stub, done");
done_testing;
Loading…
Cancel
Save