def temporary_search_template(es, template_file, template_id_in_file, size=None, with_source=False): """A context manager that manages a temporary search template.""" def random_string(length=10): """Generate a simple random string to use as a temporary template ID""" return ''.join( random.choice(string.ascii_letters) for _ in range(length)) # check es argument if type(es) is str: es = Elasticsearch(es) elif type(es) is not Elasticsearch: raise ValueError( f"Requires an Elasticsearch client or connection string URL: {type(es)}" ) # load search template from file template = load_json(template_file) # load a single template if multiple are in the file if type(template) is list: assert template_id_in_file, "A template ID is required when multiple templates are present" template = next( (x for x in template if x["id"] == template_id_in_file), None) assert template, f"No template found for template ID: {template_id_in_file}" del template['id'] # set some optional parameters if size: template['template']['source']['size'] = size template['template']['source']['_source'] = with_source # generate a random, temporary template ID template_id = random_string() # cleanup to save as script template['script'] = template['template'] del template['template'] try: es.put_script(id=template_id, body=template) yield template_id finally: es.delete_script(template_id)
def remove_ml_scripts_pipelines(cls, es_client: Elasticsearch, ml_type: List[str]) -> dict: """Remove all ML script and pipeline files.""" results = dict(script={}, pipeline={}) ingest_client = IngestClient(es_client) files = cls.get_all_ml_files(es_client=es_client) for file_type, data in files.items(): for name in list(data): this_type = name.split('_')[1].lower() if this_type not in ml_type: continue if file_type == 'script': results[file_type][name] = es_client.delete_script(name) elif file_type == 'pipeline': results[file_type][name] = ingest_client.delete_pipeline( name) return results