From 010f71490592dbd929446f7038663154120fd3c9 Mon Sep 17 00:00:00 2001 From: Jan Pokorný Date: Fri, 3 Apr 2015 19:08:52 +0200 Subject: ccs-flatten: (fwd-)port "resource-defaults section" support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ý --- __root__/ccs-flatten/flatten.c | 1 + __root__/ccs-flatten/reslist.c | 91 ++++++++++++++++++++++++++++++++++++++++++ __root__/ccs-flatten/reslist.h | 2 + 3 files changed, 94 insertions(+) (limited to '__root__/ccs-flatten') 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); /* -- cgit