AT&T ECOMP Vendor Event Listener library  0.1
evel_state_change.c
Go to the documentation of this file.
1 /**************************************************************************/
35 #include <string.h>
36 #include <assert.h>
37 #include <stdlib.h>
38 
39 #include "evel_throttle.h"
40 
41 /**************************************************************************/
59  const EVEL_ENTITY_STATE old_state,
60  const char * const interface)
61 {
62  EVENT_STATE_CHANGE * state_change = NULL;
63  EVEL_ENTER();
64 
65  /***************************************************************************/
66  /* Check preconditions. */
67  /***************************************************************************/
68  assert(new_state < EVEL_MAX_ENTITY_STATES);
69  assert(old_state < EVEL_MAX_ENTITY_STATES);
70  assert(interface != NULL);
71 
72  /***************************************************************************/
73  /* Allocate the State Change. */
74  /***************************************************************************/
75  state_change = malloc(sizeof(EVENT_STATE_CHANGE));
76  if (state_change == NULL)
77  {
78  log_error_state("Out of memory");
79  goto exit_label;
80  }
81  memset(state_change, 0, sizeof(EVENT_STATE_CHANGE));
82  EVEL_DEBUG("New State Change is at %lp", state_change);
83 
84  /***************************************************************************/
85  /* Initialize the header & the State Change fields. Optional string */
86  /* values are uninitialized (NULL). */
87  /***************************************************************************/
88  evel_init_header(&state_change->header);
92  state_change->new_state = new_state;
93  state_change->old_state = old_state;
94  state_change->state_interface = strdup(interface);
95  dlist_initialize(&state_change->additional_fields);
96 
97 exit_label:
98  EVEL_EXIT();
99  return state_change;
100 }
101 
102 /**************************************************************************/
111 void evel_free_state_change(EVENT_STATE_CHANGE * const state_change)
112 {
113  STATE_CHANGE_ADDL_FIELD * addl_field = NULL;
114 
115  EVEL_ENTER();
116 
117  /***************************************************************************/
118  /* Check preconditions. As an internal API we don't allow freeing NULL */
119  /* events as we do on the public API. */
120  /***************************************************************************/
121  assert(state_change != NULL);
122  assert(state_change->header.event_domain == EVEL_DOMAIN_STATE_CHANGE);
123 
124  /***************************************************************************/
125  /* Free all internal strings then the header itself. */
126  /***************************************************************************/
127  addl_field = dlist_pop_last(&state_change->additional_fields);
128  while (addl_field != NULL)
129  {
130  EVEL_DEBUG("Freeing Additional Field (%s, %s)",
131  addl_field->name,
132  addl_field->value);
133  free(addl_field->name);
134  free(addl_field->value);
135  free(addl_field);
136  addl_field = dlist_pop_last(&state_change->additional_fields);
137  }
138  free(state_change->state_interface);
139  evel_free_header(&state_change->header);
140 
141  EVEL_EXIT();
142 }
143 
144 /**************************************************************************/
157  const char * const type)
158 {
159  EVEL_ENTER();
160 
161  /***************************************************************************/
162  /* Check preconditions and call evel_header_type_set. */
163  /***************************************************************************/
164  assert(state_change != NULL);
165  assert(state_change->header.event_domain == EVEL_DOMAIN_STATE_CHANGE);
166  evel_header_type_set(&state_change->header, type);
167 
168  EVEL_EXIT();
169 }
170 
171 /**************************************************************************/
187  const char * const name,
188  const char * const value)
189 {
190  STATE_CHANGE_ADDL_FIELD * addl_field = NULL;
191  EVEL_ENTER();
192 
193  /***************************************************************************/
194  /* Check preconditions. */
195  /***************************************************************************/
196  assert(state_change != NULL);
197  assert(state_change->header.event_domain == EVEL_DOMAIN_STATE_CHANGE);
198  assert(name != NULL);
199  assert(value != NULL);
200 
201  EVEL_DEBUG("Adding name=%s value=%s", name, value);
202  addl_field = malloc(sizeof(STATE_CHANGE_ADDL_FIELD));
203  assert(addl_field != NULL);
204  memset(addl_field, 0, sizeof(STATE_CHANGE_ADDL_FIELD));
205  addl_field->name = strdup(name);
206  addl_field->value = strdup(value);
207  assert(addl_field->name != NULL);
208  assert(addl_field->value != NULL);
209 
210  dlist_push_last(&state_change->additional_fields, addl_field);
211 
212  EVEL_EXIT();
213 }
214 
215 /**************************************************************************/
222  EVENT_STATE_CHANGE * state_change)
223 {
224  STATE_CHANGE_ADDL_FIELD * addl_field = NULL;
225  DLIST_ITEM * addl_field_item = NULL;
226  char * new_state;
227  char * old_state;
228 
229  EVEL_ENTER();
230 
231  /***************************************************************************/
232  /* Check preconditions. */
233  /***************************************************************************/
234  assert(state_change != NULL);
235  assert(state_change->header.event_domain == EVEL_DOMAIN_STATE_CHANGE);
236 
237  new_state = evel_entity_state(state_change->new_state);
238  old_state = evel_entity_state(state_change->old_state);
239 
240  evel_json_encode_header(jbuf, &state_change->header);
241  evel_json_open_named_object(jbuf, "stateChangeFields");
242 
243  /***************************************************************************/
244  /* Mandatory fields. */
245  /***************************************************************************/
246  evel_enc_kv_string(jbuf, "newState", new_state);
247  evel_enc_kv_string(jbuf, "oldState", old_state);
248  evel_enc_kv_string(jbuf, "stateInterface", state_change->state_interface);
249 
250  /***************************************************************************/
251  /* Optional fields. */
252  /***************************************************************************/
253  evel_json_checkpoint(jbuf);
254  if (evel_json_open_opt_named_list(jbuf, "additionalFields"))
255  {
256  bool item_added = false;
257 
258  addl_field_item = dlist_get_first(&state_change->additional_fields);
259  while (addl_field_item != NULL)
260  {
261  addl_field = (STATE_CHANGE_ADDL_FIELD *) addl_field_item->item;
262  assert(addl_field != NULL);
263 
265  "additionalFields",
266  addl_field->name))
267  {
268  evel_json_open_object(jbuf);
269  evel_enc_kv_string(jbuf, "name", addl_field->name);
270  evel_enc_kv_string(jbuf, "value", addl_field->value);
272  item_added = true;
273  }
274  addl_field_item = dlist_get_next(addl_field_item);
275  }
276  evel_json_close_list(jbuf);
277 
278  /*************************************************************************/
279  /* If we've not written anything, rewind to before we opened the list. */
280  /*************************************************************************/
281  if (!item_added)
282  {
283  evel_json_rewind(jbuf);
284  }
285  }
286 
287  evel_enc_version(jbuf,
288  "stateChangeFieldsVersion",
289  state_change->major_version,
290  state_change->minor_version);
291 
293 
294  EVEL_EXIT();
295 }
#define EVEL_DEBUG(FMT,...)
Definition: evel.h:3621
void evel_state_change_type_set(EVENT_STATE_CHANGE *const state_change, const char *const type)
Set the Event Type property of the State Change.
EVENT_HEADER header
Definition: evel.h:956
DLIST_ITEM * dlist_get_first(DLIST *list)
Definition: double_list.c:162
void dlist_initialize(DLIST *list)
List initialization.
Definition: double_list.c:55
void evel_free_state_change(EVENT_STATE_CHANGE *const state_change)
Free a State Change.
int major_version
Definition: evel.h:957
void * item
Definition: double_list.h:47
EVEL_THROTTLE_SPEC * throttle_spec
void evel_json_encode_state_change(EVEL_JSON_BUFFER *jbuf, EVENT_STATE_CHANGE *state_change)
Encode the state change as a JSON state change.
char * evel_entity_state(const EVEL_ENTITY_STATE state)
Convert a EVEL_ENTITY_STATE to it&#39;s string form for JSON encoding.
Definition: evel_strings.c:416
#define EVEL_EXIT()
Definition: evel.h:3631
void evel_json_close_list(EVEL_JSON_BUFFER *jbuf)
Add the closing bracket of a list to a JSON buffer.
#define EVEL_ENTER()
Definition: evel.h:3626
State Change.
Definition: evel.h:952
int minor_version
Definition: evel.h:958
char * state_interface
Definition: evel.h:965
EVEL_ENTITY_STATE old_state
Definition: evel.h:964
void evel_enc_kv_string(EVEL_JSON_BUFFER *jbuf, const char *const key, const char *const value)
Encode a string key and string value to a EVEL_JSON_BUFFER.
void evel_json_close_object(EVEL_JSON_BUFFER *jbuf)
Add the closing bracket of an object to a JSON buffer.
#define EVEL_STATE_CHANGE_MAJOR_VERSION
Definition: evel.h:945
A Signaling event.
Definition: evel.h:139
void evel_json_open_named_object(EVEL_JSON_BUFFER *jbuf, const char *const key)
Add the opening bracket of an object to a JSON buffer.
void evel_json_open_object(EVEL_JSON_BUFFER *jbuf)
Add the opening bracket of an object to a JSON buffer.
DLIST additional_fields
Definition: evel.h:970
void evel_json_checkpoint(EVEL_JSON_BUFFER *jbuf)
Add a checkpoint - a stake in the ground to which we can rewind.
EVEL_EVENT_DOMAINS event_domain
Definition: evel.h:420
void evel_json_encode_header(EVEL_JSON_BUFFER *jbuf, EVENT_HEADER *event)
Encode the event as a JSON event object according to AT&T&#39;s schema.
Definition: evel_event.c:291
void evel_free_header(EVENT_HEADER *const event)
Free an event header.
Definition: evel_event.c:349
void * dlist_pop_last(DLIST *list)
Definition: double_list.c:73
void dlist_push_last(DLIST *list, void *item)
Definition: double_list.c:132
bool evel_json_open_opt_named_list(EVEL_JSON_BUFFER *jbuf, const char *const key)
Add the key and opening bracket of an optional named list to a JSON buffer.
void log_error_state(char *format,...)
Definition: evel_logging.c:98
#define EVEL_STATE_CHANGE_MINOR_VERSION
Definition: evel.h:946
State Change Additional Field.
Definition: evel.h:978
DLIST_ITEM * dlist_get_next(DLIST_ITEM *item)
Definition: double_list.c:172
void evel_json_rewind(EVEL_JSON_BUFFER *jbuf)
Rewind to the latest checkoint.
void evel_header_type_set(EVENT_HEADER *const header, const char *const type)
Set the Event Type property of the event header.
Definition: evel_event.c:164
EVEL throttle definitions.
EVEL_ENTITY_STATE new_state
Definition: evel.h:963
void evel_enc_version(EVEL_JSON_BUFFER *jbuf, const char *const key, const int major_version, const int minor_version)
Encode a key and version.
void evel_init_header(EVENT_HEADER *const header)
Initialize a newly created event header.
Definition: evel_event.c:112
bool evel_throttle_suppress_nv_pair(EVEL_THROTTLE_SPEC *throttle_spec, const char *const field_name, const char *const name)
Determine whether a name-value pair should be allowed (not suppressed).
EVENT_STATE_CHANGE * evel_new_state_change(const EVEL_ENTITY_STATE new_state, const EVEL_ENTITY_STATE old_state, const char *const interface)
Create a new State Change event.
EVEL_ENTITY_STATE
Alert types.
Definition: evel.h:248
void evel_state_change_addl_field_add(EVENT_STATE_CHANGE *const state_change, const char *const name, const char *const value)
Add an additional field name/value pair to the State Change.