示例#1
0
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)
示例#2
0
    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