From ce13ac0363eeca0b50bf9634f70a7766a25d1a09 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 8 Jun 2026 14:38:54 +0900 Subject: [PATCH 1/3] config_format: cf_yaml: Support list format for parsers Signed-off-by: Hiroshi Hatake --- src/config_format/flb_cf_yaml.c | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/config_format/flb_cf_yaml.c b/src/config_format/flb_cf_yaml.c index 675ee6dd9e3..e497d97e9d4 100644 --- a/src/config_format/flb_cf_yaml.c +++ b/src/config_format/flb_cf_yaml.c @@ -120,6 +120,7 @@ enum state { STATE_SECTION, /* top level */ STATE_SECTION_KEY, STATE_SECTION_VAL, + STATE_SECTION_VAL_LIST, STATE_SERVICE, /* 'service' section */ STATE_INCLUDE, /* 'includes' section */ @@ -268,6 +269,8 @@ static char *state_str(enum state val) return "section-key"; case STATE_SECTION_VAL: return "section-value"; + case STATE_SECTION_VAL_LIST: + return "section-value-list"; case STATE_SERVICE: return "service"; case STATE_INCLUDE: @@ -885,6 +888,7 @@ static int consume_event(struct flb_cf *conf, struct local_ctx *ctx, char *value; struct flb_cf_env_var *keyval; char *last_included; + flb_sds_t normalized_key; last_included = state_get_last(ctx); @@ -1961,6 +1965,75 @@ static int consume_event(struct flb_cf *conf, struct local_ctx *ctx, return YAML_FAILURE; } + if (state->state != STATE_SECTION_KEY) { + yaml_error_event(ctx, state, event); + return YAML_FAILURE; + } + break; + case YAML_SEQUENCE_START_EVENT: + normalized_key = flb_cf_key_translate(conf, state->key, flb_sds_len(state->key)); + if (normalized_key == NULL) { + flb_error("unable to normalize key"); + return YAML_FAILURE; + } + + ret = strcasecmp(normalized_key, "parsers_file"); + flb_sds_destroy(normalized_key); + + if (state->section != SECTION_SERVICE || ret != 0) { + yaml_error_event(ctx, state, event); + return YAML_FAILURE; + } + + state = state_push_key(ctx, STATE_SECTION_VAL_LIST, state->key); + if (state == NULL) { + flb_error("unable to allocate state"); + return YAML_FAILURE; + } + break; + default: + yaml_error_event(ctx, state, event); + return YAML_FAILURE; + } + break; + + case STATE_SECTION_VAL_LIST: + switch(event->type) { + case YAML_SCALAR_EVENT: + value = (char *) event->data.scalar.value; + + if (state->cf_section == NULL) { + flb_error("no section to register key value to"); + return YAML_FAILURE; + } + + if (flb_cf_section_property_add(conf, state->cf_section->properties, + state->key, flb_sds_len(state->key), + value, strlen(value)) < 0) { + flb_error("unable to add property"); + return YAML_FAILURE; + } + break; + case YAML_SEQUENCE_END_EVENT: + state = state_pop(ctx); + + if (state == NULL) { + flb_error("no state left"); + return YAML_FAILURE; + } + + if (state->state != STATE_SECTION_VAL) { + yaml_error_event(ctx, state, event); + return YAML_FAILURE; + } + + state = state_pop(ctx); + + if (state == NULL) { + flb_error("no state left"); + return YAML_FAILURE; + } + if (state->state != STATE_SECTION_KEY) { yaml_error_event(ctx, state, event); return YAML_FAILURE; From 18995b72977797081ed57db8eeb0864bce945ea1 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 8 Jun 2026 14:39:43 +0900 Subject: [PATCH 2/3] tests: internal: Add a test case for list format of parsers Signed-off-by: Hiroshi Hatake --- tests/internal/config_format_yaml.c | 50 +++++++++++++++++++ .../yaml/parsers/parsers-extra.conf | 4 ++ .../yaml/parsers/parsers-list-camel-case.yaml | 4 ++ .../yaml/parsers/parsers-list.yaml | 4 ++ 4 files changed, 62 insertions(+) create mode 100644 tests/internal/data/config_format/yaml/parsers/parsers-extra.conf create mode 100644 tests/internal/data/config_format/yaml/parsers/parsers-list-camel-case.yaml create mode 100644 tests/internal/data/config_format/yaml/parsers/parsers-list.yaml diff --git a/tests/internal/config_format_yaml.c b/tests/internal/config_format_yaml.c index 118104407e3..46e2136072c 100644 --- a/tests/internal/config_format_yaml.c +++ b/tests/internal/config_format_yaml.c @@ -32,6 +32,8 @@ #define FLB_004 FLB_TESTS_CONF_PATH "/stream_processor.yaml" #define FLB_005 FLB_TESTS_CONF_PATH "/plugins.yaml" #define FLB_006 FLB_TESTS_CONF_PATH "/upstream.yaml" +#define FLB_PARSERS_LIST FLB_TESTS_CONF_PATH "/parsers/parsers-list.yaml" +#define FLB_PARSERS_LIST_CAMEL_CASE FLB_TESTS_CONF_PATH "/parsers/parsers-list-camel-case.yaml" #define FLB_000_WIN FLB_TESTS_CONF_PATH "\\fluent-bit-windows.yaml" #define FLB_BROKEN_PLUGIN_VARIANT FLB_TESTS_CONF_PATH "/broken_plugin_variant.yaml" @@ -322,6 +324,52 @@ static void test_parser_conf() flb_config_exit(config); } +static void test_parser_conf_list_file(char *path) +{ + struct flb_cf *cf; + struct flb_config *config; + int ret; + int cnt; + + cf = flb_cf_yaml_create(NULL, path, NULL, 0); + TEST_CHECK(cf != NULL); + if (!cf) { + exit(EXIT_FAILURE); + } + + config = flb_config_init(); + TEST_CHECK(config != NULL); + config->conf_path = flb_strdup(FLB_TESTS_CONF_PATH "/parsers/"); + + /* Count the parsers registered automatically by fluent-bit */ + cnt = mk_list_size(&config->parsers); + + ret = flb_config_load_config_format(config, cf); + if (ret != 0) { + exit(EXIT_FAILURE); + } + + if (!TEST_CHECK(mk_list_size(&config->parsers) == cnt + 2)) { + TEST_MSG("Section number error. Got=%d expect=%d", + mk_list_size(&config->parsers), + cnt + 2); + } + + flb_cf_dump(cf); + flb_cf_destroy(cf); + flb_config_exit(config); +} + +static void test_parser_conf_list(void) +{ + test_parser_conf_list_file(FLB_PARSERS_LIST); +} + +static void test_parser_conf_list_camel_case(void) +{ + test_parser_conf_list_file(FLB_PARSERS_LIST_CAMEL_CASE); +} + static inline int check_camel_to_snake(char *input, char *output) { int len; @@ -880,6 +928,8 @@ TEST_LIST = { { "slist odd", test_slist_odd}, { "slist even", test_slist_even}, { "parsers file conf", test_parser_conf}, + { "parsers file conf list", test_parser_conf_list}, + { "parsers file conf list camel case", test_parser_conf_list_camel_case}, { "camel_case_key", test_camel_case_key}, { "processors", test_processors}, { "parsers_and_multiline_parsers", test_parsers_and_multiline_parsers}, diff --git a/tests/internal/data/config_format/yaml/parsers/parsers-extra.conf b/tests/internal/data/config_format/yaml/parsers/parsers-extra.conf new file mode 100644 index 00000000000..22a41ac1d86 --- /dev/null +++ b/tests/internal/data/config_format/yaml/parsers/parsers-extra.conf @@ -0,0 +1,4 @@ +[PARSER] + Name extra + Format regex + Regex ^(?.*)$ diff --git a/tests/internal/data/config_format/yaml/parsers/parsers-list-camel-case.yaml b/tests/internal/data/config_format/yaml/parsers/parsers-list-camel-case.yaml new file mode 100644 index 00000000000..1990689a4c2 --- /dev/null +++ b/tests/internal/data/config_format/yaml/parsers/parsers-list-camel-case.yaml @@ -0,0 +1,4 @@ +service: + parsersFile: + - parsers.conf + - parsers-extra.conf diff --git a/tests/internal/data/config_format/yaml/parsers/parsers-list.yaml b/tests/internal/data/config_format/yaml/parsers/parsers-list.yaml new file mode 100644 index 00000000000..a0a8b17f157 --- /dev/null +++ b/tests/internal/data/config_format/yaml/parsers/parsers-list.yaml @@ -0,0 +1,4 @@ +service: + parsers_file: + - parsers.conf + - parsers-extra.conf From 670ede3960c93a315a8819802c92ef9ec8a263c8 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 8 Jun 2026 15:07:54 +0900 Subject: [PATCH 3/3] config_format: cf_yaml: Use a NULL check Signed-off-by: Hiroshi Hatake --- src/config_format/flb_cf_yaml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config_format/flb_cf_yaml.c b/src/config_format/flb_cf_yaml.c index e497d97e9d4..dd302201704 100644 --- a/src/config_format/flb_cf_yaml.c +++ b/src/config_format/flb_cf_yaml.c @@ -2009,7 +2009,7 @@ static int consume_event(struct flb_cf *conf, struct local_ctx *ctx, if (flb_cf_section_property_add(conf, state->cf_section->properties, state->key, flb_sds_len(state->key), - value, strlen(value)) < 0) { + value, strlen(value)) == NULL) { flb_error("unable to add property"); return YAML_FAILURE; }