Coverage for curator/config_utils.py: 97%
38 statements
« prev ^ index » next coverage.py v7.3.0, created at 2023-08-16 15:27 -0600
« prev ^ index » next coverage.py v7.3.0, created at 2023-08-16 15:27 -0600
1"""Configuration utilty functions"""
2import logging
3from copy import deepcopy
4from voluptuous import Schema
5from curator.validators import SchemaCheck, config_file
6from curator.utils import ensure_list, get_yaml, prune_nones, test_client_options
7from curator.logtools import LogInfo, Whitelist, Blacklist
9def test_config(config):
10 """Test YAML against the schema"""
11 # Get config from yaml file
12 yaml_config = get_yaml(config)
13 # if the file is empty, which is still valid yaml, set as an empty dict
14 yaml_config = {} if not yaml_config else prune_nones(yaml_config)
15 # Voluptuous can't verify the schema of a dict if it doesn't have keys,
16 # so make sure the keys are at least there and are dict()
17 for k in ['client', 'logging']:
18 if k not in yaml_config:
19 yaml_config[k] = {}
20 else:
21 yaml_config[k] = prune_nones(yaml_config[k])
22 return SchemaCheck(
23 yaml_config, config_file.client(), 'Client Configuration', 'full configuration dictionary'
24 ).result()
26def set_logging(log_opts):
27 """Configure global logging options"""
28 # Set up logging
29 loginfo = LogInfo(log_opts)
30 logging.root.addHandler(loginfo.handler)
31 logging.root.setLevel(loginfo.numeric_log_level)
32 _ = logging.getLogger('curator.cli')
33 # Set up NullHandler() to handle nested elasticsearch7.trace Logger
34 # instance in elasticsearch python client
35 logging.getLogger('elasticsearch7.trace').addHandler(logging.NullHandler())
36 if log_opts['blacklist']:
37 for bl_entry in ensure_list(log_opts['blacklist']):
38 for handler in logging.root.handlers:
39 handler.addFilter(Blacklist(bl_entry))
41def process_config(yaml_file):
42 """Process yaml_file and return a valid client configuration"""
43 config = test_config(yaml_file)
44 set_logging(config['logging'])
45 test_client_options(config['client'])
46 return config['client']
48def password_filter(data):
49 """
50 Return a deepcopy of the dictionary with any password fields hidden
51 """
52 def iterdict(mydict):
53 for key, value in mydict.items():
54 if isinstance(value, dict):
55 iterdict(value)
56 elif key == "password":
57 mydict.update({"password": "REDACTED"})
58 return mydict
59 return iterdict(deepcopy(data))