Coverage for curator/validators/filter_functions.py: 100%

1"""Functions validating the ``filter`` Schema of an ``action``"""

2 import logging

3 from voluptuous import Any, In, Required, Schema

4 from es_client.helpers.utils import prune_nones

5 from curator.defaults import settings, filtertypes

6 from curator.exceptions import ConfigurationError

7 from curator.validators import SchemaCheck

8

9 logger = logging.getLogger(__name__)

10

11 def filtertype():

12 """

13 Return a :py:class:`~.voluptuous.schema_builder.Schema` object that uses

14 :py:func:`~.curator.defaults.settings.all_filtertypes` to populate acceptable values

15

16 :returns: A :py:class:`~.voluptuous.schema_builder.Schema` object

17 """

18 return {

19 Required('filtertype'): Any(

20 In(settings.all_filtertypes()),

21 msg=f'filtertype must be one of {settings.all_filtertypes()}'

22 )

23 }

24

25 def filterstructure():

26 """

27 Return a :py:class:`~.voluptuous.schema_builder.Schema` object that uses the return value from

28 :py:func:`~.curator.defaults.settings.structural_filter_elements` to populate acceptable values

29 and updates/merges the Schema object with the return value from

30 :py:func:`filtertype`

31

32 :returns: A :py:class:`~.voluptuous.schema_builder.Schema` object

33 """

34 # This is to first ensure that only the possible keys/filter elements are

35 # there, and get a dictionary back to work with.

36 retval = settings.structural_filter_elements()

37 retval.update(filtertype())

38 return Schema(retval)

39

40 def singlefilter(action, data):

41 """

42 Return a :py:class:`~.voluptuous.schema_builder.Schema` object that is created using the return

43 value from :py:func:`filtertype` to create a local variable ``ftype``. The values from

44 ``action`` and ``data`` are used to update ``ftype`` based on matching function names in

45 :py:mod:`~.curator.defaults.filtertypes`.

46

47 :py:func:`~.curator.defaults.settings.structural_filter_elements` to populate acceptable values

48 and updates/merges the Schema object with the return value from

49 :py:func:`filtertype`

50

51 :param action: The Curator action name

52 :type action: str

53 :param data: The filter block of the action

54

55 :returns: A :py:class:`~.voluptuous.schema_builder.Schema` object

56 """

57 try:

58 ftdata = data['filtertype']

59 except KeyError as exc:

60 raise ConfigurationError('Missing key "filtertype"') from exc

61 ftype = filtertype()

62 for each in getattr(filtertypes, ftdata)(action, data):

63 ftype.update(each)

64 return Schema(ftype)

65

66 def validfilters(action, location=None):

67 """Validate the filters in a list"""

68 def func(val):

69 """This validator method simply validates all filters in the list."""

70 for idx, value in enumerate(val):

71 pruned = prune_nones(value)

72 filter_dict = SchemaCheck(

73 pruned,

74 singlefilter(action, pruned),

75 'filter',

76 f'{location}, filter #{idx}: {pruned}'

77 ).result()

78 logger.debug('Filter #%s: %s', idx, filter_dict)

79 val[idx] = filter_dict

80 # If we've made it here without raising an Exception, it's valid

81 return val

82 return func