diff --git a/lib/NGCP/Panel/Controller/API/PeeringServers.pm b/lib/NGCP/Panel/Controller/API/PeeringServers.pm index 968416de3c..5904f00819 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringServers.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringServers.pm @@ -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()); diff --git a/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm b/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm index 8aafa08b7e..1706f6f7a0 100644 --- a/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm +++ b/lib/NGCP/Panel/Controller/API/PeeringServersItem.pm @@ -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()); diff --git a/lib/NGCP/Panel/Controller/Peering.pm b/lib/NGCP/Panel/Controller/Peering.pm index 35248c82a0..6804946470 100644 --- a/lib/NGCP/Panel/Controller/Peering.pm +++ b/lib/NGCP/Panel/Controller/Peering.pm @@ -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 }, diff --git a/lib/NGCP/Panel/Form/Peering/Server.pm b/lib/NGCP/Panel/Form/Peering/Server.pm index 7c4251e33d..cb6dc7c9ae 100644 --- a/lib/NGCP/Panel/Form/Peering/Server.pm +++ b/lib/NGCP/Panel/Form/Peering/Server.pm @@ -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' => ( diff --git a/lib/NGCP/Panel/Form/Peering/ServerAPI.pm b/lib/NGCP/Panel/Form/Peering/ServerAPI.pm index 36b2caa31c..179ca49233 100644 --- a/lib/NGCP/Panel/Form/Peering/ServerAPI.pm +++ b/lib/NGCP/Panel/Form/Peering/ServerAPI.pm @@ -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; diff --git a/lib/NGCP/Panel/Role/API/PeeringServers.pm b/lib/NGCP/Panel/Role/API/PeeringServers.pm index 219cabda67..490c89bfff 100644 --- a/lib/NGCP/Panel/Role/API/PeeringServers.pm +++ b/lib/NGCP/Panel/Role/API/PeeringServers.pm @@ -86,7 +86,6 @@ sub update_item { } $item->update($resource); - NGCP::Panel::Utils::Peering::_sip_lcr_reload(c => $c); return $item; } diff --git a/lib/NGCP/Panel/Utils/Peering.pm b/lib/NGCP/Panel/Utils/Peering.pm index cedf245825..75767862e8 100644 --- a/lib/NGCP/Panel/Utils/Peering.pm +++ b/lib/NGCP/Panel/Utils/Peering.pm @@ -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, < + +dispatcher.reload + + +EOF + + return ref $res ? @{ $res } : (); +} + sub apply_rewrite { my (%params) = @_;