summaryrefslogtreecommitdiffstats
path: root/__root__/ccs-flatten
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2015-04-03 19:08:52 +0200
committerJan Pokorný <jpokorny@redhat.com>2015-04-08 19:56:10 +0200
commit010f71490592dbd929446f7038663154120fd3c9 (patch)
tree35c9e1eafa78dca9d58a6b1530c513a40d015b57 /__root__/ccs-flatten
parentb5db7e2d25031564fce347d603717c38998317a2 (diff)
downloadclufter-010f71490592dbd929446f7038663154120fd3c9.tar.gz
clufter-010f71490592dbd929446f7038663154120fd3c9.tar.xz
clufter-010f71490592dbd929446f7038663154120fd3c9.zip
ccs-flatten: (fwd-)port "resource-defaults section" support
See, e.g., https://git.fedorahosted.org/cgit/cluster.git/commit/?h=STABLE32&id=5bddd1e21098a183560f64a569dd15fa8fdca1a8 https://bugzilla.redhat.com/show_bug.cgi?id=707118#c9 Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to '__root__/ccs-flatten')
-rw-r--r--__root__/ccs-flatten/flatten.c1
-rw-r--r--__root__/ccs-flatten/reslist.c91
-rw-r--r--__root__/ccs-flatten/reslist.h2
3 files changed, 94 insertions, 0 deletions
diff --git a/__root__/ccs-flatten/flatten.c b/__root__/ccs-flatten/flatten.c
index 02a1096..a8f21d9 100644
--- a/__root__/ccs-flatten/flatten.c
+++ b/__root__/ccs-flatten/flatten.c
@@ -166,6 +166,7 @@ flatten(int argc, char **argv)
}
load_resources(&reslist, &rulelist);
+ load_resource_defaults(&rulelist);
build_resource_tree(&tree, &rulelist, &reslist);
if (!tree) {
fprintf(stderr, "No resource trees defined; nothing to do\n");
diff --git a/__root__/ccs-flatten/reslist.c b/__root__/ccs-flatten/reslist.c
index d515d9b..cf65ce8 100644
--- a/__root__/ccs-flatten/reslist.c
+++ b/__root__/ccs-flatten/reslist.c
@@ -515,3 +515,94 @@ load_resources(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 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(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);
+
+ if (conf_get(ccspath, &attr) != 0) {
+ 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 rulelist List of rules to use when searching CCS.
+ @return 0 on success, nonzero on failure.
+ */
+int
+load_resource_defaults(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(currule, tok) != 0)
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/__root__/ccs-flatten/reslist.h b/__root__/ccs-flatten/reslist.h
index 22fd536..caa0453 100644
--- a/__root__/ccs-flatten/reslist.h
+++ b/__root__/ccs-flatten/reslist.h
@@ -62,6 +62,7 @@
# define RESOURCE_ROOTDIR RA_METADATA_DIR
# define RESOURCE_TREE_ROOT "//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
@@ -157,6 +158,7 @@ int store_action(resource_act_t ** actsp, char *name, int depth, int timeout, in
Load/kill resource rule sets
*/
int load_resource_rules(const char *rpath, resource_rule_t ** rules, int rawmetadata);
+int load_resource_defaults(resource_rule_t **rules);
void destroy_resource_rules(resource_rule_t ** rules);
/*