Adds new alarm status protocol messages (#11612)
Adds new message parsers and generators for the Alarm Snapshot messages
Timotej S committed
Oct 15, 2021 at 12:48 UTC
81e23e71ceeca221342f382576f58a8d45163474
11 files changed
+173
-61
aclk/aclk-schemas
+1
-1
@@ -1 +1 @@
1
-Subproject commit a0adf5b1e026ee8339d56cfa27af95bb26b53177
1
+Subproject commit ff110970c006170b01b51a15bf6cdc219ce1dcf5
aclk/aclk_alarm_api.c
+9
@@ -33,3 +33,12 @@ void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg)
33
query->data.bin_payload.msg_name = "ProvideAlarmConfiguration";
34
QUEUE_IF_PAYLOAD_PRESENT(query);
35
}
36
+
37
+void aclk_send_alarm_snapshot(alarm_snapshot_proto_ptr_t snapshot)
38
+{
39
+ aclk_query_t query = aclk_query_new(ALARM_SNAPSHOT);
40
+ query->data.bin_payload.payload = generate_alarm_snapshot_bin(&query->data.bin_payload.size, snapshot);
41
+ query->data.bin_payload.topic = ACLK_TOPICID_ALARM_SNAPSHOT;
42
+ query->data.bin_payload.msg_name = "AlarmSnapshot";
43
+ QUEUE_IF_PAYLOAD_PRESENT(query);
44
+}
aclk/aclk_alarm_api.h
+1
@@ -9,5 +9,6 @@
9
void aclk_send_alarm_log_health(struct alarm_log_health *log_health);
10
void aclk_send_alarm_log_entry(struct alarm_log_entry *log_entry);
11
void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg);
12
+void aclk_send_alarm_snapshot(alarm_snapshot_proto_ptr_t snapshot);
13
14
#endif /* ACLK_ALARM_API_H */
aclk/aclk_query.c
+1
@@ -299,6 +299,7 @@ aclk_query_handler aclk_query_handlers[] = {
299
{ .type = UPDATE_NODE_INFO, .name = "update node info", .fnc = send_bin_msg },
300
{ .type = ALARM_LOG_HEALTH, .name = "alarm log health", .fnc = send_bin_msg },
301
{ .type = ALARM_PROVIDE_CFG, .name = "provide alarm config", .fnc = send_bin_msg },
302
+ { .type = ALARM_SNAPSHOT, .name = "alarm snapshot", .fnc = send_bin_msg },
303
#endif
304
{ .type = UNKNOWN, .name = NULL, .fnc = NULL }
305
};
aclk/aclk_query_queue.c
+1
@@ -173,6 +173,7 @@ void aclk_query_free(aclk_query_t query)
173
case UPDATE_NODE_INFO:
174
case ALARM_LOG_HEALTH:
175
case ALARM_PROVIDE_CFG:
176
+ case ALARM_SNAPSHOT:
177
freez(query->data.bin_payload.payload);
178
break;
179
aclk/aclk_query_queue.h
+2
-1
@@ -25,7 +25,8 @@ typedef enum {
25
RETENTION_UPDATED,
26
UPDATE_NODE_INFO,
27
ALARM_LOG_HEALTH,
28
- ALARM_PROVIDE_CFG
28
+ ALARM_PROVIDE_CFG,
29
+ ALARM_SNAPSHOT
30
} aclk_query_type_t;
31
32
struct aclk_query_metadata {
aclk/aclk_util.c
+2
@@ -122,6 +122,7 @@ struct topic_name {
122
{ .id = ACLK_TOPICID_ALARM_LOG, .name = "alarm-log" },
123
{ .id = ACLK_TOPICID_ALARM_HEALTH, .name = "alarm-health" },
124
{ .id = ACLK_TOPICID_ALARM_CONFIG, .name = "alarm-config" },
125
+ { .id = ACLK_TOPICID_ALARM_SNAPSHOT, .name = "alarm-snapshot" },
126
{ .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
127
};
128
@@ -151,6 +152,7 @@ enum aclk_topics compulsory_topics_new_cloud_arch[] = {
152
ACLK_TOPICID_ALARM_LOG,
153
ACLK_TOPICID_ALARM_HEALTH,
154
ACLK_TOPICID_ALARM_CONFIG,
155
+ ACLK_TOPICID_ALARM_SNAPSHOT,
156
ACLK_TOPICID_UNKNOWN
157
};
158
aclk/aclk_util.h
+2
-1
@@ -78,7 +78,8 @@ enum aclk_topics {
78
ACLK_TOPICID_NODE_INFO = 13,
79
ACLK_TOPICID_ALARM_LOG = 14,
80
ACLK_TOPICID_ALARM_HEALTH = 15,
81
- ACLK_TOPICID_ALARM_CONFIG = 16
81
+ ACLK_TOPICID_ALARM_CONFIG = 16,
82
+ ACLK_TOPICID_ALARM_SNAPSHOT = 17
83
};
84
85
const char *aclk_get_topic(enum aclk_topics topic);
aclk/schema-wrappers/alarm_config.cc
+1
-1
@@ -8,7 +8,7 @@
8
9
#include "schema_wrapper_utils.h"
10
11
-using namespace alarmconfig::v1;
11
+using namespace alarms::v1;
12
13
void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg)
14
{
aclk/schema-wrappers/alarm_stream.cc
+129
-57
@@ -8,12 +8,14 @@
8
9
#include "schema_wrapper_utils.h"
10
11
+using namespace alarms::v1;
12
+
13
struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len)
14
{
15
struct start_alarm_streaming ret;
16
memset(&ret, 0, sizeof(ret));
17
16
- alarmstream::v1::StartAlarmStreaming msg;
18
+ StartAlarmStreaming msg;
19
20
if (!msg.ParseFromArray(data, len))
21
return ret;
@@ -27,7 +29,7 @@ struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_
29
30
char *parse_send_alarm_log_health(const char *data, size_t len)
31
{
30
- alarmstream::v1::SendAlarmLogHealth msg;
32
+ SendAlarmLogHealth msg;
33
if (!msg.ParseFromArray(data, len))
34
return NULL;
35
return strdupz(msg.node_id().c_str());
@@ -35,22 +37,22 @@ char *parse_send_alarm_log_health(const char *data, size_t len)
37
38
char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
39
{
38
- alarmstream::v1::AlarmLogHealth msg;
39
- alarmstream::v1::LogEntries *entries;
40
+ AlarmLogHealth msg;
41
+ LogEntries *entries;
42
43
msg.set_claim_id(data->claim_id);
44
msg.set_node_id(data->node_id);
45
msg.set_enabled(data->enabled);
46
47
switch (data->status) {
46
- case ALARM_LOG_STATUS_IDLE:
47
- msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_IDLE);
48
+ case alarm_log_status_aclk::ALARM_LOG_STATUS_IDLE:
49
+ msg.set_status(alarms::v1::ALARM_LOG_STATUS_IDLE);
50
break;
49
- case ALARM_LOG_STATUS_RUNNING:
50
- msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_RUNNING);
51
+ case alarm_log_status_aclk::ALARM_LOG_STATUS_RUNNING:
52
+ msg.set_status(alarms::v1::ALARM_LOG_STATUS_RUNNING);
53
break;
52
- case ALARM_LOG_STATUS_UNSPECIFIED:
53
- msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_UNSPECIFIED);
54
+ case alarm_log_status_aclk::ALARM_LOG_STATUS_UNSPECIFIED:
55
+ msg.set_status(alarms::v1::ALARM_LOG_STATUS_UNSPECIFIED);
56
break;
57
default:
58
error("Unknown status of AlarmLogHealth LogEntry");
@@ -72,26 +74,26 @@ char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
74
return bin;
75
}
76
75
-static alarmstream::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
77
+static alarms::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
78
{
79
switch (status) {
78
- case ALARM_STATUS_NULL:
79
- return alarmstream::v1::ALARM_STATUS_NULL;
80
- case ALARM_STATUS_UNKNOWN:
81
- return alarmstream::v1::ALARM_STATUS_UNKNOWN;
82
- case ALARM_STATUS_REMOVED:
83
- return alarmstream::v1::ALARM_STATUS_REMOVED;
84
- case ALARM_STATUS_NOT_A_NUMBER:
85
- return alarmstream::v1::ALARM_STATUS_NOT_A_NUMBER;
86
- case ALARM_STATUS_CLEAR:
87
- return alarmstream::v1::ALARM_STATUS_CLEAR;
88
- case ALARM_STATUS_WARNING:
89
- return alarmstream::v1::ALARM_STATUS_WARNING;
90
- case ALARM_STATUS_CRITICAL:
91
- return alarmstream::v1::ALARM_STATUS_CRITICAL;
80
+ case aclk_alarm_status::ALARM_STATUS_NULL:
81
+ return alarms::v1::ALARM_STATUS_NULL;
82
+ case aclk_alarm_status::ALARM_STATUS_UNKNOWN:
83
+ return alarms::v1::ALARM_STATUS_UNKNOWN;
84
+ case aclk_alarm_status::ALARM_STATUS_REMOVED:
85
+ return alarms::v1::ALARM_STATUS_REMOVED;
86
+ case aclk_alarm_status::ALARM_STATUS_NOT_A_NUMBER:
87
+ return alarms::v1::ALARM_STATUS_NOT_A_NUMBER;
88
+ case aclk_alarm_status::ALARM_STATUS_CLEAR:
89
+ return alarms::v1::ALARM_STATUS_CLEAR;
90
+ case aclk_alarm_status::ALARM_STATUS_WARNING:
91
+ return alarms::v1::ALARM_STATUS_WARNING;
92
+ case aclk_alarm_status::ALARM_STATUS_CRITICAL:
93
+ return alarms::v1::ALARM_STATUS_CRITICAL;
94
default:
95
error("Unknown alarm status");
94
- return alarmstream::v1::ALARM_STATUS_UNKNOWN;
96
+ return alarms::v1::ALARM_STATUS_UNKNOWN;
97
}
98
}
99
@@ -118,54 +120,59 @@ void destroy_alarm_log_entry(struct alarm_log_entry *entry)
120
freez(entry->rendered_info);
121
}
122
121
-char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
123
+static void fill_alarm_log_entry(struct alarm_log_entry *data, AlarmLogEntry *proto)
124
{
123
- alarmstream::v1::AlarmLogEntry le;
124
-
125
- le.set_node_id(data->node_id);
126
- le.set_claim_id(data->claim_id);
125
+ proto->set_node_id(data->node_id);
126
+ proto->set_claim_id(data->claim_id);
127
128
- le.set_chart(data->chart);
129
- le.set_name(data->name);
128
+ proto->set_chart(data->chart);
129
+ proto->set_name(data->name);
130
if (data->family)
131
- le.set_family(data->family);
131
+ proto->set_family(data->family);
132
133
- le.set_batch_id(data->batch_id);
134
- le.set_sequence_id(data->sequence_id);
135
- le.set_when(data->when);
133
+ proto->set_batch_id(data->batch_id);
134
+ proto->set_sequence_id(data->sequence_id);
135
+ proto->set_when(data->when);
136
137
- le.set_config_hash(data->config_hash);
137
+ proto->set_config_hash(data->config_hash);
138
139
- le.set_utc_offset(data->utc_offset);
140
- le.set_timezone(data->timezone);
139
+ proto->set_utc_offset(data->utc_offset);
140
+ proto->set_timezone(data->timezone);
141
142
- le.set_exec_path(data->exec_path);
143
- le.set_conf_source(data->conf_source);
144
- le.set_command(data->command);
142
+ proto->set_exec_path(data->exec_path);
143
+ proto->set_conf_source(data->conf_source);
144
+ proto->set_command(data->command);
145
146
- le.set_duration(data->duration);
147
- le.set_non_clear_duration(data->non_clear_duration);
146
+ proto->set_duration(data->duration);
147
+ proto->set_non_clear_duration(data->non_clear_duration);
148
149
150
- le.set_status(aclk_alarm_status_to_proto(data->status));
151
- le.set_old_status(aclk_alarm_status_to_proto(data->old_status));
152
- le.set_delay(data->delay);
153
- le.set_delay_up_to_timestamp(data->delay_up_to_timestamp);
150
+ proto->set_status(aclk_alarm_status_to_proto(data->status));
151
+ proto->set_old_status(aclk_alarm_status_to_proto(data->old_status));
152
+ proto->set_delay(data->delay);
153
+ proto->set_delay_up_to_timestamp(data->delay_up_to_timestamp);
154
155
- le.set_last_repeat(data->last_repeat);
156
- le.set_silenced(data->silenced);
155
+ proto->set_last_repeat(data->last_repeat);
156
+ proto->set_silenced(data->silenced);
157
158
if (data->value_string)
159
- le.set_value_string(data->value_string);
159
+ proto->set_value_string(data->value_string);
160
if (data->old_value_string)
161
- le.set_old_value_string(data->old_value_string);
161
+ proto->set_old_value_string(data->old_value_string);
162
+
163
+ proto->set_value(data->value);
164
+ proto->set_old_value(data->old_value);
165
+
166
+ proto->set_updated(data->updated);
167
163
- le.set_value(data->value);
164
- le.set_old_value(data->old_value);
168
+ proto->set_rendered_info(data->rendered_info);
169
+}
170
166
- le.set_updated(data->updated);
171
+char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
172
+{
173
+ AlarmLogEntry le;
174
168
- le.set_rendered_info(data->rendered_info);
175
+ fill_alarm_log_entry(data, &le);
176
177
*len = PROTO_COMPAT_MSG_SIZE(le);
178
char *bin = (char*)mallocz(*len);
@@ -174,3 +181,68 @@ char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
181
182
return bin;
183
}
184
+
185
+struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len)
186
+{
187
+ SendAlarmSnapshot msg;
188
+ if (!msg.ParseFromArray(data, len))
189
+ return NULL;
190
+
191
+ struct send_alarm_snapshot *ret = (struct send_alarm_snapshot*)callocz(1, sizeof(struct send_alarm_snapshot));
192
+ if (msg.claim_id().c_str())
193
+ ret->claim_id = strdupz(msg.claim_id().c_str());
194
+ if (msg.node_id().c_str())
195
+ ret->node_id = strdupz(msg.node_id().c_str());
196
+ ret->snapshot_id = msg.snapshot_id();
197
+ ret->sequence_id = msg.sequence_id();
198
+
199
+ return ret;
200
+}
201
+
202
+void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr)
203
+{
204
+ freez(ptr->claim_id);
205
+ freez(ptr->node_id);
206
+ freez(ptr);
207
+}
208
+
209
+alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data)
210
+{
211
+ AlarmSnapshot *msg = new AlarmSnapshot;
212
+ if (unlikely(!msg)) fatal("Cannot allocate memory for AlarmSnapshot");
213
+
214
+ msg->set_node_id(data->node_id);
215
+ msg->set_claim_id(data->claim_id);
216
+ msg->set_snapshot_id(data->snapshot_id);
217
+ msg->set_chunks(data->chunks);
218
+ msg->set_chunk(data->chunk);
219
+
220
+ // this is handled automatically by add_alarm_log_entry2snapshot function
221
+ msg->set_chunk_size(0);
222
+
223
+ return msg;
224
+}
225
+
226
+void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data)
227
+{
228
+ AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
229
+ AlarmLogEntry *alarm_log_entry = alarm_snapshot->add_alarms();
230
+
231
+ fill_alarm_log_entry(data, alarm_log_entry);
232
+
233
+ alarm_snapshot->set_chunk_size(alarm_snapshot->chunk_size() + 1);
234
+}
235
+
236
+char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot)
237
+{
238
+ AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
239
+ *len = PROTO_COMPAT_MSG_SIZE_PTR(alarm_snapshot);
240
+ char *bin = (char*)mallocz(*len);
241
+ if (!alarm_snapshot->SerializeToArray(bin, *len)) {
242
+ delete alarm_snapshot;
243
+ return NULL;
244
+ }
245
+
246
+ delete alarm_snapshot;
247
+ return bin;
248
+}
aclk/schema-wrappers/alarm_stream.h
+24
@@ -99,10 +99,34 @@ struct alarm_log_entry {
99
char *rendered_info;
100
};
101
102
+struct send_alarm_snapshot {
103
+ char *node_id;
104
+ char *claim_id;
105
+ uint64_t snapshot_id;
106
+ uint64_t sequence_id;
107
+};
108
+
109
+struct alarm_snapshot {
110
+ char *node_id;
111
+ char *claim_id;
112
+ uint64_t snapshot_id;
113
+ uint32_t chunks;
114
+ uint32_t chunk;
115
+};
116
+
117
+typedef void* alarm_snapshot_proto_ptr_t;
118
+
119
void destroy_alarm_log_entry(struct alarm_log_entry *entry);
120
121
char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data);
122
123
+struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len);
124
+void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr);
125
+
126
+alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data);
127
+void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data);
128
+char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot);
129
+
130
#ifdef __cplusplus
131
}
132
#endif