return ret;
}
+static int deserialize_ae_event(struct faultd_event_type *type,
+ struct faultd_object *data, struct faultd_event **ev)
+{
+ int ret = -EINVAL;
+ struct ae_event_data ae_ev_data;
+ struct faultd_object *obj;
+
+ memset(&ae_ev_data, 0, sizeof(ae_ev_data));
+
+ list_for_each_entry(obj, &data->val.children, node) {
+ if ((obj->type == TYPE_OID) &&
+ (strcmp(AE_EV_REASON, obj->key) == 0)) {
+
+ ret = database_get_event(&obj->val.oid, &ae_ev_data.reason);
+ if (ret)
+ goto finish;
+
+ } else if ((obj->type == TYPE_STRING) &&
+ (strcmp(AE_EV_ACTION, obj->key) == 0)) {
+
+ ae_ev_data.action = obj->val.s;
+
+ } else if ((obj->type == TYPE_STRING) &&
+ (strcmp(AE_EV_ACTION_IMPL, obj->key) == 0)) {
+
+ ae_ev_data.action_impl = obj->val.s;
+
+ } else if ((obj->type == TYPE_OBJECT) &&
+ (strcmp(AE_EV_ACTION_LOG, obj->key) == 0)) {
+
+ ae_ev_data.action_log = obj;
+ } else if ((obj->type == TYPE_INT) &&
+ (strcmp(AE_EV_RESULT, obj->key) == 0)) {
+
+ ae_ev_data.result = obj->val.i;
+ }
+ }
+
+ if (!ae_ev_data.reason ||
+ !ae_ev_data.action ||
+ !ae_ev_data.action_impl ||
+ !ae_ev_data.action_log) {
+ ret = -EINVAL;
+ goto finish;
+ }
+
+ ret = allocate_ae_event(type, &ae_ev_data, ev);
+ if (ret < 0)
+ goto finish;
+
+ ret = faultd_event_deserialize_internal(data, type, *ev);
+ if (ret < 0) {
+ struct action_executed_event *ae_ev =
+ to_action_executed_event(*ev);
+ faultd_event_unref(ae_ev->reason);
+ faultd_event_unref(&ae_ev->event);
+ goto finish;
+ }
+
+ ret = 0;
+finish:
+ return ret;
+}
+
static void ae_event_release(struct faultd_event *ev)
{
struct action_executed_event *ae_ev =
char *str;
int ret;
- /* TODO: add serialization?
+ /* TODO: add serialization?
bson2json(ae_ev->action_log.data, &buf, &len); */
ret = asprintf(&str, "Action Executed Event:"
.to_string = ae_event_to_string,
},
.allocate_event = allocate_ae_event,
+ .deserialize_event = deserialize_ae_event,
.node = LIST_HEAD_INIT(action_executed_event_type.node),
};
return ret;
}
+static int deserialize_dm_event(struct faultd_event_type *type,
+ struct faultd_object *data, struct faultd_event **ev)
+{
+ int ret = -EINVAL;
+ struct dm_event_data dm_ev_data;
+ struct faultd_object *obj;
+
+ memset(&dm_ev_data, 0, sizeof(dm_ev_data));
+
+ list_for_each_entry(obj, &data->val.children, node) {
+ if ((obj->type == TYPE_OID) &&
+ (strcmp(DM_EV_REASON, obj->key) == 0)) {
+
+ ret = database_get_event(&obj->val.oid, &dm_ev_data.reason);
+ if (ret)
+ goto finish;
+
+ } else if ((obj->type == TYPE_STRING) &&
+ (strcmp(DM_EV_WHO, obj->key) == 0)) {
+
+ dm_ev_data.who_made = obj->val.s;
+
+ } else if ((obj->type == TYPE_STRING) &&
+ (strcmp(DM_EV_ACTION, obj->key) == 0)) {
+
+ dm_ev_data.action = obj->val.s;
+
+ } else if ((obj->type == TYPE_OBJECT) &&
+ (strcmp(DM_EV_ACTION_DATA, obj->key) == 0)) {
+
+ dm_ev_data.action_data = obj;
+ }
+ }
+
+ if (!dm_ev_data.reason ||
+ !dm_ev_data.who_made ||
+ !dm_ev_data.action ||
+ !dm_ev_data.action_data) {
+ ret = -EINVAL;
+ goto finish;
+ }
+
+ ret = allocate_dm_event(type, &dm_ev_data, ev);
+ if (ret < 0)
+ goto finish;
+
+ ret = faultd_event_deserialize_internal(data, type, *ev);
+ if (ret < 0) {
+ struct decision_made_event *dm_ev =
+ to_decision_made_event(*ev);
+ faultd_event_unref(dm_ev->reason);
+ faultd_event_unref(&dm_ev->event);
+ goto finish;
+ }
+
+ ret = 0;
+finish:
+ return ret;
+}
+
static void dm_event_release(struct faultd_event *ev)
{
struct decision_made_event *dm_ev =
.to_string = dm_event_to_string,
},
.allocate_event = allocate_dm_event,
+ .deserialize_event = deserialize_dm_event,
.node = LIST_HEAD_INIT(decision_made_event_type.node),
};
return ret;
}
+static int deserialize_fs_event(struct faultd_event_type *type,
+ struct faultd_object *data, struct faultd_event **ev)
+{
+ int ret = -EINVAL;
+
+ ret = fs_event_allocate(type, NULL, ev);
+ if (ret < 0)
+ goto finish;
+
+ ret = faultd_event_deserialize_internal(data, type, *ev);
+ if (ret < 0) {
+ struct faultd_started_event *fs_ev =
+ to_faultd_started_event(*ev);
+ free(fs_ev);
+ goto finish;
+ }
+
+ ret = 0;
+finish:
+ return ret;
+}
+
static void fs_event_release(struct faultd_event *ev)
{
struct faultd_started_event *fs_ev =
.to_string = fs_event_to_string,
},
.allocate_event = fs_event_allocate,
+ .deserialize_event = deserialize_fs_event,
.node = LIST_HEAD_INIT(faultd_started_event_type.node),
};