<p>sungtae kim has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10932">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Added ARI resource /ari/asterisk/ping<br><br>Added ARI resource.<br>GET /ari/asterisk/ping : It returns "pong" message with timestamp<br>and asterisk id. It would be useful for simple heath check.<br><br>Change-Id: I8d24e1dcc96f60f73437c68d9463ed746f688b29<br>---<br>M res/ari/ari_model_validators.c<br>M res/ari/ari_model_validators.h<br>M res/ari/resource_asterisk.c<br>M res/ari/resource_asterisk.h<br>M res/res_ari_asterisk.c<br>5 files changed, 158 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/32/10932/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c</span><br><span>index ea5a885..e90ffb8 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -548,6 +548,69 @@</span><br><span>  return ast_ari_validate_module;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ast_ari_validate_ping(struct ast_json *json)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int res = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct ast_json_iter *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+   int has_ping = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int has_timestamp = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        int has_asterisk_id = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (strcmp("ping", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_ping = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI Ping field ping failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI Ping field timestamp failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_asterisk_id = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  prop_is_valid = ast_ari_validate_string(</span><br><span style="color: hsl(120, 100%, 40%);">+                              ast_json_object_iter_value(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!prop_is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         ast_log(LOG_ERROR, "ARI Ping field asterisk_id failed validation\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ast_log(LOG_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "ARI Ping has undocumented field %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             ast_json_object_iter_key(iter));</span><br><span style="color: hsl(120, 100%, 40%);">+                      res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!has_ping) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI Ping missing required field ping\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI Ping missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!has_asterisk_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI Ping missing required field asterisk_id\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int ast_ari_validate_set_id(struct ast_json *json)</span><br><span> {</span><br><span>  int res = 1;</span><br><span>diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h</span><br><span>index 3c501cf..4c0b925 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -260,6 +260,15 @@</span><br><span> ari_validator ast_ari_validate_module_fn(void);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Validator for Ping.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param json JSON object to validate.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns True (non-zero) if valid.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns False (zero) if invalid.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_ari_validate_ping(struct ast_json *json);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Validator for SetId.</span><br><span>  *</span><br><span>  * Effective user/group id</span><br><span>diff --git a/res/ari/resource_asterisk.c b/res/ari/resource_asterisk.c</span><br><span>index 5c6a35a..520de8e 100644</span><br><span>--- a/res/ari/resource_asterisk.c</span><br><span>+++ b/res/ari/resource_asterisk.c</span><br><span>@@ -631,6 +631,23 @@</span><br><span>         ast_ari_response_no_content(response);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void ast_ari_asterisk_get_ping(struct ast_variable *headers,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ast_ari_response *response)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ast_json *json;</span><br><span style="color: hsl(120, 100%, 40%);">+        char eid[20];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ast_assert(response != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       json = ast_json_pack("{s: s, s: o, s: s}",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "ping",       "pong",</span><br><span style="color: hsl(120, 100%, 40%);">+                     "timestamp", ast_json_timeval(ast_tvnow(), NULL),</span><br><span style="color: hsl(120, 100%, 40%);">+                   "asterisk_id", ast_eid_to_str(eid, sizeof(eid), &ast_eid_default)</span><br><span style="color: hsl(120, 100%, 40%);">+                       );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_ari_response_ok(response, json);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*!</span><br><span>  * \brief Process logger information and append to a json array</span><br><span>  * \param channel Resource logger channel name path</span><br><span>diff --git a/res/ari/resource_asterisk.h b/res/ari/resource_asterisk.h</span><br><span>index a4a7da0..b4f40f4 100644</span><br><span>--- a/res/ari/resource_asterisk.h</span><br><span>+++ b/res/ari/resource_asterisk.h</span><br><span>@@ -198,6 +198,14 @@</span><br><span> struct ast_ari_asterisk_list_log_channels_args {</span><br><span> };</span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Response pong message</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param headers HTTP headers</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param args Swagger parameters</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] response HTTP response</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_ari_asterisk_get_ping(struct ast_variable *headers, struct ast_ari_response *response);</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Gets Asterisk log channel information.</span><br><span>  *</span><br><span>  * \param headers HTTP headers</span><br><span>diff --git a/res/res_ari_asterisk.c b/res/res_ari_asterisk.c</span><br><span>index e143a7f..c34c5db 100644</span><br><span>--- a/res/res_ari_asterisk.c</span><br><span>+++ b/res/res_ari_asterisk.c</span><br><span>@@ -681,6 +681,56 @@</span><br><span>       return;</span><br><span> }</span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Parameter parsing callback for /asterisk/ping.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param get_params GET parameters in the HTTP request.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param path_vars Path variables extracted from the request.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param headers HTTP headers.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] response Response to the HTTP request.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void ast_ari_asterisk_get_ping_cb(</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ast_tcptls_session_instance *ser,</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_variable *get_params, struct ast_variable *path_vars,</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ast_variable *headers, struct ast_json *body, struct ast_ari_response *response)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(AST_DEVMODE)</span><br><span style="color: hsl(120, 100%, 40%);">+  int is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+ int code;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* AST_DEVMODE */</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_ari_asterisk_get_ping(headers, response);</span><br><span style="color: hsl(120, 100%, 40%);">+#if defined(AST_DEVMODE)</span><br><span style="color: hsl(120, 100%, 40%);">+       code = response->response_code;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (code) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case 0: /* Implementation is still a stub, or the code wasn't set */</span><br><span style="color: hsl(120, 100%, 40%);">+              is_valid = response->message == NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 500: /* Internal Server Error */</span><br><span style="color: hsl(120, 100%, 40%);">+ case 501: /* Not Implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+       case 404: /* Module could not be found in running modules. */</span><br><span style="color: hsl(120, 100%, 40%);">+ case 409: /* Module information could not be retrieved. */</span><br><span style="color: hsl(120, 100%, 40%);">+            is_valid = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (200 <= code && code <= 299) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       is_valid = ast_ari_validate_ping(</span><br><span style="color: hsl(120, 100%, 40%);">+                             response->message);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/ping\n", code);</span><br><span style="color: hsl(120, 100%, 40%);">+                 is_valid = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!is_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "Response validation failed for /asterisk/ping\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_ari_response_error(response, 500,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Internal Server Error", "Response validation failed");</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* AST_DEVMODE */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+fin: __attribute__((unused))</span><br><span style="color: hsl(120, 100%, 40%);">+   return;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Parameter parsing callback for /asterisk/logging.</span><br><span>  * \param get_params GET parameters in the HTTP request.</span><br><span>  * \param path_vars Path variables extracted from the request.</span><br><span>@@ -1164,6 +1214,15 @@</span><br><span>        .children = { &asterisk_modules_moduleName, }</span><br><span> };</span><br><span> /*! \brief REST handler for /api-docs/asterisk.json */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct stasis_rest_handlers asterisk_ping = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .path_segment = "ping",</span><br><span style="color: hsl(120, 100%, 40%);">+     .callbacks = {</span><br><span style="color: hsl(120, 100%, 40%);">+                [AST_HTTP_GET] = ast_ari_asterisk_get_ping_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+    .num_children = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+    .children = {  }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief REST handler for /api-docs/asterisk.json */</span><br><span> static struct stasis_rest_handlers asterisk_logging_logChannelName_rotate = {</span><br><span>        .path_segment = "rotate",</span><br><span>  .callbacks = {</span><br><span>@@ -1207,8 +1266,8 @@</span><br><span>       .path_segment = "asterisk",</span><br><span>        .callbacks = {</span><br><span>       },</span><br><span style="color: hsl(0, 100%, 40%);">-      .num_children = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-      .children = { &asterisk_config,&asterisk_info,&asterisk_modules,&asterisk_logging,&asterisk_variable, }</span><br><span style="color: hsl(120, 100%, 40%);">+   .num_children = 6,</span><br><span style="color: hsl(120, 100%, 40%);">+    .children = { &asterisk_config,&asterisk_info,&asterisk_modules,&asterisk_logging,&asterisk_variable,&asterisk_ping, }</span><br><span> };</span><br><span> </span><br><span> static int unload_module(void)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10932">change 10932</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10932"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I8d24e1dcc96f60f73437c68d9463ed746f688b29 </div>
<div style="display:none"> Gerrit-Change-Number: 10932 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>