MINOR: spoe: Check uniqness of SPOE engine names during config parsing

The engine name is now kept in "spoe_config" struture. Because a SPOE filter can
be declared without engine name, we use the SPOE agent name by default. Then,
its uniqness is checked against all others SPOE engines configured for the same
proxy.

  * TODO: Add documentation
This commit is contained in:
Christopher Faulet 2017-09-19 11:08:28 +02:00 committed by Willy Tarreau
parent 57583e474e
commit 7ee8667c99
3 changed files with 28 additions and 0 deletions

View File

@ -140,6 +140,9 @@ If no engine name is provided on the SPOE filter line, no SPOE scope must be
found in the SPOE configuration file. All the file is considered to be in the found in the SPOE configuration file. All the file is considered to be in the
same anonymous and implicit scope. same anonymous and implicit scope.
The engine name must be uniq for a proxy. If no engine name is provided on the
SPOE filter line, the SPOE agent name is unsed by default.
2.2. "spoe-agent" section 2.2. "spoe-agent" section
-------------------------- --------------------------

View File

@ -237,6 +237,8 @@ struct spoe_agent {
/* SPOE filter configuration */ /* SPOE filter configuration */
struct spoe_config { struct spoe_config {
char *id; /* The SPOE engine name. If undefined in HAProxy config,
* it will be set with the SPOE agent name */
struct proxy *proxy; /* Proxy owning the filter */ struct proxy *proxy; /* Proxy owning the filter */
struct spoe_agent *agent; /* Agent used by this filter */ struct spoe_agent *agent; /* Agent used by this filter */
struct proxy agent_fe; /* Agent frontend */ struct proxy agent_fe; /* Agent frontend */

View File

@ -2745,6 +2745,7 @@ spoe_deinit(struct proxy *px, struct flt_conf *fconf)
struct spoe_agent *agent = conf->agent; struct spoe_agent *agent = conf->agent;
spoe_release_agent(agent); spoe_release_agent(agent);
free(conf->id);
free(conf); free(conf);
} }
fconf->conf = NULL; fconf->conf = NULL;
@ -2755,9 +2756,30 @@ spoe_deinit(struct proxy *px, struct flt_conf *fconf)
static int static int
spoe_check(struct proxy *px, struct flt_conf *fconf) spoe_check(struct proxy *px, struct flt_conf *fconf)
{ {
struct flt_conf *f;
struct spoe_config *conf = fconf->conf; struct spoe_config *conf = fconf->conf;
struct proxy *target; struct proxy *target;
/* Check all SPOE filters for proxy <px> to be sure all SPOE agent names
* are uniq */
list_for_each_entry(f, &px->filter_configs, list) {
struct spoe_config *c = f->conf;
/* This is not an SPOE filter */
if (f->id != spoe_filter_id)
continue;
/* This is the current SPOE filter */
if (f == fconf)
continue;
/* Check engine Id. It should be uniq */
if (!strcmp(conf->id, c->id)) {
Alert("Proxy %s : duplicated name for SPOE engine '%s'.\n",
px->id, conf->id);
return 1;
}
}
target = proxy_be_by_name(conf->agent->b.name); target = proxy_be_by_name(conf->agent->b.name);
if (target == NULL) { if (target == NULL) {
Alert("Proxy %s : unknown backend '%s' used by SPOE agent '%s'" Alert("Proxy %s : unknown backend '%s' used by SPOE agent '%s'"
@ -3707,6 +3729,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
} }
finish: finish:
conf->id = strdup(engine ? engine : curagent->id);
conf->agent = curagent; conf->agent = curagent;
list_for_each_entry_safe(mp, mpback, &curmps, list) { list_for_each_entry_safe(mp, mpback, &curmps, list) {
LIST_DEL(&mp->list); LIST_DEL(&mp->list);