TT#8704 Implement peer probing in panel and API

* Add dispatcher reload helper in peer utils
* Handle probe flag for peer hosts
* Reload dispatcher on proxies on peer host change
* Reworked kamailio cache reload to perform it after commit,
  otherwise kamailio won't see the changes yet!

Change-Id: I9a53854b4a42c97a2889c63f8bf2c878c6f48a2d
changes/46/12546/8
Andreas Granig 8 years ago
parent d8c818ca86
commit 7a16cf3cc7

@ -221,6 +221,9 @@ sub POST :Allow {
try {
$item = $c->model('DB')->resultset('voip_peer_hosts')->create($resource);
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
if($resource->{probe}) {
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
}
} catch($e) {
$c->log->error("failed to create peering server: $e"); # TODO: user, message, trace, ...
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.");
@ -229,6 +232,17 @@ sub POST :Allow {
$guard->commit;
try {
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
if($resource->{probe}) {
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
}
} catch($e) {
$c->log->error("failed to reload kamailio cache: $e"); # TODO: user, message, trace, ...
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.");
last;
}
$c->response->status(HTTP_CREATED);
$c->response->header(Location => sprintf('/%s%d', $c->request->path, $item->id));
$c->response->body(q());

@ -124,6 +124,15 @@ sub PATCH :Allow {
$guard->commit;
try {
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
} catch($e) {
$c->log->error("failed to reload kamailio cache: $e"); # TODO: user, message, trace, ...
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.");
last;
}
if ('minimal' eq $preference) {
$c->response->status(HTTP_NO_CONTENT);
$c->response->header(Preference_Applied => 'return=minimal');
@ -163,6 +172,14 @@ sub PUT :Allow {
last unless $item;
$guard->commit;
try {
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
} catch($e) {
$c->log->error("failed to reload kamailio cache: $e"); # TODO: user, message, trace, ...
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.");
last;
}
if ('minimal' eq $preference) {
$c->response->status(HTTP_NO_CONTENT);
@ -188,9 +205,19 @@ sub DELETE :Allow {
{
my $item = $self->item_by_id($c, $id);
last unless $self->resource_exists($c, peeringserver => $item);
my $probe = $item->probe;
$item->delete;
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
$guard->commit;
try {
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
if($probe) {
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
}
} catch($e) {
$c->log->error("failed to reload kamailio cache: $e"); # TODO: user, message, trace, ...
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create peering server.");
last;
}
$c->response->status(HTTP_NO_CONTENT);
$c->response->body(q());

@ -86,9 +86,10 @@ sub base :Chained('group_list') :PathPart('') :CaptureArgs(1) {
{ name => 'host', search => 1, title => $c->loc('Hostname') },
{ name => 'port', search => 1, title => $c->loc('Port') },
{ name => 'transport', search => 1, title => $c->loc('Protocol') },
{ name => 'weight', search => 1, title => $c->loc('Weight') },
{ name => 'weight', search => 0, title => $c->loc('Weight') },
{ name => 'via_route', search => 1, title => $c->loc('Via Route Set') },
{ name => 'enabled', search => 1, title => $c->loc('Enabled') },
{ name => 'probe', search => 0, title => $c->loc('Probe') },
{ name => 'enabled', search => 0, title => $c->loc('Enabled') },
]);
$c->stash->{rules_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => 'id', search => 1, title => $c->loc('#') },
@ -275,9 +276,13 @@ sub servers_create :Chained('servers_list') :PathPart('create') :Args(0) {
weight => $form->values->{weight},
via_route => $form->values->{via_route},
enabled => $form->values->{enabled},
probe => $form->values->{probe},
};
my $server = $c->stash->{group_result}->voip_peer_hosts->create($dbvalues);
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
if($dbvalues->{probe}) {
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
}
NGCP::Panel::Utils::Message::info(
c => $c,
desc => $c->loc('Peering server successfully created'),
@ -350,6 +355,7 @@ sub servers_edit :Chained('servers_base') :PathPart('edit') :Args(0) {
try {
$c->stash->{server_result}->update($form->values);
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
NGCP::Panel::Utils::Message::info(
c => $c,
desc => $c->loc('Peering server successfully updated'),
@ -375,8 +381,12 @@ sub servers_delete :Chained('servers_base') :PathPart('delete') :Args(0) {
my ($self, $c) = @_;
try {
my $probe = $c->stash->{server_result}->probe;
$c->stash->{server_result}->delete;
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
if($probe) {
NGCP::Panel::Utils::Peering::_sip_dispatcher_reload(c => $c);
}
NGCP::Panel::Utils::Message::info(
c => $c,
data => { $c->stash->{server_result}->get_inflated_columns },

@ -79,6 +79,17 @@ sub build_via_routes {
return \@options;
}
has_field 'probe' => (
type => 'Boolean',
label => 'Enable Probing',
default => 0,
required => 0,
element_attr => {
rel => ['tooltip'],
title => ['Perform probing via SIP pings to check reachability. If disabled, calls are always sent to this peer since the status is not known.'],
},
);
has_field 'enabled' => (
type => 'Boolean',
label => 'Enabled',
@ -99,7 +110,7 @@ has_field 'save' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/ name ip host port transport weight via_route enabled /],
render_list => [qw/ name ip host port transport weight via_route probe enabled /],
);
has_block 'actions' => (

@ -14,7 +14,7 @@ has_field 'group_id' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/group_id name ip host port transport weight via_route enabled/],
render_list => [qw/group_id name ip host port transport weight via_route probe enabled/],
);
1;

@ -86,7 +86,6 @@ sub update_item {
}
$item->update($resource);
NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c);
return $item;
}

@ -19,6 +19,20 @@ EOF
return 1;
}
sub _sip_dispatcher_reload {
my ($self, $c) = @_;
my $dispatcher = NGCP::Panel::Utils::XMLDispatcher->new;
my ($res) = $dispatcher->dispatch($c, "proxy-ng", 1, 1, <<EOF );
<?xml version="1.0" ?>
<methodCall>
<methodName>dispatcher.reload</methodName>
<params/>
</methodCall>
EOF
return ref $res ? @{ $res } : ();
}
sub apply_rewrite {
my (%params) = @_;

Loading…
Cancel
Save