Skip to content

Commit

Permalink
Merge pull request #12 from Kinto/4-flush-index
Browse files Browse the repository at this point in the history
Flush indices when server is flushed (fixes #4)
  • Loading branch information
leplatrem committed May 22, 2017
2 parents bc39b54 + 3bac8ad commit eb8d456
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 6 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ Changelog
0.1.0 (unreleased)
------------------

- Nothing changed yet.
**New features**

- Flush indices when server is flushed (fixes #4)


0.0.1 (2017-05-22)
Expand Down
2 changes: 2 additions & 0 deletions kinto_elasticsearch/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import pkg_resources

from kinto.core import load_default_settings
from kinto.events import ServerFlushed
from kinto.core.events import ResourceChanged

from . import indexer
Expand Down Expand Up @@ -28,6 +29,7 @@ def includeme(config):

config.add_subscriber(listener.on_record_changed, ResourceChanged,
for_resources=("record",))
config.add_subscriber(listener.on_server_flushed, ServerFlushed)

config.add_api_capability("elasticsearch",
description="Index and search records using ElasticSearch.",
Expand Down
12 changes: 8 additions & 4 deletions kinto_elasticsearch/indexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@


class Indexer(object):
def __init__(self, hosts):
def __init__(self, hosts, prefix="kinto"):
self.client = elasticsearch.Elasticsearch(hosts)
self.prefix = prefix

def search(self, bucket_id, collection_id, query, **kwargs):
indexname = '%s-%s' % (bucket_id, collection_id)
indexname = "{}-{}-{}".format(self.prefix, bucket_id, collection_id)
return self.client.search(index=indexname,
doc_type=indexname,
body=query,
**kwargs)

def index_record(self, bucket_id, collection_id, record, id_field):
indexname = '%s-%s' % (bucket_id, collection_id)
indexname = "{}-{}-{}".format(self.prefix, bucket_id, collection_id)
record_id = record[id_field]

if not self.client.indices.exists(index=indexname):
Expand All @@ -34,14 +35,17 @@ def index_record(self, bucket_id, collection_id, record, id_field):
return index

def unindex_record(self, bucket_id, collection_id, record, id_field):
indexname = '%s-%s' % (bucket_id, collection_id)
indexname = "{}-{}-{}".format(self.prefix, bucket_id, collection_id)
record_id = record[id_field]
result = self.client.delete(index=indexname,
doc_type=indexname,
id=record_id,
refresh=True)
return result

def flush(self):
self.client.indices.delete(index="{}-*".format(self.prefix))


def load_from_config(config):
settings = config.get_settings()
Expand Down
5 changes: 5 additions & 0 deletions kinto_elasticsearch/listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,8 @@ def on_record_changed(event):
id_field="id")
except elasticsearch.ElasticsearchException:
logger.exception("Failed to index record")


def on_server_flushed(event):
indexer = event.request.registry.indexer
indexer.flush()
3 changes: 3 additions & 0 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ def __init__(self, *args, **kwargs):
super(BaseWebTest, self).__init__(*args, **kwargs)
self.headers.update(get_user_headers('mat'))

def tearDown(self):
self.app.app.registry.indexer.flush()

@classmethod
def get_app_settings(cls, extras=None):
ini_path = os.path.join(here, cls.config)
Expand Down
1 change: 1 addition & 0 deletions tests/config.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ use = egg:kinto
kinto.userid_hmac_secret = some-secret-string

kinto.includes = kinto_elasticsearch
kinto.plugins.flush
7 changes: 6 additions & 1 deletion tests/test_elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@ def test_elasticsearch_capability_exposed(self):
"description": "Index and search records using ElasticSearch.",
"url": "https://github.com/Kinto/kinto-elasticsearch"
}
self.assertEqual(expected, capabilities['elasticsearch'])
assert expected == capabilities['elasticsearch']

def test_indexer_flush(self):
with mock.patch("kinto_elasticsearch.indexer.Indexer.flush") as flush:
self.app.post("/__flush__", status=202)
assert flush.called


class RecordIndexing(BaseWebTest, unittest.TestCase):
Expand Down

0 comments on commit eb8d456

Please sign in to comment.