/* * Client-side Local Resource Manager API. * * Copyright (C) 2004 Huang Zhen <zhenh@cn.ibm.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *//* * This is a draft.  * * By Huang Zhen <zhenh@cn.ibm.com> 2004/2/23 * * It is based on the works of Alan Robertson, Lars Marowsky Bree, Andrew Beekhof. *  * The Local Resource Manager needs to provide the following functionalities: * 1. Provide the information of the resources holding by the node to its  *    clients, including listing the resources and their status. * 2. Its clients can add new resources to lrm or remove from it. * 3. Its clients can ask lrm to operate the resources, including start,  *    restart, stop and so on. * 4. Provide the information of the lrm itself, including what types of  *    resource are supporting by lrm. * 5. Notify the clients if they want when the status of a certain resource  *    changed. *  * The typical clients of lrm are crm and lrmadmin. */#ifndef __LRM_API_H#define __LRM_API_H 1#include <uuid/uuid.h>#include <glib.h>#define	LRM_PROTOCOL_VERSION	0.1#ifndef NULL#define NULL ((void*)0)#endif/*using the uuid as the id of resource */typedef	uuid_t	rsc_id_t;/*define the values of resource type*/#define RSC_TYPE_LSB		"LSB"#define RSC_TYPE_HEARTBEAT	"HeartBeat"#define RSC_TYPE_OCF		"OCF"/*lrm's client uses this structure to access the resource*/typedef struct lrm_rsc{	rsc_id_t		rsc_id;	const char*		rsc_name;	const char*		rsc_type;	const char*		rsc_parameter;	struct rsc_ops*	rsc_ops;}lrm_rsc_t;/* *monitor_mode_t is used in lrm_rsc_monitor to indicate its behave. *LRM_MONITOR_SET: callback will be called when the target status is set. *LRM_MONITOR_CHANGE: callback will be called when the status is changed. *LRM_MONITOR_CLEAR: the monitors set on this resource will be all cleared. */typedef enum monitor_mode {	LRM_MONITOR_SET = 0,	LRM_MONITOR_CHANGE,	LRM_MONITOR_CLEAR,}monitor_mode_t;/*this struct is used to represent the monitor*/typedef struct lrm_rsc_monitor {	monitor_mode_t	mode;	int				check_interval;	int				target_status;	gpointer 		user_data;}lrm_rsc_monitor_t;/*used in lrm_op_done_callback_t to show the status of operation*/typedef enum op_status {	LRM_OP_DONE,	LRM_OP_CANCELLED,	LRM_OP_TIMEOUT,	LRM_OP_NOTSUPPORTED,}op_status_t;/*this enum is used in struct lrm_rsc_cur_state*/typedef enum state_flag {	LRM_RSC_IDLE,	LRM_RSC_BUSY,}state_flag_t;/* *this struct stores the current state of the resource *if flag == LRM_RSC_IDLE, the op_type is the last op executed *if flag == LRM_RSC_BUSY, the op_type is the current op executing */typedef struct lrm_rsc_cur_state {	state_flag_t 	flag;	const char* 	op_type;	op_status_t		op_status;	int 			rc;	time_t 			timestamp;		}lrm_rsc_cur_state_t;struct rsc_ops{/* *	perform_op:	Performs the operation on the resource. *		Notice: op is the operation which need to pass to RA and done asyn *			 *	op_type:	The type of the operation. * *	user_data:	be passed to the callback function lrm_op_done_callback_t. *	 *	timeout:	The timeout of the operation in seconds. * *	return:		All operations will be asynchronous. *				The call will return the call id or failed code  immediately. *				The call id will be passed to the callback function *				when the operation finished later. */	int	(*perform_op) (lrm_rsc_t*, const char* op_type, gpointer user_data	, 				   int timeout);/* *	is_op_supported: *				check if the type of the operation is  *				supported by the resource. * *	op_type:	the type of the operation. * */	gboolean (*is_op_supported) (lrm_rsc_t*, const char * op_type);	/* * flush_ops:	throw away all operations queued for this resource, * 				and return them as cancelled.   */	int (*flush_ops) (lrm_rsc_t*);/* *	get_metadata: *				Returns XML metadata as a (malloced) string. * */	char* (*get_metadata) (lrm_rsc_t*);	/* *	set_monitor: *				add a monitor to a resource. * *	monitor:	the pointer to monitor structure. * * 	return: 	the monitor_id used in the callback function. */	int (*set_monitor) (lrm_rsc_t*, lrm_rsc_monitor_t* monitor);/* * get_monitors: *				return the monitors on this resource. * */		GList (*get_monitors) (lrm_rsc_t*);	/* *	get_cur_state: *				return the current state of the resource. *				please refer to the comment of lrm_rsc_cur_state_t */	int (*get_cur_state) (lrm_rsc_t*, lrm_rsc_cur_state_t* cur_state);};/* * 	lrm_op_done_callback_t:	 *				this type of callback functions are called when some *				asynchronous operation is done. * *	call_id:	call_id is the id returned by the perform_op() before. * *	rsc_id:		the id of the resource * *	op_type:	the finished operation * *	timestamp:	the time when the operation finished. * *	op_status:	refer to the comment of op_status_t * *	rc:			return code of the operation from RA, *				please refer to LSB. *				rc == 0 if timeout * *	user_data:	the data set by client in the perform_op call *	 */typedef void (*lrm_op_done_callback_t)	(int call_id, rsc_id_t rsc_id,,			  							const char* op_type, time_t timestamp,										op_status_t status, int rc, void* user_data);/* * 	lrm_monitor_callback_t:	 *				this type of callback functions are called when the status *				of resource changed in a monitored mode. * *	monitor_id:	return by the set_monitor function. * *	rsc_id:		the id of the resource * *	monitor:	the monitor invoked *	 *	user_data:	the data set by client in the set_monitor call			 */typedef void (*lrm_monitor_callback_t)	(int monitor_id, rsc_id_t rsc_id,										 lrm_rsc_monitor* monitor,										 time_t timestamp); typedef struct ll_lrm {	void *		lrm_private;	struct lrm_ops*	lrm_ops;}ll_lrm_t;struct lrm_ops {	int		(*signon)  	(ll_lrm_t*, const char * service);	int		(*signoff) 	(ll_lrm_t*);	int		(*delete)  	(ll_lrm_t*);	int		(*set_lrm_callback) (ll_lrm_t*	,		lrm_op_done_callback_t op_done_callback_func	, 		lrm_monitor_callback_t montior_callback_func);/* *	get_rsc_types_supported: *				Returns the resource types supported. * *	return:		a list of pointers of char* * */	GList * 	(*get_rsc_types_supported)(ll_lrm_t*);/* *	get_all_rscs: *				Returns all resources. * *	return:		a list of pointers of lrm_rsc_t * */	GList*		(*get_all_rscs)(ll_lrm_t*);/* *	get_rsc:	Gets one resource pointer by the id * */	lrm_rsc_t*	(*get_rsc)(ll_lrm_t*, rsc_id_t rsc_id);/* *	add_rsc:	Adds a new resource to lrm. *				lrmd holds nothing when it starts. *				crm or lrmadmin should add resources to lrm using  *				this function. */	int		(*add_rsc)(ll_lrm_t*, rsc_id_t rsc_id, const char* rsc_type	, 		const char* rsc_name, const char* parameter);	int		(*delete_rsc)(ll_lrm_t*, rsc_id_t rsc_id);/* *	inputfd:	Return fd which can be given to select(2) or poll(2) *				for determining when messages are ready to be read. */	int		(*inputfd)(ll_lrm_t*);/* *	msgready:	Returns TRUE (1) when a message is ready to be read. */	int		(*msgready)(ll_lrm_t*);/* *	rcvmsg:	Cause the next message to be read - activating callbacks for *		processing the message.  If no callback processes the message *		it will be ignored.  The message is automatically disposed of. *		It returns 1 if a message was received. */	int		(*rcvmsg)(ll_lrm_t*, int blocking);};/* *	ll_lrm_new: *			initializes the lrm client library. * *	llctype:	"lrm" * */ll_lrm_t* ll_lrm_new(const char * llctype);#endif /* __LRM_API_H */