diff --git a/server/core/config.c b/server/core/config.c index 69dab32b3..45004a8a0 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -2599,6 +2599,33 @@ static int validate_ssl_parameters(CONFIG_CONTEXT* obj, char *ssl_cert, char *ss return error_count; } +/** + * @brief Add default parameters for a module to the configuration context + * + * Only parameters that aren't defined are added to the configuration context. + * This allows users to override the default values. + * + * @param ctx Configuration context where the default parameters are added + * @param module Name of the module + */ +static void config_add_defaults(CONFIG_CONTEXT *ctx, const char *module) +{ + const MXS_MODULE *mod = get_module(module); + + if (mod) + { + for (int i = 0; mod->parameters[i].name; i++) + { + ss_dassert(config_param_is_valid(module, mod->parameters[i].name, + mod->parameters[i].default_value)); + + bool rv = config_add_param(ctx, mod->parameters[i].name, + mod->parameters[i].default_value); + MXS_ABORT_IF_FALSE(rv); + } + } +} + /** * Create a new router for a service * @param obj Service configuration context @@ -2795,6 +2822,11 @@ int create_new_service(CONFIG_CONTEXT *obj) } } } + + /** Store the configuration parameters for the service */ + config_add_defaults(obj, router); + service_add_parameters(obj->element, obj->parameters); + return error_count; } @@ -3023,6 +3055,7 @@ int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* if (error_count == 0) { + config_add_defaults(obj, module); monitorAddParameters(obj->element, obj->parameters); char *interval_str = config_get_value(obj->parameters, "monitor_interval"); @@ -3235,7 +3268,9 @@ int create_new_filter(CONFIG_CONTEXT *obj) } } + config_add_defaults(obj, module); CONFIG_PARAMETER *params = obj->parameters; + while (params) { if (strcmp(params->name, "module") && strcmp(params->name, "options")) diff --git a/server/core/maxscale/service.h b/server/core/maxscale/service.h index 535efa24f..9b3a4f48c 100644 --- a/server/core/maxscale/service.h +++ b/server/core/maxscale/service.h @@ -121,6 +121,16 @@ void service_update(SERVICE *service, char *router, char *user, char *auth); bool service_set_param_value(SERVICE* service, CONFIG_PARAMETER* param, char* valstr, count_spec_t count_spec, config_param_type_t type); +/** + * @brief Add parameters to a service + * + * A copy of @c param is added to @c service. + * + * @param service Service where the parameters are added + * @param param Parameters to add + */ +void service_add_parameters(SERVICE *service, const CONFIG_PARAMETER *param); + /** * Internal debugging diagnostics */ diff --git a/server/core/service.c b/server/core/service.c index 3c0dd54ca..d682eafa3 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1658,6 +1658,17 @@ int service_refresh_users(SERVICE *service) return ret; } +void service_add_parameters(SERVICE *service, const CONFIG_PARAMETER *param) +{ + while (param) + { + CONFIG_PARAMETER *new_param = config_clone_param(param); + new_param->next = service->svc_config_param; + service->svc_config_param = new_param; + param = param->next; + } +} + bool service_set_param_value(SERVICE* service, CONFIG_PARAMETER* param, char* valstr,