eventdata/runners/deleteindex_runner.py (31 lines of code) (raw):

# Licensed to Elasticsearch B.V. under one or more contributor # license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright # ownership. Elasticsearch B.V. licenses this file to you under # the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. from fnmatch import fnmatch async def deleteindex(es, params): """ Deletes all indices in Elasticsearch matching either the specified index pattern or the suffix of the index against a more complex pattern. :param es: Specifies the index pattern to delete. Defaults to 'elasticlogs-*' :type es: str :param params: Parameter hash containing one of the keys documented below. :type params: dict "index_pattern" - Mandatory. Specifies the index pattern to delete. "max_indices" - Optional. int specifying how many rolled over indices to retain at max. The elibigle indices need to satisfy `index-pattern`. 'suffix_separator' is used to retrieve the integer suffixes to calculate indices to delete. Example: For the indices: 'elasticlogs-000001', 'elasticlogs-000002', ... 000011 (index currently written to is 'elasticlogs-000011') using: suffix_separator='-' and max_indices=8 will result in deleting indices 'elasticlogs-000001' and 'elasticlogs-000002' "suffix_separator" - Defaults to '-'. Used only when 'max_indices' is specified. Specifies string separator used to extract the index suffix, e.g. '-'. """ def get_suffix(name, separator): if separator in name: name_parts = name.split(separator) if len(name_parts) > 1: try: return int(name_parts[-1]) except ValueError: # TODO: log that suffix is not integer return None return None index_pattern = params["index_pattern"] max_indices = params.get("max_indices", None) suffix_separator = params.get("suffix_separator", "-") if max_indices: indices = await es.cat.indices(h="index") if isinstance(indices, bytes): indices = indices.decode("utf-8") indices = indices.split("\n") indices_by_suffix = {get_suffix(idx, suffix_separator): idx for idx in indices if fnmatch(idx, index_pattern) and get_suffix(idx, suffix_separator) is not None } sorted_suffixes = sorted(list(indices_by_suffix.keys())) if len(sorted_suffixes) > max_indices: indices_to_delete = ",".join([indices_by_suffix[key] for key in sorted_suffixes[:(len(sorted_suffixes)-max_indices)]]) await es.indices.delete(indices_to_delete) else: await es.indices.delete(index=index_pattern) return 1, "ops"