Source code for pytest_dbfixtures.factories.elasticsearch
# Copyright (C) 2013-2014 by Clearcode <http://clearcode.cc>
# and associates (see AUTHORS).
# This file is part of pytest-dbfixtures.
# pytest-dbfixtures is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# pytest-dbfixtures is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public License
# along with pytest-dbfixtures. If not, see <http://www.gnu.org/licenses/>.
import shutil
import pytest
from path import path
from pytest_dbfixtures.executors import HTTPExecutor
from pytest_dbfixtures.utils import get_config, try_import, get_process_fixture
from pytest_dbfixtures.port import get_port
[docs]def elasticsearch_proc(host='127.0.0.1', port=9201, cluster_name=None,
network_publish_host='127.0.0.1',
discovery_zen_ping_multicast_enabled=False,
index_store_type='memory', logs_prefix=''):
"""
Creates elasticsearch process fixture.
.. warning::
This fixture requires at least version 1.0 of elasticsearch to work.
:param str host: host that the instance listens on
:param int|str port: exact port that the instance listens on (e.g. 8000),
or randomly selected port:
'?' - any random available port
'2000-3000' - random available port from a given range
'4002,4003' - random of 4002 or 4003 ports
:param str cluster_name: name of a cluser this node should work on.
Used for autodiscovery. By default each node is in it's own cluser.
:param str network_publish_host: host to publish itself within cluser
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-network.html
:param bool discovery_zen_ping_multicast_enabled: whether to enable or
disable host discovery
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html
:param str index_store_type: index.store.type setting. *memory* by default
to speed up tests
:param str logs_prefix: prefix for log filename
"""
@pytest.fixture(scope='session')
def elasticsearch_proc_fixture(request):
"""
Elasticsearch process starting fixture.
"""
config = get_config(request)
elasticsearch_port = get_port(port)
pidfile = '/tmp/elasticsearch.{0}.pid'.format(elasticsearch_port)
home_path = '/tmp/elasticsearch_{0}'.format(elasticsearch_port)
logsdir = path(request.config.getvalue('logsdir'))
logs_path = logsdir / '{prefix}elasticsearch_{port}_logs'.format(
prefix=logs_prefix,
port=elasticsearch_port
)
work_path = '/tmp/elasticsearch_{0}_tmp'.format(elasticsearch_port)
cluster = cluster_name or 'dbfixtures.{0}'.format(elasticsearch_port)
multicast_enabled = str(discovery_zen_ping_multicast_enabled).lower()
command_exec = '''
{deamon} -p {pidfile} --http.port={port}
--path.home={home_path} --default.path.logs={logs_path}
--default.path.work={work_path}
--default.path.conf=/etc/elasticsearch
--cluster.name={cluster}
--network.publish_host='{network_publish_host}'
--discovery.zen.ping.multicast.enabled={multicast_enabled}
--index.store.type={index_store_type}
'''.format(
deamon=config.elasticsearch.deamon,
pidfile=pidfile,
port=elasticsearch_port,
home_path=home_path,
logs_path=logs_path,
work_path=work_path,
cluster=cluster,
network_publish_host=network_publish_host,
multicast_enabled=multicast_enabled,
index_store_type=index_store_type
)
elasticsearch_executor = HTTPExecutor(
command_exec, 'http://{host}:{port}'.format(
host=host,
port=elasticsearch_port
),
)
elasticsearch_executor.start()
def finalize_elasticsearch():
elasticsearch_executor.stop()
shutil.rmtree(home_path)
request.addfinalizer(finalize_elasticsearch)
return elasticsearch_executor
return elasticsearch_proc_fixture
[docs]def elasticsearch(process_fixture_name):
"""
Creates Elasticsearch client fixture.
:param str process_fixture_name: elasticsearch process fixture name
"""
@pytest.fixture
def elasticsearch_fixture(request):
"""Elasticsearch client fixture."""
proc_fixture = get_process_fixture(request, process_fixture_name)
hosts = '%s:%s' % (proc_fixture.host, proc_fixture.port)
elasticsearch, _ = try_import('elasticsearch', request)
client = elasticsearch.Elasticsearch(hosts=hosts)
def drop_indexes():
client.indices.delete(index='*')
request.addfinalizer(drop_indexes)
return client
return elasticsearch_fixture