You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
heartbeat/include/lrm/lrm_api.h

421 lines
11 KiB

/*
* Client-side Local Resource Manager API.
*
* Author: Huang Zhen <zhenh@cn.ibm.com>
* Copyright (C) 2004 International Business Machines
*
* 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
*
*/
/*
*
* By Huang Zhen <zhenhltc@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.
*
* The typical clients of lrm are crm and lrmadmin.
*/
/*
* Notice:
* "status" indicates the exit status code of "status" operation
* its value is defined in LSB, OCF...
*
* "state" indicates the state of resource, maybe LRM_RSC_BUSY, LRM_RSC_IDLE
*
* "op_status" indicates how the op exit. like LRM_OP_DONE,LRM_OP_CANCELLED,
* LRM_OP_TIMEOUT,LRM_OP_NOTSUPPORTED.
*
* "rc" is the return code of an opertioan. it's value is in following enum
* which is defined in "raexec.h"
* enum UNIFORM_RET_EXECRA {
* EXECRA_EXEC_UNKNOWN_ERROR = -2,
* EXECRA_NO_RA = -1,
* EXECRA_OK = 0,
* EXECRA_UNKNOWN_ERROR = 1,
* EXECRA_INVALID_PARAM = 2,
* EXECRA_UNIMPLEMENT_FEATURE = 3,
* EXECRA_INSUFFICIENT_PRIV = 4,
* EXECRA_NOT_INSTALLED = 5,
* EXECRA_NOT_CONFIGURED = 6,
* EXECRA_NOT_RUNNING = 7,
*
* EXECRA_RA_DEAMON_DEAD1 = 11,
* EXECRA_RA_DEAMON_DEAD2 = 12,
* EXECRA_RA_DEAMON_STOPPED = 13,
* EXECRA_STATUS_UNKNOWN = 14
* };
*/
#ifndef __LRM_API_H
#define __LRM_API_H 1
#include <glib.h>
#include <lrm/raexec.h>
#include <clplumbing/GSource.h>
#define LRM_PROTOCOL_MAJOR 0
#define LRM_PROTOCOL_MINOR 1
#define LRM_PROTOCOL_VERSION ((LRM_PROTCOL_MAJOR << 16) | LRM_PROTOCOL_MINOR)
#define RID_LEN 128
/*lrm's client uses this structure to access the resource*/
typedef struct
{
char* id;
char* type;
char* class;
char* provider;
GHashTable* params;
struct rsc_ops* ops;
}lrm_rsc_t;
/*used in struct lrm_op_t to show how an operation exits*/
typedef enum {
LRM_OP_PENDING = -1,
LRM_OP_DONE,
LRM_OP_CANCELLED,
LRM_OP_TIMEOUT,
LRM_OP_NOTSUPPORTED,
LRM_OP_ERROR
}op_status_t;
/*for all timeouts: in milliseconds. 0 for no timeout*/
/*this structure is the information of the operation.*/
#define EVERYTIME -1
#define CHANGED -2
/* Notice the interval and target_rc
*
* when interval==0, the operation will be executed only once
* when interval>0, the operation will be executed repeatly with the interval
*
* when target_rc==EVERYTIME, the client will be notified every time the
* operation executed.
* when target_rc==CHANGED, the client will be notified when the return code
* is different with the return code of last execute of the operation
* when target_rc is other value, only when the return code is the same of
* target_rc, the client will be notified.
*/
typedef struct{
/*input fields*/
char* op_type;
GHashTable* params;
int timeout;
char* user_data;
int user_data_len;
int interval;
int start_delay;
int copyparams; /* copy parameters to the rsc */
int target_rc;
/*output fields*/
op_status_t op_status;
int rc;
int call_id;
char* output;
char* rsc_id;
char* app_name;
unsigned long t_run; /* when did the op run (as age) */
unsigned long t_rcchange; /* last rc change (as age) */
unsigned long exec_time; /* time it took the op to run */
unsigned long queue_time; /* time spent in queue */
}lrm_op_t;
extern const lrm_op_t lrm_zero_op; /* an all-zeroes lrm_op_t value */
lrm_op_t* lrm_op_new(void);
void lrm_free_op(lrm_op_t* op);
void lrm_free_rsc(lrm_rsc_t* rsc);
void lrm_free_str_list(GList* list);
void lrm_free_op_list(GList* list);
void lrm_free_str_table(GHashTable* table);
/*this enum is used in get_cur_state*/
typedef enum {
LRM_RSC_IDLE,
LRM_RSC_BUSY
}state_flag_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: the structure of the operation. Caller can create the op by
* lrm_op_new() and release the op using lrm_free_op()
*
*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*, lrm_op_t* op);
/*
*cancel_op: cancel the operation on the resource.
*
*callid: the call id returned by perform_op()
*
*return: HA_OK for success, HA_FAIL for failure op not found
* or other failure
* NB: the client always gets a notification over callback
* even for operations which were idle (of course, if
* the request has been accepted for processing)
*/
int (*cancel_op) (lrm_rsc_t*, int call_id);
/*
*flush_ops: throw away all operations queued for this resource,
* and return them as cancelled.
*
*return: HA_OK for success, HA_FAIL for failure
* NB: op is not flushed unless it is idle;
* in that case this call will block
*/
int (*flush_ops) (lrm_rsc_t*);
/*
*get_cur_state:
* return the current state of the resource
*
*cur_state: current state of the resource
*
*return: cur_state should be in LRM_RSC_IDLE or LRM_RSC_BUSY.
* and the function returns a list of ops.
* the list includes:
* 1. last ops for each type (start/stop/etc) from current client
* 2. current pending ops
* 3. all recurring ops waiting to execute
* the list is sorted by the call_id of ops.
* client can release the list using lrm_free_op_list()
*/
GList* (*get_cur_state) (lrm_rsc_t*, state_flag_t* cur_state);
/*
*get_last_result:
* return the last op of given type from current client
*
*op_type: the given type
*
*return: the last op. if there is no such op, return NULL.
* client can release the op using lrm_free_op()
*/
lrm_op_t* (*get_last_result)(lrm_rsc_t*, const char *op_type);
};
/*
*lrm_op_done_callback_t:
* this type of callback functions are called when some
* asynchronous operation is done.
* client can release op by lrm_free_op()
*/
typedef void (*lrm_op_done_callback_t) (lrm_op_t* op);
typedef struct ll_lrm
{
struct lrm_ops* lrm_ops;
}ll_lrm_t;
struct lrm_ops
{
int (*signon) (ll_lrm_t*, const char * app_name);
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);
/*
int (*set_parameters)(ll_lrm_t*, const GHashTable* option);
GHashTable* (*get_all_parameters)(ll_lrm_t*);
char * (*get_parameter)(ll_lrm_t *, const char * paramname);
char * (*get_parameter_description)(ll_lrm_t*);
*/
/*
*get_rsc_class_supported:
* Returns the resource classes supported.
* e.g. ocf, heartbeat,lsb...
*
*return: a list of the names of supported resource classes.
* caller can release the list by lrm_free_str_list().
*/
GList* (*get_rsc_class_supported)(ll_lrm_t*);
/*
*get_rsc_type_supported:
* Returns the resource types supported of class rsc_class.
* e.g. drdb, apache,IPaddr...
*
*return: a list of the names of supported resource types.
* caller can release the list by lrm_free_str_list().
*/
GList* (*get_rsc_type_supported)(ll_lrm_t*, const char* rsc_class);
/*
*get_rsc_provider_supported:
* Returns the provider list of the given resource types
* e.g. heartbeat, failsafe...
*
*rsc_provider: if it is null, the default one will used.
*
*return: a list of the names of supported resource provider.
* caller can release the list by lrm_free_str_list().
*/
GList* (*get_rsc_provider_supported)(ll_lrm_t*,
const char* rsc_class, const char* rsc_type);
/*
*get_rsc_type_metadata:
* Returns the metadata of the resource type
*
*rsc_provider: if it is null, the default one will used.
*
*return: the metadata. use g_free() to free.
*
*/
char* (*get_rsc_type_metadata)(ll_lrm_t*, const char* rsc_class,
const char* rsc_type, const char* rsc_provider);
/*
*get_all_type_metadatas:
* Returns all the metadata of the resource type of the class
*
*return: A GHashtable, the key is the RA type,
* the value is the metadata.
* Now only default RA's metadata will be returned.
* please use lrm_free_str_table() to free the return value.
*/
GHashTable* (*get_all_type_metadata)(ll_lrm_t*, const char* rsc_class);
/*
*get_all_rscs:
* Returns all resources.
*
*return: a list of id of resources.
* caller can release the list by lrm_free_str_list().
*/
GList* (*get_all_rscs)(ll_lrm_t*);
/*
*get_rsc: Gets one resource pointer by the id
*
*return: the lrm_rsc_t type pointer, NULL for failure
* caller can release the pointer by lrm_free_rsc().
*/
lrm_rsc_t* (*get_rsc)(ll_lrm_t*, const char* 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.
*
*rsc_id: An id which sould be generated by client,
* 128byte(include '\0') UTF8 string
*
*class: the class of the resource
*
*type: the type of the resource.
*
*rsc_provider: if it is null, the default provider will used.
*
*params: the parameters for the resource.
*
*return: HA_OK for success, HA_FAIL for failure
*/
int (*add_rsc)(ll_lrm_t*, const char* rsc_id, const char* class,
const char* type, const char* provider, GHashTable* params);
/*
*delete_rsc: delete the resource by the rsc_id
*
*return: HA_OK for success, HA_FAIL for failure
* NB: resource removal is delayed until all operations are
* removed; the client, however, gets the reply immediately
*/
int (*delete_rsc)(ll_lrm_t*, const char* rsc_id);
/*
*ipcchan: Return the IPC channel which can be used for determining
* when messages are ready to be read.
*return: the IPC Channel
*/
IPC_Channel* (*ipcchan)(ll_lrm_t*);
/*
*msgready: Returns TRUE (1) when a message is ready to be read.
*/
gboolean (*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.
*
*return: the count of 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);
/*
*execra_code2string:
* Translate the return code of the operation to string
*
*code: the rc field in lrm_op_t structure
*/
const char *execra_code2string(uniform_ret_execra_t code);
#endif /* __LRM_API_H */