<p>George Joseph <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/10957">View Change</a></p><div style="white-space:pre-wrap">Approvals:
George Joseph: Looks good to me, approved; 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 ea5a885..a06a1f5 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -91,6 +91,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 3c501cf..ab0b2f6 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -170,6 +170,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>@@ -1391,6 +1409,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 5c6a35a..4e3dea7 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,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 e143a7f..a077548 100644</span><br><span>--- a/res/res_ari_asterisk.c</span><br><span>+++ b/res/res_ari_asterisk.c</span><br><span>@@ -396,6 +396,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>@@ -1142,6 +1192,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>@@ -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_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 f40bf5c..841e6cd 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/10957">change 10957</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/10957"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </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: 10957 </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>