cluster: RHEL6 - rgmanager: Add resource-defaults section

Fabio M. Di Nitto fabbione at fedoraproject.org
Fri May 27 06:02:05 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=fa3d94ccb63d8217ae4e6ea5ebb29c5e2af574da
Commit:        fa3d94ccb63d8217ae4e6ea5ebb29c5e2af574da
Parent:        c1d789ec9c1652eff3150dad56f5f1e3a90d0ef7
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Fri Apr 30 15:09:55 2010 -0400
Committer:     Fabio M. Di Nitto <fdinitto at redhat.com>
CommitterDate: Fri May 27 07:48:20 2011 +0200

rgmanager: Add resource-defaults section

Allows resources to have defaults assigned in cluster.conf so
that they do not need to be copied to each resource individually.

* You cannot set defaults on unique/primary attributes
* You cannoy currently override actions in the resource-defaults
  section.

   <rm>
     <resource-defaults>
       <vm migration_mapping="host1:host1-priv,host2:host2-priv"
           path="/mnt/guests/configs:/mnt/guests2/configs" />
     </resource-defaults>

     <vm name="foo" />
     <vm name="foo2" /> <!-- will both have above migration_mapping
                             and path attributes -->
   </rm>

Signed-off-by: Lon Hohberger <lhh at redhat.com>
Signed-off-by: Fabio M. Di Nitto <fdinitto at redhat.com>
---
 rgmanager/include/reslist.h      |    2 +
 rgmanager/src/daemons/groups.c   |    2 +
 rgmanager/src/daemons/reslist.c  |   97 ++++++++++++++++++++++++++++++++++++++
 rgmanager/src/daemons/resrules.c |   10 ++++-
 rgmanager/src/daemons/test.c     |    3 +
 5 files changed, 113 insertions(+), 1 deletions(-)

diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h
index 921c483..68ea032 100644
--- a/rgmanager/include/reslist.h
+++ b/rgmanager/include/reslist.h
@@ -45,6 +45,7 @@
 #define RESOURCE_ROOTDIR	SHAREDIR
 #define RESOURCE_TREE_ROOT	"/cluster/rm"
 #define RESOURCE_BASE		RESOURCE_TREE_ROOT "/resources"
+#define RESOURCE_DEFAULTS	RESOURCE_TREE_ROOT "/resource-defaults"
 #define RESOURCE_ROOT_FMT 	RESOURCE_TREE_ROOT "/%s[%d]"
 
 #define RESOURCE_MAX_LEVELS	100
@@ -150,6 +151,7 @@ int resource_tree_delta(resource_node_t **, resource_node_t **);
    Load/kill resource rule sets
  */
 int load_resource_rules(const char *rpath, resource_rule_t **rules);
+int load_resource_defaults(int ccsfd, resource_rule_t **rules);
 void print_resource_rule(FILE *fp, resource_rule_t *rule);
 void print_resource_rules(resource_rule_t **rules);
 void dump_resource_rules(FILE *fp, resource_rule_t **rules);
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index 1d3c518..ec8ab63 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1689,6 +1689,8 @@ init_resource_groups(int reconfigure, int do_init)
 		return -1;
 	}
 
+	load_resource_defaults(fd, &rulelist);
+
 	if (build_resource_tree(fd, &tree, &rulelist, &reslist) != 0) {
 		logt_print(LOG_CRIT, "#7: Error building resource tree\n");
 		destroy_resource_tree(&tree);
diff --git a/rgmanager/src/daemons/reslist.c b/rgmanager/src/daemons/reslist.c
index c908166..e1695fb 100644
--- a/rgmanager/src/daemons/reslist.c
+++ b/rgmanager/src/daemons/reslist.c
@@ -890,3 +890,100 @@ load_resources(int ccsfd, resource_t **reslist, resource_rule_t **rulelist)
 	return 0;
 }
 
+
+/**
+   Try to load all the attributes in our rule set.  If none are found,
+   or an error occurs, return NULL and move on to the next one.
+
+   @param ccsfd		File descriptor connected to CCS
+   @param rule		Resource rule set to use when looking for data
+   @param base		Base XPath path to start with.
+   @return		New resource if legal or NULL on failure/error
+ */
+static int
+load_defaults(int ccsfd, resource_rule_t *rule, char *base)
+{
+	char ccspath[1024];
+	char *attrname, *attr;
+	int x, flags;
+
+	for (x = 0; rule->rr_attrs && rule->rr_attrs[x].ra_name; x++) {
+
+		flags = rule->rr_attrs[x].ra_flags;
+
+		/* Defaults for primary/unique may not be assigned */
+		if (flags & (RA_PRIMARY | RA_UNIQUE))
+			continue;
+		attrname = strdup(rule->rr_attrs[x].ra_name);
+		if (!attrname)
+			return -1;
+
+		attr = NULL;
+		snprintf(ccspath, sizeof(ccspath), "%s/@%s", base, attrname);
+
+#ifndef NO_CCS
+		if (ccs_get(ccsfd, ccspath, &attr) != 0) {
+#else
+		if (conf_get(ccspath, &attr) != 0) {
+#endif
+			free(attrname);
+			continue;
+		}
+
+		if (rule->rr_attrs[x].ra_value &&
+		    !strcmp(rule->rr_attrs[x].ra_value, attr)) {
+			free(attrname);
+			free(attr);
+			continue;
+		}
+
+		if (rule->rr_attrs[x].ra_value) {
+		printf("changing default for %s attr %s from %s to %s\n", rule->rr_type,
+		       rule->rr_attrs[x].ra_name, rule->rr_attrs[x].ra_value,
+		       attr);
+		} else {
+		printf("setting default for %s attr %s to %s\n", rule->rr_type,
+		       rule->rr_attrs[x].ra_name, attr);
+		}
+
+		flags &= ~RA_INHERIT;
+
+		/*
+		 * Overwrite defaults
+		 */
+		if (attrname && attr)
+			store_attribute(&rule->rr_attrs, attrname, attr, flags);
+	}
+
+	/* FIXME - add action support */
+
+	return 0;
+}
+
+
+/**
+   Read all resources in the resource manager block in CCS.
+
+   @param ccsfd		File descriptor connected to CCS.
+   @param rulelist	List of rules to use when searching CCS.
+   @return		0 on success, nonzero on failure.
+ */
+int
+load_resource_defaults(int ccsfd, resource_rule_t **rulelist)
+{
+	int rid = 0;
+	resource_rule_t *currule;
+	char tok[256];
+
+	list_for(rulelist, currule, rid) {
+
+		snprintf(tok, sizeof(tok), RESOURCE_DEFAULTS "/%s",
+			 currule->rr_type);
+			
+		if (load_defaults(ccsfd, currule, tok) != 0)
+			return -1;
+	}
+
+	return 0;
+}
+
diff --git a/rgmanager/src/daemons/resrules.c b/rgmanager/src/daemons/resrules.c
index 576c349..41bb6e8 100644
--- a/rgmanager/src/daemons/resrules.c
+++ b/rgmanager/src/daemons/resrules.c
@@ -467,7 +467,15 @@ store_attribute(resource_attr_t **attrsp, char *name, char *value, int flags)
 		return 0;
 	}
 
-	for (x = 0; attrs[x].ra_name; x++);
+	for (x = 0; attrs[x].ra_name; x++) {
+		if (strcmp(attrs[x].ra_name, name) == 0) {
+			free(name);
+			free(attrs[x].ra_value);
+			attrs[x].ra_value = value;
+			attrs[x].ra_flags = flags;
+			return 0;
+		}
+	}
 
 	attrs = realloc(attrs, sizeof(resource_attr_t) * (x+2));
 	if (!attrs)
diff --git a/rgmanager/src/daemons/test.c b/rgmanager/src/daemons/test.c
index 1c7cae9..1982995 100644
--- a/rgmanager/src/daemons/test.c
+++ b/rgmanager/src/daemons/test.c
@@ -133,6 +133,7 @@ test_func(int argc, char **argv)
 	}
 
 	load_resource_rules(agentpath, &rulelist);
+	load_resource_defaults(ccsfd, &rulelist);
 	construct_domains(ccsfd, &domains);
 	construct_events(ccsfd, &events);
 	load_resources(ccsfd, &reslist, &rulelist);
@@ -283,6 +284,7 @@ tree_delta_test(int argc, char **argv)
 	}
 
 	load_resource_rules(agentpath, &rulelist);
+	load_resource_defaults(ccsfd, &rulelist);
 	load_resources(ccsfd, &reslist, &rulelist);
 	build_resource_tree(ccsfd, &tree, &rulelist, &reslist);
 	ccs_unlock(ccsfd);
@@ -297,6 +299,7 @@ tree_delta_test(int argc, char **argv)
 	}
 
 	load_resource_rules(agentpath, &rulelist2);
+	load_resource_defaults(ccsfd, &rulelist);
 	load_resources(ccsfd, &reslist2, &rulelist2);
 	build_resource_tree(ccsfd, &tree2, &rulelist2, &reslist2);
 	ccs_unlock(ccsfd);


More information about the cluster-commits mailing list