master
c 83 lines 3.62 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "api_v2_calls.h"
4
5 // --------------------------------------------------------------------------------------------------------------------
6
7 int api_v2_contexts_internal(RRDHOST *host __maybe_unused, struct web_client *w, char *url, CONTEXTS_V2_MODE mode, CONTEXTS_OPTIONS options) {
8 struct api_v2_contexts_request req = {
9 .options = options,
10 };
11
12 while(url) {
13 char *value = strsep_skip_consecutive_separators(&url, "&");
14 if(!value || !*value) continue;
15
16 char *name = strsep_skip_consecutive_separators(&value, "=");
17 if(!name || !*name) continue;
18 if(!value || !*value) continue;
19
20 // name and value are now the parameters
21 // they are not null and not empty
22
23 if(!strcmp(name, "scope_nodes"))
24 req.scope_nodes = value;
25 else if(!strcmp(name, "nodes"))
26 req.nodes = value;
27 else if((mode & (CONTEXTS_V2_NODES | CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_SEARCH | CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) && !strcmp(name, "scope_contexts"))
28 req.scope_contexts = value;
29 else if((mode & (CONTEXTS_V2_NODES | CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_SEARCH | CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) && !strcmp(name, "contexts"))
30 req.contexts = value;
31 else if((mode & CONTEXTS_V2_SEARCH) && !strcmp(name, "q"))
32 req.q = value;
33 else if(!strcmp(name, "options"))
34 req.options |= contexts_options_str_to_id(value);
35 else if(!strcmp(name, "after"))
36 req.after = str2l(value);
37 else if(!strcmp(name, "before"))
38 req.before = str2l(value);
39 else if(!strcmp(name, "timeout"))
40 req.timeout_ms = str2l(value);
41 else if(!strcmp(name, "cardinality") || !strcmp(name, "cardinality_limit"))
42 req.cardinality_limit = str2ul(value);
43 else if(mode & (CONTEXTS_V2_ALERTS | CONTEXTS_V2_ALERT_TRANSITIONS)) {
44 if (!strcmp(name, "alert"))
45 req.alerts.alert = value;
46 else if (!strcmp(name, "transition"))
47 req.alerts.transition = value;
48 else if(mode & CONTEXTS_V2_ALERTS) {
49 if (!strcmp(name, "status"))
50 req.alerts.status = contexts_alert_status_str_to_id(value);
51 }
52 else if(mode & CONTEXTS_V2_ALERT_TRANSITIONS) {
53 if (!strcmp(name, "last"))
54 req.alerts.last = strtoul(value, NULL, 0);
55 else if(!strcmp(name, "context"))
56 req.contexts = value;
57 else if (!strcmp(name, "anchor_gi")) {
58 req.alerts.global_id_anchor = str2ull(value, NULL);
59 }
60 else {
61 for(int i = 0; i < ATF_TOTAL_ENTRIES ;i++) {
62 if(!strcmp(name, alert_transition_facets[i].query_param))
63 req.alerts.facets[i] = value;
64 }
65 }
66 }
67 }
68 }
69
70 if ((mode & CONTEXTS_V2_ALERT_TRANSITIONS) && !req.alerts.last)
71 req.alerts.last = 1;
72
73 buffer_flush(w->response.data);
74 buffer_no_cacheable(w->response.data);
75 return rrdcontext_to_json_v2(w->response.data, &req, mode);
76 }
77
78 int api_v2_contexts(RRDHOST *host __maybe_unused, struct web_client *w, char *url) {
79 return api_v2_contexts_internal(
80 host, w, url, CONTEXTS_V2_CONTEXTS | CONTEXTS_V2_NODES | CONTEXTS_V2_AGENTS | CONTEXTS_V2_VERSIONS,
81 CONTEXTS_OPTION_PRIORITIES | CONTEXTS_OPTION_RETENTION | CONTEXTS_OPTION_LIVENESS |
82 CONTEXTS_OPTION_FAMILY | CONTEXTS_OPTION_UNITS);
83 }