void delete_fsa_input(fsa_data_t * fsa_data) { lrm_op_t *op = NULL; xmlNode *foo = NULL; if (fsa_data == NULL) { return; } crm_debug_4("About to free %s data", fsa_cause2string(fsa_data->fsa_cause)); if (fsa_data->data != NULL) { switch (fsa_data->data_type) { case fsa_dt_ha_msg: delete_ha_msg_input(fsa_data->data); break; case fsa_dt_xml: foo = fsa_data->data; free_xml(foo); break; case fsa_dt_lrm: op = (lrm_op_t *) fsa_data->data; free_lrm_op(op); break; case fsa_dt_none: if (fsa_data->data != NULL) { crm_err("Dont know how to free %s data from %s", fsa_cause2string(fsa_data->fsa_cause), fsa_data->origin); exit(1); } break; } crm_debug_4("%s data freed", fsa_cause2string(fsa_data->fsa_cause)); } crm_free(fsa_data); }
gboolean cib_action_update(crm_action_t * action, int status, int op_rc) { lrm_op_t *op = NULL; xmlNode *state = NULL; xmlNode *rsc = NULL; xmlNode *xml_op = NULL; xmlNode *action_rsc = NULL; enum cib_errors rc = cib_ok; const char *name = NULL; const char *value = NULL; const char *rsc_id = NULL; const char *task = crm_element_value(action->xml, XML_LRM_ATTR_TASK); const char *target = crm_element_value(action->xml, XML_LRM_ATTR_TARGET); const char *task_uuid = crm_element_value(action->xml, XML_LRM_ATTR_TASK_KEY); const char *target_uuid = crm_element_value(action->xml, XML_LRM_ATTR_TARGET_UUID); int call_options = cib_quorum_override | cib_scope_local; int target_rc = get_target_rc(action); if (status == LRM_OP_PENDING) { crm_debug("%s %d: Recording pending operation %s on %s", crm_element_name(action->xml), action->id, task_uuid, target); } else { crm_warn("%s %d: %s on %s timed out", crm_element_name(action->xml), action->id, task_uuid, target); } action_rsc = find_xml_node(action->xml, XML_CIB_TAG_RESOURCE, TRUE); if (action_rsc == NULL) { return FALSE; } rsc_id = ID(action_rsc); CRM_CHECK(rsc_id != NULL, crm_log_xml_err(action->xml, "Bad:action"); return FALSE); /* update the CIB <node_state id="hadev"> <lrm> <lrm_resources> <lrm_resource id="rsc2" last_op="start" op_code="0" target="hadev"/> */ state = create_xml_node(NULL, XML_CIB_TAG_STATE); crm_xml_add(state, XML_ATTR_UUID, target_uuid); crm_xml_add(state, XML_ATTR_UNAME, target); rsc = create_xml_node(state, XML_CIB_TAG_LRM); crm_xml_add(rsc, XML_ATTR_ID, target_uuid); rsc = create_xml_node(rsc, XML_LRM_TAG_RESOURCES); rsc = create_xml_node(rsc, XML_LRM_TAG_RESOURCE); crm_xml_add(rsc, XML_ATTR_ID, rsc_id); name = XML_ATTR_TYPE; value = crm_element_value(action_rsc, name); crm_xml_add(rsc, name, value); name = XML_AGENT_ATTR_CLASS; value = crm_element_value(action_rsc, name); crm_xml_add(rsc, name, value); name = XML_AGENT_ATTR_PROVIDER; value = crm_element_value(action_rsc, name); crm_xml_add(rsc, name, value); op = convert_graph_action(NULL, action, status, op_rc); op->call_id = -1; op->user_data = generate_transition_key(transition_graph->id, action->id, target_rc, te_uuid); xml_op = create_operation_update(rsc, op, CRM_FEATURE_SET, target_rc, __FUNCTION__, LOG_INFO); free_lrm_op(op); crm_debug_3("Updating CIB with \"%s\" (%s): %s %s on %s", status < 0 ? "new action" : XML_ATTR_TIMEOUT, crm_element_name(action->xml), crm_str(task), rsc_id, target); crm_log_xml_trace(xml_op, "Op"); rc = fsa_cib_conn->cmds->update(fsa_cib_conn, XML_CIB_TAG_STATUS, state, call_options); crm_debug_2("Updating CIB with %s action %d: %s on %s (call_id=%d)", op_status2text(status), action->id, task_uuid, target, rc); add_cib_op_callback(fsa_cib_conn, rc, FALSE, NULL, cib_action_updated); free_xml(state); action->sent_update = TRUE; if (rc < cib_ok) { return FALSE; } return TRUE; }
static gboolean exec_rsc_action(crm_graph_t *graph, crm_action_t *action) { lrm_op_t *op = NULL; struct pe_operation *pe_op; const char *target_rc_s = crm_meta_value(action->params, XML_ATTR_TE_TARGET_RC); xmlNode *action_rsc = first_named_child(action->xml, XML_CIB_TAG_RESOURCE); char *node = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET); char *uuid; const char *tmp_provider; xmlNode *params_all; qb_enter(); if (safe_str_eq(crm_element_value(action->xml, "operation"), "probe_complete")) { crm_free(node); action->confirmed = TRUE; update_graph(graph, action); graph_updated = TRUE; qb_leave(); return TRUE; } if (action_rsc == NULL) { crm_log_xml_err(action->xml, "Bad"); crm_free(node); qb_leave(); return FALSE; } uuid = crm_element_value_copy(action->xml, XML_LRM_ATTR_TARGET_UUID); pe_op = calloc(1, sizeof(struct pe_operation)); pe_op->refcount = 1; pe_op->hostname = node; pe_op->node_uuid = uuid; pe_op->user_data = run_user_data; pe_op->rname = strdup(ID(action_rsc)); pe_op->rclass = strdup(crm_element_value(action_rsc, XML_AGENT_ATTR_CLASS)); tmp_provider = crm_element_value(action_rsc, XML_AGENT_ATTR_PROVIDER); if (tmp_provider) { pe_op->rprovider = strdup(tmp_provider); } pe_op->rtype = strdup(crm_element_value(action_rsc, XML_ATTR_TYPE)); if (target_rc_s != NULL) { pe_op->target_outcome = crm_parse_int(target_rc_s, "0"); } op = convert_graph_action(NULL, action, 0, pe_op->target_outcome); params_all = create_xml_node(NULL, XML_TAG_PARAMS); g_hash_table_foreach(op->params, hash2field, params_all); /* * TODO at some point. g_hash_table_foreach(action->extra, hash2field, params_all); g_hash_table_foreach(rsc->parameters, hash2field, params_all); g_hash_table_foreach(action->meta, hash2metafield, params_all); */ filter_action_parameters(params_all, PE_CRM_VERSION); pe_op->op_digest = calculate_operation_digest(params_all, PE_CRM_VERSION); pe_op->method = strdup(op->op_type); pe_op->params = qb_skiplist_create(); if (op->params != NULL) { g_hash_table_foreach(op->params, dup_attr, pe_op->params); } pe_op->interval = op->interval; pe_op->timeout = op->timeout; if (pe_op->timeout == 0) { if (pe_op->interval == 0) { pe_op->timeout = PE_DEFAULT_TIMEOUT; } else { pe_op->timeout = pe_op->interval / 2; } } pe_op->action = action; pe_op->graph = graph; pe_op->action_id = action->id; pe_op->graph_id = graph->id; pe_op->time_execed = qb_util_stopwatch_create(); free_lrm_op(op); free_xml(params_all); run_fn(pe_op); qb_leave(); return TRUE; }