[SR-Users] Invoking RPC commands over HTTP

Aleksandar Sosic alex.sosic at timenet.it
Fri Mar 2 23:03:13 CET 2018


Hi Ben,

we are working on a dockerized infrastructure orchestrated with
Kubernetes with two kamailio layers, a `proxy` and a `router` level.
In a stateless infrastructure like that we need to have also a SIP
orchestrator that will handle all the active and ready nodes and
notify or provide the correct information to all the other nodes upon
changes in the infrastructure.

So upon the creation of a `router` node we will give it a list of
`proxy` nodes (Kamailio), `TPS` (transcoding and playback handled by
asterisk), `RTPs` (rtpengine). When that container (aka Pod in
kubernetes) starts and it's ready we also notify the `proxy` nodes to
reload the dispatcher list and add the new node. We do that via API.

The API is a Node.js application using GraphQL query language. So our
DISPATCHER_LIST route does an async http request to the API:
```
route[DISPATCHER_LIST] {
  if($sht(api=>token) == $null) {
    route(GET_API_TOKEN);
  }
  $http_req(method) = "POST";
  $http_req(hdr) = "Content-Type: application/json";
  $http_req(hdr) = "Authorization: Bearer " + $sht(api=>token);
  $var(graphql_query) = "{\"query\": \"{ kamailio { dispatcher { list
{ kamailioConf } } } }\"}";
  $http_req(body) = $var(graphql_query);
  http_async_query(API_QUERY_URL, "DISPATCHER_SET");
}
```

We're using the JWT as authentication/security between nodes and API.

the DISPATCHER_SET route then handles the async response:
```
route[DISPATCHER_SET] {
  jansson_get("data.kamailio.dispatcher.list.kamailioConf", $http_rb,
"$var(api_conf)");
  if($var(api_conf) != "0") {
    exec_msg("printf \"$var(api_conf)\" > /tmp/dispatcher.list");
    jsonrpc_exec('{"jsonrpc": "2.0", "method": "dispatcher.reload",
"id": "1"}');
...
}
```

Those are simplified routes without logs and checks and failovers.
As you can immagine the dispatcher module has a param like this:
```
modparam("dispatcher", "list_file", "/tmp/dispatcher.list")
```

I'll be giving a speech on CD/CI and Kamailio route testing in a
dockerized environment like this at this year Kamailio World
Conference in Berlin:
https://www.kamailioworld.com/k06/speakers/

If you're attending the event we can discuss this further ad visum.

Kind regards,
--
Aleksandar Sosic
mail: alex.sosic at timenet.it
skype: alex.sosic
cell: +385 91 2505 146


On Fri, Mar 2, 2018 at 6:46 PM, Ben Hood <0x6e6562 at gmail.com> wrote:
> Hey Aleksandar,
>
> Many thanks for the heads up - very interesting to see how other
> people are doing this.
>
> So if I understand you correctly, you have a dynamic list of dispatchers.
>
> And then you invoke "dispatcher.reload" to reload all of the
> dispatchers you have defined dynamically?
>
> What does the  DISPATCHER_LIST route look like?
>
> Cheers,
> Ben
>
>
> On Fri, Mar 2, 2018 at 9:29 AM, Aleksandar Sosic <alex.sosic at timenet.it> wrote:
>> Hi Ben,
>>
>> we're using something like this to do dispatcher.reload:
>>
>> ```
>> event_route[xhttp:request] {
>> if ($hu =~ "^/rpc") {
>> $var(command) = $(hu{s.select,2,/});
>> $var(parameter) = $(hu{s.select,3,/});
>>
>> if($var(command) == "reload.dispatchers") {
>> route(DISPATCHER_LIST);
>> xhttp_reply("200", "OK", "text/html", "Dispatchers Set for RELOAD");
>> exit;
>> }
>> ...
>> }
>> ```
>>
>> And then in the DISPATCHER_LIST route we do an API call for fetching
>> the updated dispatcher list for that node.
>> After the dispatcher list is updated we just run:
>> jsonrpc_exec('{"jsonrpc": "2.0", "method": "dispatcher.reload", "id": "1"}');
>>
>> So you can just put a `jsonrpc_exec` inside the event_route[xhttp:request].
>
> _______________________________________________
> Kamailio (SER) - Users Mailing List
> sr-users at lists.kamailio.org
> https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users



More information about the sr-users mailing list