Skip to content

Commit

Permalink
Add suport for newest elasticsearch version (#89)
Browse files Browse the repository at this point in the history
Add suport for all major elasticsearch versions
  • Loading branch information
dlcron committed Apr 4, 2018
1 parent 6778f23 commit b7a2017
Show file tree
Hide file tree
Showing 8 changed files with 221 additions and 30 deletions.
11 changes: 11 additions & 0 deletions .travis.install-elasticsearch.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
function install_from_zip {
wget $1 -O out
unzip out
sudo mv $2 /opt/$2
}

install_from_zip https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.5.2.zip elasticsearch-1.5.2
install_from_zip https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-2.4.6.zip elasticsearch-2.4.6
install_from_zip https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.7.zip elasticsearch-5.6.7
install_from_zip https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.zip elasticsearch-6.2.3
5 changes: 4 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
sudo: true
language: python
python:
- '2.7'
Expand All @@ -15,10 +16,12 @@ branches:
except:
- requires-io-master
install:
- pip install "setuptools>=18.0.0,<30.0.0" # pypy support
- pip install "setuptools>=18.5.0" # pypy support
- "pip install -r requirements-test.txt"
- python setup.py $INSTALL
- pip install pytest_elasticsearch[tests] coveralls wheel
before_script:
- bash .travis.install-elasticsearch.sh
script:
- py.test -n $XDIST --cov src/pytest_elasticsearch
- pylama
Expand Down
1 change: 1 addition & 0 deletions AUTHORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ of pytest-elasticsearch along its history.
* Paweł Wilczyński
* Tomasz Karbownicki
* Karolina Blümke
* Marcin Maślany
6 changes: 6 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
CHANGELOG
=========

Unreleased
-------

- [feature] - Support for major elasticsearch versions


1.2.1
-------

Expand Down
4 changes: 4 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ You can pick which you prefer, but remember that these settings are handled in t
+----------------------+--------------------------------------+------------------------------------------------------+----------------------------------------------------+------------------------------+
| enable zen discovery | discovery_zen_ping_multicast_enabled | --elasticsearch-discovery-zen-ping-multicast-enabled | elasticsearch_discovery_zen_ping_multicast_enabled | False |
+----------------------+--------------------------------------+------------------------------------------------------+----------------------------------------------------+------------------------------+
| transport tcp port | transport_tcp_port | --elasticsearch-transport-tcp-port | elasticsearch_transport_tcp_port | random |
+----------------------+--------------------------------------+------------------------------------------------------+----------------------------------------------------+------------------------------+
| configuration path | configuration_path | --elasticsearch-configuration-path | elasticsearch_configuration_path | /etc/elasticsearch |
+----------------------+--------------------------------------+------------------------------------------------------+----------------------------------------------------+------------------------------+

Example usage:

Expand Down
109 changes: 92 additions & 17 deletions src/pytest_elasticsearch/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
# You should have received a copy of the GNU Lesser General Public License
# along with pytest-elasticsearch. If not, see <http://www.gnu.org/licenses/>.
"""Fixture factories."""
import re
import os.path
import shutil
from tempfile import gettempdir
import subprocess

import pytest

Expand All @@ -31,9 +33,9 @@ def return_config(request):
"""Return a dictionary with config options."""
config = {}
options = [
'port', 'host', 'cluster_name', 'network_publish_host',
'discovery_zen_ping_multicast_enabled', 'index_store_type',
'logs_prefix', 'logsdir'
'port', 'transport_tcp_port', 'host', 'cluster_name',
'network_publish_host', 'discovery_zen_ping_multicast_enabled',
'index_store_type', 'logs_prefix', 'logsdir', 'configuration_path'
]
for option in options:
option_name = 'elasticsearch_' + option
Expand All @@ -43,12 +45,30 @@ def return_config(request):
return config


def get_version_parts(executable):
"""Get the given elasticsearch executable version parts."""
try:
output = subprocess.check_output([executable, '-Vv']).decode('utf-8')
match = re.match(
'Version: (?P<major>\d)\.(?P<minor>\d)\.(?P<patch>\d)', output
)
if not match:
raise RuntimeError("Elasticsearch version is not recognized. "
"It is probably not supported.")
return match.groupdict()
except OSError:
raise RuntimeError(
"'%s' does not point to elasticsearch." % executable
)


def elasticsearch_proc(executable='/usr/share/elasticsearch/bin/elasticsearch',
host=None, port=-1, cluster_name=None,
network_publish_host=None,
host=None, port=-1, transport_tcp_port=None,
cluster_name=None, network_publish_host=None,
discovery_zen_ping_multicast_enabled=None,
index_store_type=None, logs_prefix=None,
elasticsearch_logsdir=None):
elasticsearch_logsdir=None,
configuration_path='/etc/elasticsearch'):
"""
Create elasticsearch process fixture.
Expand Down Expand Up @@ -77,15 +97,68 @@ def elasticsearch_proc(executable='/usr/share/elasticsearch/bin/elasticsearch',
:param str elasticsearch_logsdir: path for logs.
:param elasticsearch_logsdir: path for elasticsearch logs
"""
def command_from(version):
"""
Get command to run elasticsearch binary based on the version.
:param tuple version elasticsearch version
"""
if version < ('2', '0', '0'):
return '''
{deamon} -p {pidfile}
--http.port={port}
--path.home={home_path}
--transport.tcp.port={transport_tcp_port}
--default.path.logs={logs_path}
--default.path.work={work_path}
--default.path.data={work_path}
--default.path.conf={conf_path}
--cluster.name={cluster}
--network.publish_host='{network_publish_host}'
--index.store.type={index_store_type}
--discovery.zen.ping.multicast.enabled={multicast_enabled}
'''
elif version < ('3', '0', '0'):
return '''
{deamon} -p {pidfile}
--http.port={port}
--path.home={home_path}
--transport.tcp.port={transport_tcp_port}
--default.path.logs={logs_path}
--default.path.work={work_path}
--default.path.data={work_path}
--default.path.conf={conf_path}
--cluster.name={cluster}
--network.publish_host='{network_publish_host}'
--index.store.type={index_store_type}
'''
# it is known to work for 5.x.x; 6.x.x;
elif version <= ('7', '0', '0'):
return '''
{deamon} -p {pidfile}
-E http.port={port}
-E transport.tcp.port={transport_tcp_port}
-E path.logs={logs_path}
-E path.data={work_path}
-E cluster.name={cluster}
-E network.host='{network_publish_host}'
-E index.store.type={index_store_type}
'''
else:
raise RuntimeError("This elasticsearch version is not supported.")

@pytest.fixture(scope='session')
def elasticsearch_proc_fixture(request):
"""Elasticsearch process starting fixture."""
tmpdir = gettempdir()
config = return_config(request)
version_parts = get_version_parts(executable)

elasticsearch_host = host or config['host']

elasticsearch_port = get_port(port) or get_port(config['port'])
elasticsearch_transport_port = get_port(transport_tcp_port) or \
get_port(config['transport_tcp_port'])

elasticsearch_cluster_name = \
cluster_name or config['cluster_name'] or \
Expand All @@ -108,26 +181,27 @@ def elasticsearch_proc_fixture(request):
home_path = os.path.join(
tmpdir, 'elasticsearch_{0}'.format(elasticsearch_port))
work_path = '{0}_tmp'.format(home_path)
conf_path = configuration_path or config['configuration_path']

if discovery_zen_ping_multicast_enabled is not None:
multicast_enabled = str(
discovery_zen_ping_multicast_enabled).lower()
else:
multicast_enabled = config['discovery_zen_ping_multicast_enabled']

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(
command = command_from(
version=(
version_parts['major'],
version_parts['minor'],
version_parts['patch']
))

command_exec = command.format(
deamon=executable,
pidfile=pidfile,
port=elasticsearch_port,
transport_tcp_port=elasticsearch_transport_port,
conf_path=conf_path,
home_path=home_path,
logs_path=logs_path,
work_path=work_path,
Expand All @@ -149,7 +223,8 @@ def elasticsearch_proc_fixture(request):

def finalize_elasticsearch():
elasticsearch_executor.stop()
shutil.rmtree(home_path)
shutil.rmtree(work_path)
shutil.rmtree(logs_path)

request.addfinalizer(finalize_elasticsearch)
return elasticsearch_executor
Expand Down
27 changes: 27 additions & 0 deletions src/pytest_elasticsearch/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
'network host to which elasticsearch publish to connect to cluseter'
_help_logs_prefix = 'prefix for the logs file'
_help_discovery_zen_ping_multicast_enabled = 'Use zen discovery'
_help_elasticsearch_transport_tcp_port = 'The tcp ansport port used \
for internal communication between nodes within the cluster'
_help_configuration_path = 'Config file location'


def pytest_addoption(parser):
Expand Down Expand Up @@ -84,6 +87,18 @@ def pytest_addoption(parser):
default=None,
)

parser.addini(
'elasticsearch_transport_tcp_port',
help=_help_elasticsearch_transport_tcp_port,
default=None
)

parser.addini(
'elasticsearch_configuration_path',
help=_help_configuration_path,
default=None
)

parser.addoption(
'--elasticsearch-logsdir',
action='store',
Expand Down Expand Up @@ -137,6 +152,18 @@ def pytest_addoption(parser):
help=_help_port
)

parser.addoption(
'--elasticsearch-transport-tcp-port',
action='store',
dest='elasticsearch_transport_tcp_port',
)

parser.addoption(
'--elasticsearch-configuration-path',
action='store',
dest='elasticsearch_configuration_path'
)


elasticsearch_proc = factories.elasticsearch_proc()
elasticsearch = factories.elasticsearch('elasticsearch_proc')
Loading

0 comments on commit b7a2017

Please sign in to comment.