|
rpm-build |
3ee90c |
/*
|
|
rpm-build |
3ee90c |
* Copyright 2004-2019 the Pacemaker project contributors
|
|
rpm-build |
3ee90c |
*
|
|
rpm-build |
3ee90c |
* The version control history for this file may have further details.
|
|
rpm-build |
3ee90c |
*
|
|
rpm-build |
3ee90c |
* This source code is licensed under the GNU Lesser General Public License
|
|
rpm-build |
3ee90c |
* version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
#include <controld_messages.h>
|
|
rpm-build |
3ee90c |
#include <controld_metadata.h>
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
extern gboolean verify_stopped(enum crmd_fsa_state cur_state, int log_level);
|
|
rpm-build |
3ee90c |
void lrm_clear_last_failure(const char *rsc_id, const char *node_name,
|
|
rpm-build |
3ee90c |
const char *operation, guint interval_ms);
|
|
rpm-build |
3ee90c |
void lrm_op_callback(lrmd_event_data_t * op);
|
|
rpm-build |
3ee90c |
lrmd_t *crmd_local_lrmd_conn(void);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
typedef struct resource_history_s {
|
|
rpm-build |
3ee90c |
char *id;
|
|
rpm-build |
3ee90c |
uint32_t last_callid;
|
|
rpm-build |
3ee90c |
lrmd_rsc_info_t rsc;
|
|
rpm-build |
3ee90c |
lrmd_event_data_t *last;
|
|
rpm-build |
3ee90c |
lrmd_event_data_t *failed;
|
|
rpm-build |
3ee90c |
GList *recurring_op_list;
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/* Resources must be stopped using the same
|
|
rpm-build |
3ee90c |
* parameters they were started with. This hashtable
|
|
rpm-build |
3ee90c |
* holds the parameters that should be used for the next stop
|
|
rpm-build |
3ee90c |
* cmd on this resource. */
|
|
rpm-build |
3ee90c |
GHashTable *stop_params;
|
|
rpm-build |
3ee90c |
} rsc_history_t;
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
void history_free(gpointer data);
|
|
rpm-build |
3ee90c |
|
|
|
91c557 |
enum active_op_e {
|
|
|
91c557 |
active_op_remove = (1 << 0),
|
|
|
91c557 |
active_op_cancelled = (1 << 1),
|
|
|
91c557 |
};
|
|
|
91c557 |
|
|
|
2e9006 |
// In-flight action (recurring or pending)
|
|
|
2e9006 |
typedef struct active_op_s {
|
|
rpm-build |
3ee90c |
guint interval_ms;
|
|
rpm-build |
3ee90c |
int call_id;
|
|
|
91c557 |
uint32_t flags; // bitmask of active_op_e
|
|
rpm-build |
3ee90c |
time_t start_time;
|
|
rpm-build |
3ee90c |
char *rsc_id;
|
|
rpm-build |
3ee90c |
char *op_type;
|
|
rpm-build |
3ee90c |
char *op_key;
|
|
rpm-build |
3ee90c |
char *user_data;
|
|
rpm-build |
3ee90c |
GHashTable *params;
|
|
|
2e9006 |
} active_op_t;
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
typedef struct lrm_state_s {
|
|
rpm-build |
3ee90c |
const char *node_name;
|
|
rpm-build |
3ee90c |
void *conn; // Reserved for controld_execd_state.c usage
|
|
rpm-build |
3ee90c |
void *remote_ra_data; // Reserved for controld_remote_ra.c usage
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
GHashTable *resource_history;
|
|
rpm-build |
3ee90c |
GHashTable *pending_ops;
|
|
rpm-build |
3ee90c |
GHashTable *deletion_ops;
|
|
rpm-build |
3ee90c |
GHashTable *rsc_info_cache;
|
|
rpm-build |
3ee90c |
GHashTable *metadata_cache; // key = class[:provider]:agent, value = ra_metadata_s
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
int num_lrm_register_fails;
|
|
rpm-build |
3ee90c |
} lrm_state_t;
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
struct pending_deletion_op_s {
|
|
rpm-build |
3ee90c |
char *rsc;
|
|
rpm-build |
3ee90c |
ha_msg_input_t *input;
|
|
rpm-build |
3ee90c |
};
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Check whether this the local IPC connection to the executor
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
gboolean
|
|
rpm-build |
3ee90c |
lrm_state_is_local(lrm_state_t *lrm_state);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Clear all state information from a single state entry.
|
|
rpm-build |
3ee90c |
* \note It sometimes useful to save metadata cache when it won't go stale.
|
|
rpm-build |
3ee90c |
* \note This does not close the executor connection
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
void lrm_state_reset_tables(lrm_state_t * lrm_state, gboolean reset_metadata);
|
|
rpm-build |
3ee90c |
GList *lrm_state_get_list(void);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Initiate internal state tables
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
gboolean lrm_state_init_local(void);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Destroy all state entries and internal state tables
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
void lrm_state_destroy_all(void);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Create executor connection entry
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
lrm_state_t *lrm_state_create(const char *node_name);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Destroy executor connection by node name
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
void lrm_state_destroy(const char *node_name);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Find lrm_state data by node name
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
lrm_state_t *lrm_state_find(const char *node_name);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* \brief Either find or create a new entry
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
lrm_state_t *lrm_state_find_or_create(const char *node_name);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
/*!
|
|
rpm-build |
3ee90c |
* The functions below are wrappers for the executor API the the controller
|
|
rpm-build |
3ee90c |
* uses. These wrapper functions allow us to treat the controller's remote
|
|
rpm-build |
3ee90c |
* executor connection resources the same as regular resources. Internally,
|
|
rpm-build |
3ee90c |
* regular resources go to the executor, and remote connection resources are
|
|
rpm-build |
3ee90c |
* handled locally in the controller.
|
|
rpm-build |
3ee90c |
*/
|
|
rpm-build |
3ee90c |
void lrm_state_disconnect_only(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
void lrm_state_disconnect(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
int lrm_state_ipc_connect(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
int lrm_state_remote_connect_async(lrm_state_t * lrm_state, const char *server, int port,
|
|
rpm-build |
3ee90c |
int timeout);
|
|
rpm-build |
3ee90c |
int lrm_state_is_connected(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
int lrm_state_poke_connection(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
int lrm_state_get_metadata(lrm_state_t * lrm_state,
|
|
rpm-build |
3ee90c |
const char *class,
|
|
rpm-build |
3ee90c |
const char *provider,
|
|
rpm-build |
3ee90c |
const char *agent, char **output, enum lrmd_call_options options);
|
|
rpm-build |
3ee90c |
int lrm_state_cancel(lrm_state_t *lrm_state, const char *rsc_id,
|
|
rpm-build |
3ee90c |
const char *action, guint interval_ms);
|
|
rpm-build |
3ee90c |
int lrm_state_exec(lrm_state_t *lrm_state, const char *rsc_id,
|
|
rpm-build |
3ee90c |
const char *action, const char *userdata, guint interval_ms,
|
|
rpm-build |
3ee90c |
int timeout, /* ms */
|
|
rpm-build |
3ee90c |
int start_delay, /* ms */
|
|
rpm-build |
3ee90c |
lrmd_key_value_t * params);
|
|
rpm-build |
3ee90c |
lrmd_rsc_info_t *lrm_state_get_rsc_info(lrm_state_t * lrm_state,
|
|
rpm-build |
3ee90c |
const char *rsc_id, enum lrmd_call_options options);
|
|
rpm-build |
3ee90c |
int lrm_state_register_rsc(lrm_state_t * lrm_state,
|
|
rpm-build |
3ee90c |
const char *rsc_id,
|
|
rpm-build |
3ee90c |
const char *class,
|
|
rpm-build |
3ee90c |
const char *provider, const char *agent, enum lrmd_call_options options);
|
|
rpm-build |
3ee90c |
int lrm_state_unregister_rsc(lrm_state_t * lrm_state,
|
|
rpm-build |
3ee90c |
const char *rsc_id, enum lrmd_call_options options);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
// Functions used to manage remote executor connection resources
|
|
rpm-build |
3ee90c |
void remote_lrm_op_callback(lrmd_event_data_t * op);
|
|
rpm-build |
3ee90c |
gboolean is_remote_lrmd_ra(const char *agent, const char *provider, const char *id);
|
|
rpm-build |
3ee90c |
lrmd_rsc_info_t *remote_ra_get_rsc_info(lrm_state_t * lrm_state, const char *rsc_id);
|
|
rpm-build |
3ee90c |
int remote_ra_cancel(lrm_state_t *lrm_state, const char *rsc_id,
|
|
rpm-build |
3ee90c |
const char *action, guint interval_ms);
|
|
rpm-build |
3ee90c |
int remote_ra_exec(lrm_state_t *lrm_state, const char *rsc_id,
|
|
rpm-build |
3ee90c |
const char *action, const char *userdata, guint interval_ms,
|
|
rpm-build |
3ee90c |
int timeout, /* ms */
|
|
rpm-build |
3ee90c |
int start_delay, /* ms */
|
|
rpm-build |
3ee90c |
lrmd_key_value_t * params);
|
|
rpm-build |
3ee90c |
void remote_ra_cleanup(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
void remote_ra_fail(const char *node_name);
|
|
rpm-build |
3ee90c |
void remote_ra_process_pseudo(xmlNode *xml);
|
|
rpm-build |
3ee90c |
gboolean remote_ra_is_in_maintenance(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
void remote_ra_process_maintenance_nodes(xmlNode *xml);
|
|
rpm-build |
3ee90c |
gboolean remote_ra_controlling_guest(lrm_state_t * lrm_state);
|
|
rpm-build |
3ee90c |
|
|
rpm-build |
3ee90c |
void process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op,
|
|
|
2e9006 |
active_op_t *pending, xmlNode *action_xml);
|