<p>Friendly Automation <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10956">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  George Joseph: Looks good to me, approved
  Friendly Automation: Approved for Submit

</div><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>M rest-api/api-docs/asterisk.json<br>6 files changed, 215 insertions(+), 2 deletions(-)<br><br></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 171cb29..673864a 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -93,6 +93,76 @@</span><br><span>    return ast_ari_validate_asterisk_info;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ast_ari_validate_asterisk_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_asterisk_id = 0;</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%);">+</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("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 AsteriskPing 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%);">+                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 AsteriskPing 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 AsteriskPing 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%);">+                {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ast_log(LOG_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "ARI AsteriskPing 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_asterisk_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ast_log(LOG_ERROR, "ARI AsteriskPing 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%);">+   if (!has_ping) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_log(LOG_ERROR, "ARI AsteriskPing 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%);">+</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 AsteriskPing 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%);">+</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 style="color: hsl(120, 100%, 40%);">+ari_validator ast_ari_validate_asterisk_ping_fn(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return ast_ari_validate_asterisk_ping;</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_build_info(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 d40a8c9..64dd88a 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -171,6 +171,24 @@</span><br><span> ari_validator ast_ari_validate_asterisk_info_fn(void);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Validator for AsteriskPing.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Asterisk ping information</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_asterisk_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 style="color: hsl(120, 100%, 40%);">+ * \brief Function pointer to ast_ari_validate_asterisk_ping().</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * See \ref ast_ari_model_validators.h for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ari_validator ast_ari_validate_asterisk_ping_fn(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Validator for BuildInfo.</span><br><span>  *</span><br><span>  * Info about how Asterisk was built</span><br><span>@@ -1374,6 +1392,10 @@</span><br><span>  * - config: ConfigInfo</span><br><span>  * - status: StatusInfo</span><br><span>  * - system: SystemInfo</span><br><span style="color: hsl(120, 100%, 40%);">+ * AsteriskPing</span><br><span style="color: hsl(120, 100%, 40%);">+ * - asterisk_id: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - ping: string (required)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: string (required)</span><br><span>  * BuildInfo</span><br><span>  * - date: string (required)</span><br><span>  * - kernel: string (required)</span><br><span>diff --git a/res/ari/resource_asterisk.c b/res/ari/resource_asterisk.c</span><br><span>index dafe9a6..5df6633 100644</span><br><span>--- a/res/ari/resource_asterisk.c</span><br><span>+++ b/res/ari/resource_asterisk.c</span><br><span>@@ -633,6 +633,24 @@</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_ping(struct ast_variable *headers,</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ast_ari_asterisk_ping_args *args,</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..5b2d494 100644</span><br><span>--- a/res/ari/resource_asterisk.h</span><br><span>+++ b/res/ari/resource_asterisk.h</span><br><span>@@ -131,6 +131,17 @@</span><br><span>  * \param[out] response HTTP response</span><br><span>  */</span><br><span> void ast_ari_asterisk_get_info(struct ast_variable *headers, struct ast_ari_asterisk_get_info_args *args, struct ast_ari_response *response);</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Argument struct for ast_ari_asterisk_ping() */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ast_ari_asterisk_ping_args {</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%);">+ * \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_ping(struct ast_variable *headers, struct ast_ari_asterisk_ping_args *args, struct ast_ari_response *response);</span><br><span> /*! Argument struct for ast_ari_asterisk_list_modules() */</span><br><span> struct ast_ari_asterisk_list_modules_args {</span><br><span> };</span><br><span>diff --git a/res/res_ari_asterisk.c b/res/res_ari_asterisk.c</span><br><span>index 7480ac8..385c621 100644</span><br><span>--- a/res/res_ari_asterisk.c</span><br><span>+++ b/res/res_ari_asterisk.c</span><br><span>@@ -398,6 +398,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_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%);">+    struct ast_ari_asterisk_ping_args args = {};</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ast_ari_asterisk_ping(headers, &args, 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%);">+               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_asterisk_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/modules.</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>@@ -1144,6 +1194,15 @@</span><br><span>        .children = {  }</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_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_modules_moduleName = {</span><br><span>   .path_segment = "moduleName",</span><br><span>      .is_wildcard = 1,</span><br><span>@@ -1209,8 +1268,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_ping,&asterisk_modules,&asterisk_logging,&asterisk_variable, }</span><br><span> };</span><br><span> </span><br><span> static int unload_module(void)</span><br><span>diff --git a/rest-api/api-docs/asterisk.json b/rest-api/api-docs/asterisk.json</span><br><span>index 9ae965d..226c48e 100644</span><br><span>--- a/rest-api/api-docs/asterisk.json</span><br><span>+++ b/rest-api/api-docs/asterisk.json</span><br><span>@@ -179,6 +179,18 @@</span><br><span>                   ]</span><br><span>            },</span><br><span>           {</span><br><span style="color: hsl(120, 100%, 40%);">+                     "path": "/asterisk/ping",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "description": "Asterisk ping",</span><br><span style="color: hsl(120, 100%, 40%);">+                   "operations": [</span><br><span style="color: hsl(120, 100%, 40%);">+                             {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "httpMethod": "GET",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "summary": "Response pong message.",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "nickname": "ping",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "responseClass": "AsteriskPing"</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%);">+            {</span><br><span>                    "path": "/asterisk/modules",</span><br><span>                     "description": "Asterisk modules",</span><br><span>                       "operations": [</span><br><span>@@ -604,6 +616,27 @@</span><br><span>                             }</span><br><span>                    }</span><br><span>            },</span><br><span style="color: hsl(120, 100%, 40%);">+            "AsteriskPing": {</span><br><span style="color: hsl(120, 100%, 40%);">+                   "id": "AsteriskPing",</span><br><span style="color: hsl(120, 100%, 40%);">+                     "description": "Asterisk ping information",</span><br><span style="color: hsl(120, 100%, 40%);">+                       "properties": {</span><br><span style="color: hsl(120, 100%, 40%);">+                             "asterisk_id": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Asterisk id info"</span><br><span style="color: hsl(120, 100%, 40%);">+                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "ping": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "Always string value is pong"</span><br><span style="color: hsl(120, 100%, 40%);">+                              },</span><br><span style="color: hsl(120, 100%, 40%);">+                            "timestamp": {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "required": true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "type": "string",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "description": "The timestamp string of request received time"</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>           "Module": {</span><br><span>                        "id": "Module",</span><br><span>                  "description": "Details of an Asterisk module",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10956">change 10956</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/10956"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I8d24e1dcc96f60f73437c68d9463ed746f688b29 </div>
<div style="display:none"> Gerrit-Change-Number: 10956 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation (1000185) </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua C. Colp <jcolp@digium.com> </div>