Coverage for curator/actions/forcemerge.py: 100%
33 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-20 21:00 -0600
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-20 21:00 -0600
1"""Forcemerge action class"""
2import logging
3from time import sleep
4# pylint: disable=import-error
5from curator.exceptions import MissingArgument
6from curator.helpers.testers import verify_index_list
7from curator.helpers.utils import report_failure, show_dry_run
9class ForceMerge:
10 """ForceMerge Action Class"""
11 def __init__(self, ilo, max_num_segments=None, delay=0):
12 """
13 :param ilo: An IndexList Object
14 :param max_num_segments: Number of segments per shard to forceMerge
15 :param delay: Number of seconds to delay between forceMerge operations
17 :type ilo: :py:class:`~.curator.indexlist.IndexList`
18 :type max_num_segments: int
19 :type delay: int
20 """
21 verify_index_list(ilo)
22 if not max_num_segments:
23 raise MissingArgument('Missing value for "max_num_segments"')
24 #: The :py:class:`~.curator.indexlist.IndexList` object passed from param ``ilo``
25 self.index_list = ilo
26 #: The :py:class:`~.elasticsearch.Elasticsearch` client object derived from
27 #: :py:attr:`index_list`
28 self.client = ilo.client
29 #: Object attribute that gets the value of param ``max_num_segments``.
30 self.max_num_segments = max_num_segments
31 #: Object attribute that gets the value of param ``delay``.
32 self.delay = delay
33 self.loggit = logging.getLogger('curator.actions.forcemerge')
35 def do_dry_run(self):
36 """Log what the output would be, but take no action."""
37 show_dry_run(
38 self.index_list, 'forcemerge', max_num_segments=self.max_num_segments, delay=self.delay
39 )
41 def do_action(self):
42 """:py:meth:`~.elasticsearch.client.IndicesClient.forcemerge` indices in :py:attr:`index_list`"""
43 self.index_list.filter_closed()
44 self.index_list.filter_forceMerged(max_num_segments=self.max_num_segments)
45 self.index_list.empty_list_check()
46 msg = (
47 f'forceMerging {len(self.index_list.indices)} '
48 f'selected indices: {self.index_list.indices}'
49 )
50 self.loggit.info(msg)
51 try:
52 for index_name in self.index_list.indices:
53 msg = (
54 f'forceMerging index {index_name} to {self.max_num_segments} '
55 f'segments per shard. Please wait...'
56 )
57 self.loggit.info(msg)
58 self.client.indices.forcemerge(
59 index=index_name, max_num_segments=self.max_num_segments)
60 if self.delay > 0:
61 self.loggit.info('Pausing for %s seconds before continuing...', self.delay)
62 sleep(self.delay)
63 # pylint: disable=broad-except
64 except Exception as err:
65 report_failure(err)