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

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 

8 

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() 

25 

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)) 

40 

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'] 

47 

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))