diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2022-04-19 11:32:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-19 11:32:49 +0300 |
commit | 3e1ed14d8e8fd30864ddde6a236467dc4919ed13 (patch) | |
tree | 447960a7923a2fab96a96ffa23da098f5d3fc7db | |
parent | 9d13da121c801ddcdd37af79a19ab3cdc065f2ff (diff) |
Add the ability to perform a data query using an offline node id (#12650)
* Add the ability to build a host structure by node id to execute queries for archived hosts
* Add the ability to execute queries from the cloud for archived hosts by node id
* Add free_temporary_host function
-rw-r--r-- | aclk/aclk_query.c | 17 | ||||
-rw-r--r-- | database/sqlite/sqlite_functions.c | 18 | ||||
-rw-r--r-- | database/sqlite/sqlite_functions.h | 1 | ||||
-rw-r--r-- | web/api/tests/valid_urls.c | 11 | ||||
-rw-r--r-- | web/api/tests/web_api.c | 10 | ||||
-rw-r--r-- | web/server/web_client.c | 10 |
6 files changed, 51 insertions, 16 deletions
diff --git a/aclk/aclk_query.c b/aclk/aclk_query.c index ae56593103..d66d781dbb 100644 --- a/aclk/aclk_query.c +++ b/aclk/aclk_query.c @@ -111,6 +111,7 @@ static int http_api_v2(struct aclk_query_thread *query_thr, aclk_query_t query) w->tv_in = query->created_tv; now_realtime_timeval(&w->tv_ready); + RRDHOST *temp_host = NULL; if (!strncmp(query->data.http_api_v2.query, NODE_ID_QUERY, strlen(NODE_ID_QUERY))) { char *node_uuid = query->data.http_api_v2.query + strlen(NODE_ID_QUERY); char nodeid[UUID_STR_LEN]; @@ -125,11 +126,14 @@ static int http_api_v2(struct aclk_query_thread *query_thr, aclk_query_t query) query_host = node_id_2_rrdhost(nodeid); if (!query_host) { - error_report("Host with node_id \"%s\" not found! Returning 404 to Cloud!", nodeid); - retval = 1; - w->response.code = 404; - aclk_http_msg_v2_err(query_thr->client, query->callback_topic, query->msg_id, w->response.code, CLOUD_EC_NODE_NOT_FOUND, CLOUD_EMSG_NODE_NOT_FOUND, NULL, 0); - goto cleanup; + temp_host = sql_create_host_by_uuid(nodeid); + if (!temp_host) { + error_report("Host with node_id \"%s\" not found! Returning 404 to Cloud!", nodeid); + retval = 1; + w->response.code = 404; + aclk_http_msg_v2_err(query_thr->client, query->callback_topic, query->msg_id, w->response.code, CLOUD_EC_NODE_NOT_FOUND, CLOUD_EMSG_NODE_NOT_FOUND, NULL, 0); + goto cleanup; + } } } @@ -150,7 +154,8 @@ static int http_api_v2(struct aclk_query_thread *query_thr, aclk_query_t query) } // execute the query - t = aclk_web_api_v1_request(query_host, w, mysep ? mysep + 1 : "noop"); + t = aclk_web_api_v1_request(query_host ? query_host : temp_host, w, mysep ? mysep + 1 : "noop"); + free_temporary_host(temp_host); size = (w->mode == WEB_CLIENT_MODE_FILECOPY) ? w->response.rlen : w->response.data->len; sent = size; diff --git a/database/sqlite/sqlite_functions.c b/database/sqlite/sqlite_functions.c index 1e1d2a7415..b22350d180 100644 --- a/database/sqlite/sqlite_functions.c +++ b/database/sqlite/sqlite_functions.c @@ -1160,8 +1160,24 @@ failed: return; } +void free_temporary_host(RRDHOST *host) +{ + if (host) { + freez(host->hostname); + freez((char *)host->os); + freez((char *)host->tags); + freez((char *)host->timezone); + freez(host->program_name); + freez(host->program_version); + freez(host->registry_hostname); + freez(host->system_info); + freez(host); + } +} + #define SELECT_HOST "select host_id, registry_hostname, update_every, os, timezone, tags from host where hostname = @hostname order by rowid desc;" -#define SELECT_HOST_BY_UUID "select host_id, registry_hostname, update_every, os, timezone, tags from host where host_id = @host_id ;" +#define SELECT_HOST_BY_UUID "select h.host_id, h.registry_hostname, h.update_every, h.os, h.timezone, h.tags from host h, node_instance ni " \ + "where (ni.host_id = @host_id or ni.node_id = @host_id) AND ni.host_id = h.host_id;" RRDHOST *sql_create_host_by_uuid(char *hostname) { diff --git a/database/sqlite/sqlite_functions.h b/database/sqlite/sqlite_functions.h index 30b8dee6cb..20b8b75757 100644 --- a/database/sqlite/sqlite_functions.h +++ b/database/sqlite/sqlite_functions.h @@ -100,4 +100,5 @@ extern void sql_load_node_id(RRDHOST *host); extern void compute_chart_hash(RRDSET *st); extern int sql_set_dimension_option(uuid_t *dim_uuid, char *option); char *get_hostname_by_node_id(char *node_id); +void free_temporary_host(RRDHOST *host); #endif //NETDATA_SQLITE_FUNCTIONS_H diff --git a/web/api/tests/valid_urls.c b/web/api/tests/valid_urls.c index 30dc298285..87d5b3a208 100644 --- a/web/api/tests/valid_urls.c +++ b/web/api/tests/valid_urls.c @@ -8,6 +8,17 @@ #include <cmocka.h> #include <stdbool.h> +void free_temporary_host(RRDHOST *host) +{ + (void) host; +} + +void *__wrap_free_temporary_host(RRDHOST *host) +{ + (void) host; +} + + RRDHOST *sql_create_host_by_uuid(char *hostname) { (void) hostname; diff --git a/web/api/tests/web_api.c b/web/api/tests/web_api.c index df4efdabd2..53ce53da1d 100644 --- a/web/api/tests/web_api.c +++ b/web/api/tests/web_api.c @@ -8,6 +8,16 @@ #include <cmocka.h> #include <stdbool.h> +void free_temporary_host(RRDHOST *host) +{ + (void) host; +} + +void *__wrap_free_temporary_host(RRDHOST *host) +{ + (void) host; +} + RRDHOST *sql_create_host_by_uuid(char *hostname) { (void) hostname; diff --git a/web/server/web_client.c b/web/server/web_client.c index e61dc0a547..f388ab94b3 100644 --- a/web/server/web_client.c +++ b/web/server/web_client.c @@ -1309,15 +1309,7 @@ static inline int web_client_switch_host(RRDHOST *host, struct web_client *w, ch host = sql_create_host_by_uuid(tok); if (likely(host)) { int rc = web_client_process_url(host, w, url); - freez(host->hostname); - freez((char *)host->os); - freez((char *)host->tags); - freez((char *)host->timezone); - freez(host->program_name); - freez(host->program_version); - freez(host->registry_hostname); - freez(host->system_info); - freez(host); + free_temporary_host(host); return rc; } } |