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