Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.

Commit 84184ec

Browse files
committed
allow elastic index to be recreated from admin page (bug 713210)
1 parent c47e4d0 commit 84184ec

File tree

4 files changed

+62
-25
lines changed

4 files changed

+62
-25
lines changed

apps/amo/tests/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ def tearDownClass(cls):
373373
def refresh(cls, index='default'):
374374
cls.es.refresh(settings.ES_INDEXES[index], timesleep=0)
375375

376+
@classmethod
377+
def reindex(cls, model):
378+
# Emit post-save signal so all of the objects get reindexed.
379+
[o.save() for o in model.objects.all()]
380+
cls.refresh()
381+
376382
@classmethod
377383
def add_addons(cls):
378384
addon_factory(name='user-disabled', disabled_by_user=True)

apps/zadmin/templates/zadmin/elastic.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
{% block title %}Elastic Search {{ super() }}{% endblock %}
44

5+
{% block extrahead %}
6+
<style>form { margin-bottom: 1em }</style>
7+
{% endblock %}
8+
59
{% block content %}
610
<ul>
711
<li><a href="#mapping">Mappings</a></li>
@@ -12,8 +16,7 @@
1216
<h3 id="mapping">Mappings</h3>
1317
<form method="post" action="">
1418
{{ csrf() }}
15-
<input name="reset" placeholder="mapping name">
16-
<button>Reset</button>
19+
<button name="recreate" value="1">Recreate {{ index }} index</button>
1720
</form>
1821
<form method="post" action="">
1922
{{ csrf() }}

apps/zadmin/tests/test_views.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,16 +1672,16 @@ def test_non_default_version(self):
16721672
app=self.app, app_version=app_version)
16731673

16741674
def test_minor_versions(self):
1675-
addon = self.populate()
1676-
self.generate_reports(addon, good=0, bad=1, app=self.app,
1677-
app_version=self.app_version)
1678-
self.generate_reports(addon, good=1, bad=2, app=self.app,
1679-
app_version=self.app_version + 'a2')
1675+
addon = self.populate()
1676+
self.generate_reports(addon, good=0, bad=1, app=self.app,
1677+
app_version=self.app_version)
1678+
self.generate_reports(addon, good=1, bad=2, app=self.app,
1679+
app_version=self.app_version + 'a2')
16801680

1681-
tr = self.get_pq(ratio=0.0, minimum=0).find('tr[data-guid="%s"]' %
1682-
addon.guid)
1683-
self.check_row(tr, addon, good=1, bad=3, percentage='75.0',
1684-
app=self.app, app_version=self.app_version)
1681+
tr = self.get_pq(ratio=0.0, minimum=0).find('tr[data-guid="%s"]' %
1682+
addon.guid)
1683+
self.check_row(tr, addon, good=1, bad=3, percentage='75.0',
1684+
app=self.app, app_version=self.app_version)
16851685

16861686
def test_ratio(self):
16871687
addon = self.populate()
@@ -1737,6 +1737,34 @@ def test_cant_clear(self):
17371737
eq_(cache.get('foo'), 'bar')
17381738

17391739

1740+
class TestElastic(amo.tests.ESTestCase):
1741+
fixtures = ['base/addon_3615', 'base/users']
1742+
1743+
def setUp(self):
1744+
self.url = reverse('zadmin.elastic')
1745+
self.client.login(username='admin@mozilla.com', password='password')
1746+
1747+
def test_login(self):
1748+
self.client.logout()
1749+
self.assertRedirects(self.client.get(self.url),
1750+
reverse('users.login') + '?to=/en-US/admin/elastic')
1751+
1752+
@mock.patch('zadmin.views.elasticutils')
1753+
@mock.patch('zadmin.views.addons.search')
1754+
def test_recreate_index(self, search, es):
1755+
self.client.post(self.url, {'recreate': 1})
1756+
index = settings.ES_INDEXES['default']
1757+
index in es.get_es().delete_index_if_exists.call_args_list[0][0]
1758+
assert search.setup_mapping.called
1759+
index in es.get_es().create_index_if_missing.call_args_list[0][0]
1760+
1761+
def test_reindex_addons(self):
1762+
eq_(list(Addon.search()), [])
1763+
self.client.post(self.url, {'reindex': 'addons'})
1764+
self.refresh()
1765+
eq_(list(Addon.search()), list(Addon.objects.all()))
1766+
1767+
17401768
class TestEmailDevs(amo.tests.TestCase):
17411769
fixtures = ['base/addon_3615', 'base/users']
17421770

apps/zadmin/views.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -531,30 +531,30 @@ def monthly_pick(request):
531531
def elastic(request):
532532
INDEX = site_settings.ES_INDEXES['default']
533533
es = elasticutils.get_es()
534-
mappings = {'addons': (addons.search.setup_mapping,
535-
addons.cron.reindex_addons),
536-
'collections': (addons.search.setup_mapping,
537-
bandwagon.cron.reindex_collections),
538-
'compat': (addons.search.setup_mapping, None),
539-
'users': (addons.search.setup_mapping,
540-
users.cron.reindex_users),
534+
mappings = {'addons': addons.cron.reindex_addons,
535+
'collections': bandwagon.cron.reindex_collections,
536+
'compat': None,
537+
'users': users.cron.reindex_users,
541538
}
542539
if request.method == 'POST':
543-
if request.POST.get('reset') in mappings:
544-
name = request.POST['reset']
545-
es.delete_mapping(INDEX, name)
546-
if mappings[name][0]:
547-
mappings[name][0]()
548-
messages.info(request, 'Resetting %s.' % name)
540+
if request.POST.get('recreate'):
541+
es.delete_index_if_exists(INDEX)
542+
# We must set up the mappings before we create the index again.
543+
addons.search.setup_mapping()
544+
es.create_index_if_missing(INDEX)
545+
messages.info(request, 'Deleting %s index.' % INDEX)
549546
if request.POST.get('reindex') in mappings:
550547
name = request.POST['reindex']
551-
mappings[name][1]()
548+
# Reindex.
549+
if mappings.get(name):
550+
mappings[name]()
552551
messages.info(request, 'Reindexing %s.' % name)
553552
return redirect('zadmin.elastic')
554553

555554
indexes = set(site_settings.ES_INDEXES.values())
556555
mappings = es.get_mapping(None, indexes)
557556
ctx = {
557+
'index': INDEX,
558558
'nodes': es.cluster_nodes(),
559559
'health': es.cluster_health(),
560560
'state': es.cluster_state(),

0 commit comments

Comments
 (0)