Skip to content

Commit

Permalink
Delete indices when buckets and collections are deleted (fixes #21)
Browse files Browse the repository at this point in the history
  • Loading branch information
leplatrem committed May 24, 2017
1 parent 500f9b1 commit 0c02063
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Changelog
- Perform insertions and deletion in bulk for better efficiency (fixes #5)
- Add setting to force index refresh on change (fixes #6)
- Add heartbeat (fixes #3)
- Delete indices when buckets and collections are deleted (fixes #21)

**Bug fixes**

Expand Down
4 changes: 4 additions & 0 deletions kinto_elasticsearch/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ def includeme(config):
config.add_subscriber(listener.on_server_flushed, ServerFlushed)
config.add_subscriber(listener.on_collection_created, AfterResourceChanged,
for_resources=("collection",), for_actions=("create",))
config.add_subscriber(listener.on_collection_deleted, AfterResourceChanged,
for_resources=("collection",), for_actions=("delete",))
config.add_subscriber(listener.on_bucket_deleted, AfterResourceChanged,
for_resources=("bucket",), for_actions=("delete",))

config.add_api_capability("elasticsearch",
description="Index and search records using ElasticSearch.",
Expand Down
7 changes: 7 additions & 0 deletions kinto_elasticsearch/indexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ def create_index(self, bucket_id, collection_id):
if not self.client.indices.exists(index=indexname):
self.client.indices.create(index=indexname)

def delete_index(self, bucket_id, collection_id=None):
if collection_id is None:
collection_id = "*"
indexname = self.indexname(bucket_id, collection_id)
if self.client.indices.exists(index=indexname):
self.client.indices.delete(index=indexname)

def search(self, bucket_id, collection_id, query, **kwargs):
indexname = self.indexname(bucket_id, collection_id)
return self.client.search(index=indexname,
Expand Down
15 changes: 15 additions & 0 deletions kinto_elasticsearch/listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,21 @@ def on_collection_created(event):
indexer.create_index(bucket_id, collection_id)


def on_collection_deleted(event):
indexer = event.request.registry.indexer
bucket_id = event.payload["bucket_id"]
for deleted in event.impacted_records:
collection_id = deleted["old"]["id"]
indexer.delete_index(bucket_id, collection_id)


def on_bucket_deleted(event):
indexer = event.request.registry.indexer
for deleted in event.impacted_records:
bucket_id = deleted["old"]["id"]
indexer.delete_index(bucket_id)


def on_record_changed(event):
indexer = event.request.registry.indexer

Expand Down
23 changes: 23 additions & 0 deletions tests/test_elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,29 @@ def test_response_is_served_if_indexer_fails(self):
assert r.status_code == 201


class ParentDeletion(BaseWebTest, unittest.TestCase):

def setUp(self):
self.app.put("/buckets/bid", headers=self.headers)
self.app.put("/buckets/bid/collections/cid", headers=self.headers)
resp = self.app.post_json("/buckets/bid/collections/cid/records",
{"data": {"hello": "world"}},
headers=self.headers)

def index_exists(self, bucket_id, collection_id):
indexer = self.app.app.registry.indexer
indexname = indexer.indexname(bucket_id, collection_id)
return indexer.client.indices.exists(indexname)

def test_index_is_deleted_when_collection_is_deleted(self):
self.app.delete("/buckets/bid/collections/cid", headers=self.headers)
assert not self.index_exists("bid", "cid")

def test_index_is_deleted_when_bucket_is_deleted(self):
self.app.delete("/buckets/bid", headers=self.headers)
assert not self.index_exists("bid", "cid")


class SearchView(BaseWebTest, unittest.TestCase):
def test_search_response_is_empty_if_indexer_fails(self):
self.app.put("/buckets/bid", headers=self.headers)
Expand Down

0 comments on commit 0c02063

Please sign in to comment.