in share/config.py [0:0]
def parse_config(config_yaml: str, expanders: list[Callable[[str], str]] = []) -> Config:
"""
Config component factory
Given a config yaml as string it return the Config instance as defined by the yaml
"""
for expander in expanders:
config_yaml = expander(config_yaml)
yaml_config = yaml.safe_load(config_yaml)
assert isinstance(yaml_config, dict)
conf: Config = Config()
if "inputs" not in yaml_config or not isinstance(yaml_config["inputs"], list):
raise ValueError("`inputs` must be provided as list")
for input_n, input_config in enumerate(yaml_config["inputs"]):
if "id" not in input_config or not isinstance(input_config["id"], str):
raise ValueError(f"`id` must be provided as string for input at position {input_n + 1}")
if "type" not in input_config or not isinstance(input_config["type"], str):
raise ValueError(f'`type` must be provided as string for input {input_config["id"]}')
try:
current_input: Input = Input(input_type=input_config["type"], input_id=input_config["id"])
except ValueError as e:
raise ValueError(f'An error occurred while applying type configuration for input {input_config["id"]}: {e}')
if "tags" in input_config:
current_input.tags = input_config["tags"]
if "multiline" in input_config:
if not isinstance(input_config["multiline"], dict):
raise ValueError(f'`multiline` must be provided as dictionary for input {input_config["id"]}')
multiline_config = input_config["multiline"]
if "type" not in multiline_config or not isinstance(multiline_config["type"], str):
raise ValueError(
f'`type` must be provided as string in multiline configuration for input {input_config["id"]}'
)
multiline_config["multiline_type"] = multiline_config["type"]
del multiline_config["type"]
try:
current_input.add_multiline_processor(**multiline_config)
except ValueError as e:
raise ValueError(
f'An error occurred while applying multiline configuration for input {input_config["id"]}: {e}'
)
if "expand_event_list_from_field" in input_config:
current_input.expand_event_list_from_field = input_config["expand_event_list_from_field"]
if "root_fields_to_add_to_expanded_event" in input_config:
current_input.root_fields_to_add_to_expanded_event = input_config["root_fields_to_add_to_expanded_event"]
if "json_content_type" in input_config:
current_input.json_content_type = input_config["json_content_type"]
include_rules: list[IncludeExcludeRule] = []
if "include" in input_config:
include_rules_from_config = input_config["include"]
if not isinstance(include_rules_from_config, list):
raise ValueError(f'`include` must be provided as list for input {input_config["id"]}')
for include_rule in include_rules_from_config:
include_rules.append(IncludeExcludeRule(pattern=str(include_rule)))
exclude_rules: list[IncludeExcludeRule] = []
if "exclude" in input_config:
exclude_rules_from_config = input_config["exclude"]
if not isinstance(exclude_rules_from_config, list):
raise ValueError(f'`exclude` must be provided as list for input {input_config["id"]}')
for exclude_rule in exclude_rules_from_config:
exclude_rules.append(IncludeExcludeRule(pattern=str(exclude_rule)))
if len(include_rules) > 0 or len(exclude_rules) > 0:
current_input.include_exclude_filter = IncludeExcludeFilter(
include_patterns=include_rules, exclude_patterns=exclude_rules
)
if "outputs" not in input_config or not isinstance(input_config["outputs"], list):
raise ValueError(f'`outputs` must be provided as list for input {input_config["id"]}')
for output_n, output_config in enumerate(input_config["outputs"]):
if "type" not in output_config or not isinstance(output_config["type"], str):
raise ValueError(
f"`type` for output configuration at position {output_n + 1} must "
f'be provided as string for input {input_config["id"]}'
)
if "args" not in output_config or not isinstance(output_config["args"], dict):
raise ValueError(
f"`args` for output configuration at position {output_n + 1} "
f'must be provided as dictionary for input {input_config["id"]}'
)
output_config["args"]["tags"] = current_input.tags
try:
current_input.add_output(output_type=output_config["type"], **output_config["args"])
except ValueError as e:
raise ValueError(
f"An error occurred while applying output configuration "
f'at position {output_n + 1} for input {input_config["id"]}: {e}'
)
conf.add_input(current_input)
return conf