[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ha-dev
Subject:    Re: [Linux-ha-dev] How to display the RAs to end users when we have
From:       Huang Zhen <zhenhltc () cn ! ibm ! com>
Date:       2004-11-09 10:46:39
Message-ID: 4190A00F.5020201 () cn ! ibm ! com
[Download RAW message or body]

Hi, Andrew,

I have made a patch to change the API of LRM as lmb suggestion.
Could you please review it and change CRM according to the new API?

Thank you very much!

Lars Marowsky-Bree wrote:
> On 2004-11-03T09:22:35, Huang Zhen <zhenhltc@cn.ibm.com> wrote:
> 
> 
>>>key. I was just pointing out on IRC that from the point of the code,
>>>that doesn't make sense. 
>>
>>And the get_provider_list() came to the code with your agreement.
>>(http://lists.community.tummy.com/pipermail/linux-ha-dev/2004-August/008739.html)
> 
> 
> Oops. I have to correct myself. Must have missed the extra
> "/Filesystem/" in there, that's not what the OCF RA API specifies.
> 
> /ocf/resource.d/{heartbeat,steeleye,suse,...}/Filesystem would be
> correct.
> 
> 
>>>(Where the logical hierarchy _is_ class -> provider -> type.)
>>
>>Please refer to the lrm_api.h which has been there for a long time and
>>asked for review several times.
> 
> 
> Yes, that's what I was referring to, and I simply missed this in the
> past.
> 
> 
>>GList* (*get_rsc_class_supported)(ll_lrm_t*);
>>GList* (*get_rsc_type_supported)(ll_lrm_t*, const char* rsc_class);
>>GList* (*get_rsc_provider_supported)(ll_lrm_t*,const char* rsc_class,
>>    	const char* rsc_type);
>>
>>Through these three functions we can find the logical hierarchy in it is
>>class->type->provider.
> 
> 
> Yeah, but this doesn't match the OCF RA API spec. I must have corrected
> this in my mind automatically when reading it, sorry about that.
> 
> 
> (Actually, exporting all of the LRM API as function pointers (even those
> which are not provided by plugins, but by the library directly) may not be
> the best way of doing things, as Alan has pointed out wrt the fencing
> API recently. But that's another issue, and one maybe Alan wants to
> comment on it. I don't have to write that code and thus don't care ;-)
> 
> 
>>Of cause, we should modify it if it is really wrong. So maybe it should 
>>be changed to this:
>>
>>GList* (*get_rsc_class_supported)(ll_lrm_t*);
>>GList* (*get_rsc_provider_supported)(ll_lrm_t*,const char* rsc_class);
>>GList* (*get_rsc_type_supported)(ll_lrm_t*, const char* rsc_class,
>>    	const char* provider);
> 
> 
> Yes, that's what I'd expect, and also what I _thought_ I had read in the
> past. ;-) Sorry about that.
> 
> 
>>One small issue is for the lsb and heartbeat classes, they don't have 
>>the concept of provider. Maybe we can let it just return NULL.
> 
> 
> NULL would probably be bad (and error prone). Returning a default value
> like "system" for LSB scripts, or "heartbeat" for the heartbeat class
> seems better.
> 
> (Note to the fancy: For the LSB scripts you could even try and go ask
> rpm (or dpkg) which package owns that script and report that. But I'm
> thinking I shouldn't even have mentioned that. ;-)
> 
> 
>>It will not take much time to do it.
>>Is this ok for CRM? If so, I will change it.
> 
> 
> Seems fine with me.
> 
> Alan, Andrew?
> 
> 
> Sincerely,
>     Lars Marowsky-Brée <lmb@suse.de>
> 


-- 

Best Regards,
Huang Zhen
LTC and pLinux Testing
IBM China Software Development Lab, Beijing
Telno: (8610)82782244-2845


["provider.patch" (text/plain)]

Index: include/lrm/lrm_api.h
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/include/lrm/lrm_api.h,v
retrieving revision 1.16
diff -u -r1.16 lrm_api.h
--- include/lrm/lrm_api.h	24 Oct 2004 13:00:12 -0000	1.16
+++ include/lrm/lrm_api.h	9 Nov 2004 10:14:02 -0000
@@ -220,27 +220,27 @@
 	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...
+ *get_rsc_provider_supported:
+ *		Returns the provider list of the given resource class
+ *		e.g. suse, failsafe...
  *
- *return:	a list of the names of supported resource types.
+ *return:	a list of the names of providers.
  *
  */
-	GList* 	(*get_rsc_type_supported)(ll_lrm_t*, const char* rsc_class);
-
+	GList* (*get_rsc_provider_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.
+ *get_rsc_type_supported:
+ *		Returns the resource types provided by the given provider
+ *		of the given class
+ *		e.g. drdb, apache,IPaddr...
  *
- *return:	a list of the names of supported resource provider.
+ *return:	a list of the names of supported resource types.
  *
  */
-	GList* 	(*get_rsc_provider_supported)(ll_lrm_t*,
-		const char* rsc_class, const char* rsc_type);
+	GList* (*get_rsc_type_supported)(ll_lrm_t*, const char* rsc_class,
+		const char* provider);
 
 /*
  *get_rsc_type_metadata:
@@ -253,17 +253,6 @@
  */
 	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.
- *
- */
-	GHashTable* (*get_all_type_metadata)(ll_lrm_t*, const char* rsc_class);
 
 /*
  *get_all_rscs:
Index: include/lrm/raexec.h
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/include/lrm/raexec.h,v
retrieving revision 1.10
diff -u -r1.10 raexec.h
--- include/lrm/raexec.h	3 Nov 2004 00:12:31 -0000	1.10
+++ include/lrm/raexec.h	9 Nov 2004 10:14:02 -0000
@@ -104,20 +104,20 @@
 	 * 	List all resource info of this class 
 	 *
 	 * Parameters:
-	 *	rsc_info: a GList which item data type is rsc_info_t as 
-	 *		  defined above, containing all resource info of
-	 *		  this class in the local machine.
+	 *	rsc_info: a GList which item data type is string as 
+	 *		  resource type, containing all resource type of
+	 *		  this class and this provider in the local machine.
 	 *
 	 * Return Value:
 	 *	>=0 : succeed. the RA type number of this RA class
 	 *	-1: failed due to invalid RA directory such as not existing.
 	 *	-2: failed due to other factors
 	 */
-	int (*get_resource_list)(GList ** rsc_info);
+	int (*get_resource_list)(const char* provider, GList ** rsc_info);
 	
 	/*
 	 * Description:
-	 * 	List all providers of this type
+	 * 	List all providers 
 	 *
 	 * Parameters:
 	 *	providers: a GList which item data type is string.
@@ -128,7 +128,7 @@
 	 *	-1: failed due to invalid RA directory such as not existing.
 	 *	-2: failed due to other factors
 	 */
-	int (*get_provider_list)(const char* ra_type, GList ** providers);
+	int (*get_provider_list)(GList ** providers);
 
 	/*
 	 * Description:
Index: lib/lrm/clientlib.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/lrm/clientlib.c,v
retrieving revision 1.26
diff -u -r1.26 clientlib.c
--- lib/lrm/clientlib.c	22 Oct 2004 02:44:55 -0000	1.26
+++ lib/lrm/clientlib.c	9 Nov 2004 10:14:05 -0000
@@ -44,12 +44,11 @@
 static int lrm_set_lrm_callback (ll_lrm_t* lrm,
 				 lrm_op_done_callback_t op_done_callback_func);
 static GList* lrm_get_rsc_class_supported (ll_lrm_t* lrm);
-static GList* lrm_get_rsc_type_supported (ll_lrm_t* lrm, const char* class);
-static GList* lrm_get_rsc_provider_supported (ll_lrm_t* lrm
-				,const char* class, const char* type);
+static GList* lrm_get_rsc_provider_supported (ll_lrm_t* lrm,const char* class);
+static GList* lrm_get_rsc_type_supported (ll_lrm_t* lrm, const char* class
+                                ,const char* provider);
 static char* lrm_get_rsc_type_metadata(ll_lrm_t* lrm, const char* class
 				,const char* type, const char* provider);
-static GHashTable* lrm_get_all_type_metadata(ll_lrm_t*, const char* class);
 static GList* lrm_get_all_rscs (ll_lrm_t* lrm);
 static lrm_rsc_t* lrm_get_rsc (ll_lrm_t* lrm, const char* rsc_id);
 static int lrm_add_rsc (ll_lrm_t*, const char* id, const char* class
@@ -66,10 +65,9 @@
 	lrm_delete,
 	lrm_set_lrm_callback,
 	lrm_get_rsc_class_supported,
-	lrm_get_rsc_type_supported,
 	lrm_get_rsc_provider_supported,
+	lrm_get_rsc_type_supported,
 	lrm_get_rsc_type_metadata,
-	lrm_get_all_type_metadata,
 	lrm_get_all_rscs,
 	lrm_get_rsc,
 	lrm_add_rsc,
@@ -377,7 +375,8 @@
 	return class_list;
 }
 static GList*
-lrm_get_rsc_type_supported (ll_lrm_t* lrm, const char* rclass)
+lrm_get_rsc_type_supported (ll_lrm_t* lrm, const char* rclass
+                                , const char* provider)
 {
 	struct ha_msg* msg;
 	struct ha_msg* ret;
@@ -397,13 +396,13 @@
 			"lrm_get_rsc_type_supported: can not create types msg");
 		return NULL;
 	}
-	if ( HA_OK != ha_msg_add(msg, F_LRM_RCLASS, rclass)) {
+	if ( HA_OK != ha_msg_add(msg, F_LRM_RCLASS, rclass)
+        ||   HA_OK != ha_msg_add(msg, F_LRM_RPROVIDER, provider)) {
 		ha_msg_del(msg);
 		client_log(LOG_ERR,
 			"lrm_get_rsc_type_supported: can not add field to msg");
 		return NULL;
 	}
-
 	/* send the msg to lrmd */
 	if (HA_OK != msg2ipcchan(msg,ch_cmd)) {
 		ha_msg_del(msg);
@@ -435,7 +434,7 @@
 	return type_list;
 }
 static GList*
-lrm_get_rsc_provider_supported (ll_lrm_t* lrm, const char* class, const char* type)
+lrm_get_rsc_provider_supported (ll_lrm_t* lrm, const char* class)
 {
 	struct ha_msg* msg;
 	struct ha_msg* ret;
@@ -455,8 +454,8 @@
 			"lrm_get_rsc_provider_supported: can not create types msg");
 		return NULL;
 	}
-	if (HA_OK != ha_msg_add(msg, F_LRM_RCLASS, class)
-	||  HA_OK != ha_msg_add(msg, F_LRM_RTYPE, type)) {
+
+	if (HA_OK != ha_msg_add(msg, F_LRM_RCLASS, class)) {
 		ha_msg_del(msg);
 		client_log(LOG_ERR,
 			"lrm_get_rsc_provider_supported: can not add field to msg");
@@ -471,6 +470,7 @@
 		return NULL;
 	}
 	ha_msg_del(msg);
+
 	/* get the return message */
 	ret = msgfromIPC_noauth(ch_cmd);
 	if (NULL == ret) {
@@ -478,6 +478,7 @@
 			"lrm_get_rsc_provider_supported: can not recieve ret msg");
 		return NULL;
 	}
+
 	/* get the rc of the message */
 	if (HA_OK != get_rc_from_msg(ret)) {
 		ha_msg_del(ret);
@@ -485,7 +486,8 @@
 			"lrm_get_rsc_provider_supported: rc from msg is fail");
 		return NULL;
 	}
-	/* get the ra provider list from message */
+
+        /* get the ra provider list from message */
 	provider_list = ha_msg_value_str_list(ret,F_LRM_RPROVIDERS);
 
 	ha_msg_del(ret);
@@ -494,32 +496,6 @@
 	return provider_list;
 }
 	
-/*
- * lrm_get_all_type_metadatas():
- * For OCF RAs, they may have more than one providers so they may have more than
- * one metadata. The hash table is not suitable for this. Fix Me
- */
-static GHashTable*
-lrm_get_all_type_metadata (ll_lrm_t* lrm, const char* rclass)
-{
-	GHashTable* metas = g_hash_table_new(g_str_hash, g_str_equal);
-	GList* types = lrm_get_rsc_type_supported (lrm, rclass);
-	GList* node = NULL;
-        const char* meta;
-
-	client_log(LOG_INFO,"lrm_get_all_type_metadatas: start.");
-	for (node = g_list_first(types); NULL!=node; node=g_list_next(node)) {
-		meta = lrm_get_rsc_type_metadata(lrm,rclass,node->data,NULL);
-		if (NULL == meta) {
-			continue;
-		}
-		g_hash_table_insert(metas, node->data,strdup(meta));
-	}
-	g_list_free(types);
-	
-	client_log(LOG_INFO,"lrm_get_all_type_metadatas: end.");
-	return metas;
-}
 
 static char*
 lrm_get_rsc_type_metadata (ll_lrm_t* lrm, const char* rclass, const char* rtype,
Index: lib/lrm/lrm_msg.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/lrm/lrm_msg.c,v
retrieving revision 1.18
diff -u -r1.18 lrm_msg.c
--- lib/lrm/lrm_msg.c	27 Sep 2004 08:33:55 -0000	1.18
+++ lib/lrm/lrm_msg.c	9 Nov 2004 10:14:09 -0000
@@ -306,7 +306,7 @@
 		return NULL;
 	}
 
-	ret = ha_msg_new(1);
+	ret = ha_msg_new(10);
 	if (HA_OK != ha_msg_add(ret, F_LRM_TYPE, msg)) {
 		ha_msg_del(ret);
 		cl_log(LOG_ERR, "ha_msg_add in create_lrm_msg failed");
Index: lib/plugins/lrm/racommon.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/plugins/lrm/racommon.c,v
retrieving revision 1.8
diff -u -r1.8 racommon.c
--- lib/plugins/lrm/racommon.c	10 Sep 2004 10:23:54 -0000	1.8
+++ lib/plugins/lrm/racommon.c	9 Nov 2004 10:14:09 -0000
@@ -84,7 +84,7 @@
 			"will cause memory leak.");
 		*rsc_info = NULL;
 	}
-
+        cl_log(LOG_ERR, "class_path:%s",class_path);
 	file_num = scandir(class_path, &namelist, 0, alphasort);
 	if (file_num < 0) {
 		cl_log(LOG_ERR, "scandir failed in RA plugin");
Index: lib/plugins/lrm/raexechb.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/plugins/lrm/raexechb.c,v
retrieving revision 1.26
diff -u -r1.26 raexechb.c
--- lib/plugins/lrm/raexechb.c	3 Nov 2004 00:51:35 -0000	1.26
+++ lib/plugins/lrm/raexechb.c	9 Nov 2004 10:14:09 -0000
@@ -55,9 +55,9 @@
 	 	  GHashTable * params);
 
 static uniform_ret_execra_t map_ra_retvalue(int ret_execra, const char * op_type);
-static int get_resource_list(GList ** rsc_info);
 static char* get_resource_meta(const char* rsc_type,  const char* provider);
-static int get_provider_list(const char* ra_type, GList ** providers);
+static int get_provider_list(GList ** providers);
+static int get_resource_list(const char* provider,GList ** rsc_info);
 
 /* The end of exported function list */
  
@@ -232,7 +232,7 @@
 }
 
 static int 
-get_resource_list(GList ** rsc_info)
+get_resource_list(const char* provider, GList ** rsc_info)
 {
 	return get_runnable_list(RA_PATH, rsc_info);			
 }
@@ -243,8 +243,19 @@
 	return g_strndup(rsc_type, strnlen(rsc_type, MAX_LENGTH_OF_RSCNAME));
 }	
 static int
-get_provider_list(const char* ra_type, GList ** providers)
+get_provider_list(GList ** providers)
 {
-	*providers = NULL;
-	return 0;
+	if ( providers == NULL ) {
+		cl_log(LOG_ERR, "Parameter error: get_providers");
+		return -2;
+	}
+
+	if ( *providers != NULL ) {
+		cl_log(LOG_ERR, "Parameter error: get_providers."\
+			"will cause memory leak.");
+		*providers = NULL;
+	}
+        *providers = g_list_append(*providers,g_strdup("heartbeat"));
+        return 1;
 }
+
Index: lib/plugins/lrm/raexeclsb.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/plugins/lrm/raexeclsb.c,v
retrieving revision 1.27
diff -u -r1.27 raexeclsb.c
--- lib/plugins/lrm/raexeclsb.c	3 Nov 2004 00:51:22 -0000	1.27
+++ lib/plugins/lrm/raexeclsb.c	9 Nov 2004 10:14:09 -0000
@@ -61,8 +61,8 @@
 
 static uniform_ret_execra_t map_ra_retvalue(int ret_execra, const char * op_type);
 static char* get_resource_meta(const char* rsc_type, const char* provider);
-static int get_resource_list(GList ** rsc_info);
-static int get_provider_list(const char* ra_type, GList ** providers);
+static int get_resource_list(const char* provider, GList ** rsc_info);
+static int get_provider_list(GList ** providers);
 
 /* The end of exported function list */
 
@@ -189,7 +189,7 @@
 }
 
 static int
-get_resource_list(GList ** rsc_info)
+get_resource_list(const char* provider, GList ** rsc_info)
 {
 	return get_runnable_list(RA_PATH, rsc_info);
 }
@@ -268,8 +268,18 @@
 }
 
 static int
-get_provider_list(const char* ra_type, GList ** providers)
+get_provider_list(GList ** providers)
 {
-	*providers = NULL;
-	return 0;
+	if ( providers == NULL ) {
+		cl_log(LOG_ERR, "Parameter error: get_providers");
+		return -2;
+	}
+
+	if ( *providers != NULL ) {
+		cl_log(LOG_ERR, "Parameter error: get_providers."\
+			"will cause memory leak.");
+		*providers = NULL;
+	}
+        *providers = g_list_append(*providers,g_strdup("system"));
+        return 1;
 }
Index: lib/plugins/lrm/raexecocf.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lib/plugins/lrm/raexecocf.c,v
retrieving revision 1.38
diff -u -r1.38 raexecocf.c
--- lib/plugins/lrm/raexecocf.c	3 Nov 2004 00:51:04 -0000	1.38
+++ lib/plugins/lrm/raexecocf.c	9 Nov 2004 10:14:09 -0000
@@ -73,9 +73,9 @@
 	 	  GHashTable * params);
 static uniform_ret_execra_t map_ra_retvalue(int ret_execra, 
 					    const char * op_type);
-static int get_resource_list(GList ** rsc_info);
 static char* get_resource_meta(const char* rsc_type,  const char* provider);
-static int get_provider_list(const char* ra_type, GList ** providers);
+static int get_resource_list(const char* provider, GList ** rsc_info);
+static int get_provider_list(GList ** providers);
 
 /* The end of exported function list */
 
@@ -90,10 +90,7 @@
 				   
 static gboolean let_remove_eachitem(gpointer key, gpointer value,
 				    gpointer user_data);
-static int get_providers(const char* class_path, const char* op_type,
-			 GList ** providers);
-static void merge_string_list(GList** old, GList* new);
-static gint compare_str(gconstpointer a, gconstpointer b);
+static int get_providers(const char* class_path, GList ** providers);
 
 /* The end of internal function & data list */
 
@@ -185,80 +182,20 @@
 	return ret_execra;
 }
 
-static gint
-compare_str(gconstpointer a, gconstpointer b)
-{
-	return strncmp(a,b,RA_MAX_NAME_LENGTH);
-}
 
 static int
-get_resource_list(GList ** rsc_info)
+get_resource_list(const char* provider,GList ** rsc_info)
 {
-	struct dirent **namelist;
-	GList* item;
-	int file_num;
 	char subdir[FILENAME_MAX+1];
-
-	if ( rsc_info == NULL ) {
-		cl_log(LOG_ERR, "Parameter error: get_resource_list");
-		return -2;
-	}
-
-	if ( *rsc_info != NULL ) {
-		cl_log(LOG_ERR, "Parameter error: get_resource_list."\
-			"will cause memory leak.");
-		*rsc_info = NULL;
-	}
-	file_num = scandir(RA_PATH, &namelist, 0, alphasort);
-	if (file_num < 0) {
-		return -2;
-	}
-	while (file_num--) {
-		GList* ra_subdir = NULL;
-		if ((DT_DIR != namelist[file_num]->d_type) || 
-		    ('.' == namelist[file_num]->d_name[0])) {
-			free(namelist[file_num]);
-			continue;
-		}
-
-		snprintf(subdir,FILENAME_MAX,"%s/%s",
-			 RA_PATH, namelist[file_num]->d_name);
-			 
-		get_runnable_list(subdir,&ra_subdir);
-
-		merge_string_list(rsc_info,ra_subdir);
-
-		while (NULL != (item = g_list_first(ra_subdir))) {
-			ra_subdir = g_list_remove_link(ra_subdir, item);
-			g_free(item->data);
-			g_list_free_1(item);
-		}
-
-		free(namelist[file_num]);
-	}
-	free(namelist);
-			
-	return 0;
-}
-
-static void
-merge_string_list(GList** old, GList* new)
-{
-	GList* item = NULL;
-	char* newitem;
-	for( item=g_list_first(new); NULL!=item; item=g_list_next(item)){
-		if (!g_list_find_custom(*old, item->data,compare_str)){
-			newitem = strndup(item->data,RA_MAX_NAME_LENGTH);
-			*old = g_list_append(*old, newitem);
-		}
-	}
+        snprintf(subdir,FILENAME_MAX,"%s/%s",RA_PATH, provider);
+	return get_runnable_list(subdir, rsc_info);
 }
 
 static int
-get_provider_list(const char* ra_type, GList ** providers)
+get_provider_list(GList ** providers)
 {
 	int ret;
-	ret = get_providers(RA_PATH, ra_type, providers);
+	ret = get_providers(RA_PATH, providers);
 	if (0>ret) {
 		cl_log(LOG_ERR, "scandir failed in OCF RA plugin");
 	}
@@ -367,7 +304,7 @@
 }
 
 static int
-get_providers(const char* class_path, const char* ra_type, GList ** providers)
+get_providers(const char* class_path, GList ** providers)
 {
 	struct dirent **namelist;
 	int file_num;
@@ -387,7 +324,6 @@
 	if (file_num < 0) {
 		return -2;
 	}else{
-		char tmp_buffer[FILENAME_MAX+1];
 		while (file_num--) {
 			if ((DT_DIR != namelist[file_num]->d_type) ||
 			    ('.' == namelist[file_num]->d_name[0])) {
@@ -395,13 +331,8 @@
 				continue;
 			}
 
-			snprintf(tmp_buffer,FILENAME_MAX,"%s/%s/%s",
-				 class_path, namelist[file_num]->d_name, ra_type);
-
-			if ( filtered(tmp_buffer) == TRUE ) {
-				*providers = g_list_append(*providers,
+			*providers = g_list_append(*providers,
 					g_strdup(namelist[file_num]->d_name));
-			}
 			free(namelist[file_num]);
 		}
 		free(namelist);
Index: lrm/admin/lrmadmin.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/admin/lrmadmin.c,v
retrieving revision 1.22
diff -u -r1.22 lrmadmin.c
--- lrm/admin/lrmadmin.c	24 Oct 2004 12:38:33 -0000	1.22
+++ lrm/admin/lrmadmin.c	9 Nov 2004 10:14:12 -0000
@@ -102,7 +102,7 @@
 
 const char * simple_help_screen =
 "lrmadmin {-d|--deamon}\n"
-"         {-A|--add} <rscid> <raclass> <ratype> <provider|NULL> \
[<rsc_params_list>]\n" +"         {-A|--add} <rscid> <raclass> <ratype> <provider> \
[<rsc_params_list>]\n"  "         {-D|--delete} <rscid>\n"
 "         {-F|--flush} <rscid>\n"
 "         {-E|--execute} <rscid> <operator> <timeout> <interval> \
<target_rc|EVERYTIME|CHANGED> [<operator_parameters_list>]\n" @@ -110,9 +110,9 @@
 "         {-L|--listall}\n"
 "         {-I|--information} <rsc_id>\n"
 "         {-C|--raclass_supported}\n"
-"         {-T|--ratype_supported} <raclss>\n"
-"         {-M|--metadata} <raclss> <ratype> <provider|NULL>\n"
-"         {-P|--provider} <raclss> <ratype>\n"
+"         {-P|--provider} <raclss> \n"
+"         {-T|--ratype_supported} <raclss> <provider>\n"
+"         {-M|--metadata} <raclss> <ratype> <provider>\n"
 "         {-h|--help}\n";
 
 #define OPTION_OBSCURE_CHECK \
@@ -128,7 +128,6 @@
 static int transfer_cmd_params(int amount, int start, char * argv[], 
 			   const char * class, GHashTable ** params_ht);
 static void g_print_stringitem(gpointer data, gpointer user_data);
-static void g_print_rainfo_item(gpointer data, gpointer user_data);
 static void g_print_ops(gpointer data, gpointer user_data);
 static void g_get_rsc_description(gpointer data, gpointer user_data);
 static void print_rsc_inf(lrm_rsc_t * lrmrsc);
@@ -143,6 +142,7 @@
 
 static int ra_metadata(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);
 static int ra_provider(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);
+static int ra_type(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);
 
 /* the end of the internal used function list */
 
@@ -156,7 +156,6 @@
         ll_lrm_t* lrmd;
 	lrm_rsc_t * lrm_rsc;
 	GList 	*raclass_list = 0, 
-		*ratype_list = 0,
 		*rscid_list;
 	char raclass[20];
 
@@ -167,7 +166,7 @@
 		printf("%s",simple_help_screen);
 		return 0;
 	}
-	
+
         cl_log_set_entity(lrmadmin_name);
 	cl_log_enable_stderr(FALSE);
 	cl_log_set_facility(LOG_USER);
@@ -210,9 +209,6 @@
 			case 'T':
 				OPTION_OBSCURE_CHECK 
 				lrmadmin_cmd = RATYPE_SUPPORTED;
-				if (optarg) {
-					strncpy(raclass, optarg, 19);
-				}
 				break;
 
 			case 'F':
@@ -403,18 +399,7 @@
 			break;	
 
 		case RATYPE_SUPPORTED:
-		     	ratype_list = lrmd->lrm_ops->
-				get_rsc_type_supported(lrmd, raclass);
-			printf("List size: %d\n", g_list_length(ratype_list));
-			if (ratype_list) {
-				g_list_foreach(ratype_list, g_print_rainfo_item,
-						NULL);
-				/* g_list_free(ratype_list); */
-			} else {
-				printf("For this RA class, no any RA type is "
-					"supported\n");
-			}
-
+        		ra_type(lrmd, argc, optind, argv);
 			ASYN_OPS = FALSE;
 			break;
 
@@ -588,26 +573,50 @@
 ra_provider(ll_lrm_t * lrmd, int argc, int optind, char * argv[])
 {
 	const char * class = argv[optind-1];
-	const char * type = argv[optind];
 	GList* providers = NULL;
 	GList* provider = NULL;
 	
-	if(argc < 4) {
+	if(argc < 3) {
 		cl_log(LOG_ERR,"No enough parameters.");
 		return -2;
 	}
 
-	providers = lrmd->lrm_ops->get_rsc_provider_supported(lrmd,class,type);
+	providers = lrmd->lrm_ops->get_rsc_provider_supported(lrmd,class);
 	
 	while (NULL != (provider = g_list_first(providers))) {
-		printf("%s\n",(char*)provider->data);
-		providers = g_list_remove(providers, provider->data);
-		g_free(provider->data);
+                char* name = (char*)provider->data;
+		printf("%s\n",name);
+		providers = g_list_remove(providers,name);
+		g_free(name);
 	}
 	g_list_free(providers);
 	return 0;
 }
 
+static int
+ra_type(ll_lrm_t * lrmd, int argc, int optind, char * argv[])
+{
+	const char * class = argv[optind - 1];
+        const char * provider = argv[optind];
+	GList* types = NULL;
+	GList* type = NULL;
+	if(argc < 4) {
+		cl_log(LOG_ERR,"No enough parameters.");
+		return -2;
+	}
+
+	types = lrmd->lrm_ops->get_rsc_type_supported(lrmd,class,provider);
+
+	while (NULL != (type = g_list_first(types))) {
+                char*  name = (char*)type->data;
+		printf("%s\n",name);
+		types = g_list_remove(types, name);
+		g_free(name);
+	}
+	g_list_free(types);
+	return 0;
+}
+
 static int 
 add_resource(ll_lrm_t * lrmd, int argc, int optind, char * argv[])
 {
@@ -760,18 +769,6 @@
 {
 	printf("%s\n", (char*)data);
 	g_free(data);  /*  ?  */
-}
-
-static void
-g_print_rainfo_item(gpointer data, gpointer user_data)
-{
-/*	rsc_info_t * rsc_info = (rsc_info_t *) data; */
-	printf("RA type name: %s\n", (char *)data);
-/*
-	printf("RA type name: %s  Version: %s\n", 
-		rsc_info->rsc_type, rsc_info->version);
-*/
-	g_free(data); /*  ?  */
 }
 
 static void
Index: lrm/lrmd/lrmd.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/lrmd/lrmd.c,v
retrieving revision 1.47
diff -u -r1.47 lrmd.c
--- lrm/lrmd/lrmd.c	22 Oct 2004 02:47:16 -0000	1.47
+++ lrm/lrmd/lrmd.c	9 Nov 2004 10:14:14 -0000
@@ -185,7 +185,7 @@
 	{REGISTER,	TRUE,	on_msg_register},
 	{GETRSCCLASSES,	FALSE,	on_msg_get_rsc_classes},
 	{GETRSCTYPES,	FALSE,	on_msg_get_rsc_types},
-	{GETPROVIDERS,	FALSE, on_msg_get_rsc_providers},
+	{GETPROVIDERS,	FALSE,  on_msg_get_rsc_providers},
 	{ADDRSC,	TRUE,	on_msg_add_rsc},
 	{GETRSC,	FALSE,	on_msg_get_rsc},
 	{GETALLRCSES,	FALSE,	on_msg_get_all},
@@ -920,13 +920,16 @@
 	GList* types = NULL;
 	GList* type;
 	const char* rclass = NULL;
+        const char* provider = NULL;
 
 	lrmd_log(LOG_DEBUG, "on_msg_get_rsc_types: start.");
 
-	ret = create_lrm_ret(HA_OK,5);
 
 	rclass = ha_msg_value(msg, F_LRM_RCLASS);
-	RAExec = g_hash_table_lookup(RAExecFuncs,rclass);
+       	provider = ha_msg_value(msg, F_LRM_RPROVIDER);
+	ret = create_lrm_ret(HA_OK,5);
+
+        RAExec = g_hash_table_lookup(RAExecFuncs,rclass);
 
 	if (NULL == RAExec) {
 		lrmd_log(LOG_DEBUG,"on_msg_get_rsc_types: can not find class");
@@ -937,7 +940,7 @@
 				"on_msg_get_rsc_types: can not create msg.");
 			return HA_FAIL;
 		}
-		if (0 <= RAExec->get_resource_list(&types)) {
+		if (0 <= RAExec->get_resource_list(provider,&types)) {
 			ha_msg_add_str_list(ret, F_LRM_RTYPES, types);
 			while (NULL != (type = g_list_first(types))) {
 				types = g_list_remove_link(types, type);
@@ -966,14 +969,12 @@
 	GList* providers = NULL;
 	GList* provider = NULL;
 	const char* rclass = NULL;
-	const char* rtype = NULL;
 
 	lrmd_log(LOG_DEBUG, "on_msg_get_rsc_providers: start.");
 
 	ret = create_lrm_ret(HA_OK,5);
 
 	rclass = ha_msg_value(msg, F_LRM_RCLASS);
-	rtype = ha_msg_value(msg, F_LRM_RTYPE);
 
 	RAExec = g_hash_table_lookup(RAExecFuncs,rclass);
 
@@ -981,7 +982,7 @@
 		lrmd_log(LOG_DEBUG,"on_msg_get_rsc_providers: can not find class");
 	}
 	else {
-		if (0 <= RAExec->get_provider_list(rtype, &providers)) {
+		if (0 <= RAExec->get_provider_list(&providers)) {
 			ha_msg_add_str_list(ret, F_LRM_RPROVIDERS, providers);
 			while (NULL != (provider = g_list_first(providers))) {
 				providers = g_list_remove_link(providers, provider);
Index: lrm/test/apitest.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/apitest.c,v
retrieving revision 1.12
diff -u -r1.12 apitest.c
--- lrm/test/apitest.c	22 Oct 2004 02:49:04 -0000	1.12
+++ lrm/test/apitest.c	9 Nov 2004 10:14:14 -0000
@@ -60,7 +60,7 @@
 	param = g_hash_table_new(g_str_hash,g_str_equal);
 	g_hash_table_insert(param, strdup("1"), strdup("3ffe:ffff:0:f101::3"));
 	puts("add_rsc...");
-	lrm->lrm_ops->add_rsc(lrm, rid, "heartbeat", "IPv6addr", NULL, param);
+	lrm->lrm_ops->add_rsc(lrm, rid, "heartbeat", "IPv6addr", "heartbeat", param);
 	puts("get_rsc...");
 	rsc = lrm->lrm_ops->get_rsc(lrm, rid);
 	printf_rsc(rsc);
Index: lrm/test/plugintest.c
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/plugintest.c,v
retrieving revision 1.8
diff -u -r1.8 plugintest.c
--- lrm/test/plugintest.c	9 Sep 2004 03:31:23 -0000	1.8
+++ lrm/test/plugintest.c	9 Nov 2004 10:14:14 -0000
@@ -57,7 +57,7 @@
 
 	PILLoadPlugin(PluginLoadingSystem , "RAExec", "ocf", NULL);
 	RAExec = g_hash_table_lookup(RAExecFuncs,"ocf");
-	ret = RAExec->get_resource_list(&ratype_list);
+	ret = RAExec->get_resource_list("heartbeat", &ratype_list);
 	printf("length=%d\n", g_list_length(ratype_list));
 	if (ret >= 0) {
 		g_list_foreach(ratype_list, g_print_item, NULL);
Index: lrm/test/ra_info
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/ra_info,v
retrieving revision 1.3
diff -u -r1.3 ra_info
--- lrm/test/ra_info	13 Sep 2004 09:28:08 -0000	1.3
+++ lrm/test/ra_info	9 Nov 2004 10:14:14 -0000
@@ -1,11 +1,13 @@
 #!/bin/bash
 ../admin/lrmadmin -d
 ../admin/lrmadmin -C
-../admin/lrmadmin -T lsb
-../admin/lrmadmin -T ocf
-../admin/lrmadmin -T heartbeat
+../admin/lrmadmin -P ocf
+../admin/lrmadmin -P lsb
+../admin/lrmadmin -P heartbeat
+../admin/lrmadmin -T lsb system
+../admin/lrmadmin -T heartbeat heartbeat
+../admin/lrmadmin -T ocf heartbeat
 ../admin/lrmadmin -M lsb sshd NULL
 ../admin/lrmadmin -M heartbeat IPv6addr NULL
 ../admin/lrmadmin -M ocf IPaddr NULL
 ../admin/lrmadmin -M ocf IPaddr heartbeat
-../admin/lrmadmin -P ocf IPaddr
Index: lrm/test/test_target_rc
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/test_target_rc,v
retrieving revision 1.3
diff -u -r1.3 test_target_rc
--- lrm/test/test_target_rc	14 Sep 2004 08:10:11 -0000	1.3
+++ lrm/test/test_target_rc	9 Nov 2004 10:14:14 -0000
@@ -1,5 +1,5 @@
 #!/bin/bash
-echo "../admin/lrmadmin -A ip heartbeat IPaddr NULL 192.168.58.4"
+echo "../admin/lrmadmin -A ip heartbeat IPaddr heartbeat 192.168.58.4"
 ../admin/lrmadmin -A ip heartbeat IPaddr NULL 192.168.58.4
 
 echo "../admin/lrmadmin -E ip status 0 0 13"
Index: lrm/test/test_target_rc_changed
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/test_target_rc_changed,v
retrieving revision 1.2
diff -u -r1.2 test_target_rc_changed
--- lrm/test/test_target_rc_changed	3 Sep 2004 01:46:20 -0000	1.2
+++ lrm/test/test_target_rc_changed	9 Nov 2004 10:14:14 -0000
@@ -1,5 +1,5 @@
 #!/bin/bash
-echo "../admin/lrmadmin -A ip heartbeat NULL IPaddr 192.168.58.4"
+echo "../admin/lrmadmin -A ip heartbeat IPaddr heartbeat 192.168.58.4"
 ../admin/lrmadmin -A ip heartbeat IPaddr NULL 192.168.58.4
 
 echo "../admin/lrmadmin -E ip status 0 1000 CHANGED &"
Index: lrm/test/test_target_rc_everytime
===================================================================
RCS file: /home/cvs/linux-ha/linux-ha/lrm/test/test_target_rc_everytime,v
retrieving revision 1.2
diff -u -r1.2 test_target_rc_everytime
--- lrm/test/test_target_rc_everytime	3 Sep 2004 01:46:20 -0000	1.2
+++ lrm/test/test_target_rc_everytime	9 Nov 2004 10:14:14 -0000
@@ -1,5 +1,5 @@
 #!/bin/bash
-echo "../admin/lrmadmin -A ip heartbeat IPaddr NULL 192.168.58.4"
+echo "../admin/lrmadmin -A ip heartbeat IPaddr heartbeat 192.168.58.4"
 ../admin/lrmadmin -A ip heartbeat IPaddr NULL 192.168.58.4
 
 echo "../admin/lrmadmin -E ip status 0 0 EVERYTIME"



_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic