Commit ade47343 by Bill DeRusha

Merge pull request #9661 from edx/bderusha/teams-search-index

Add more defensive code around elasticsearch connection
parents 9badf24a 62ef4b5b
......@@ -10,6 +10,7 @@ import ddt
from flaky import flaky
from nose.plugins.attrib import attr
from uuid import uuid4
from unittest import skip
from ..helpers import UniqueCourseTest, EventsTestMixin
from ...fixtures import LMS_BASE_URL
......@@ -705,6 +706,7 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
self.browse_teams_page.click_browse_all_teams_link()
self.assertTrue(self.topics_page.is_browser_on_page())
@skip('Disabled until search connectivity issues are resolved, see TNL-3206')
def test_search(self):
"""
Scenario: User should be able to search for a team
......
......@@ -16,6 +16,11 @@ class AlreadyOnTeamInCourse(TeamAPIRequestError):
pass
class ElasticSearchConnectionError(TeamAPIRequestError):
"""System was unable to connect to the configured elasticsearch instance"""
pass
class ImmutableMembershipFieldException(Exception):
"""An attempt was made to change an immutable field on a CourseTeamMembership model"""
pass
""" Search index used to load data into elasticsearch"""
import logging
from requests import ConnectionError
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from search.search_engine_base import SearchEngine
from .errors import ElasticSearchConnectionError
from .serializers import CourseTeamSerializer, CourseTeam
......@@ -78,7 +82,11 @@ class CourseTeamIndexer(object):
Return course team search engine (if feature is enabled).
"""
if cls.search_is_enabled():
return SearchEngine.get_search_engine(index=cls.INDEX_NAME)
try:
return SearchEngine.get_search_engine(index=cls.INDEX_NAME)
except ConnectionError as err:
logging.error("Error connecting to elasticsearch: %s", err)
raise ElasticSearchConnectionError
@classmethod
def search_is_enabled(cls):
......@@ -93,4 +101,7 @@ def course_team_post_save_callback(**kwargs):
"""
Reindex object after save.
"""
CourseTeamIndexer.index(kwargs['instance'])
try:
CourseTeamIndexer.index(kwargs['instance'])
except ElasticSearchConnectionError:
pass
......@@ -134,7 +134,7 @@ define([
));
};
it('can search teams', function () {
xit('can search teams', function () {
var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
......@@ -154,7 +154,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Showing results for "foo"');
});
it('can clear a search', function () {
xit('can clear a search', function () {
var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
......@@ -177,7 +177,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Test description 1');
});
it('clears the search when navigating away and then back', function () {
xit('clears the search when navigating away and then back', function () {
var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
......@@ -199,7 +199,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Test description 1');
});
it('does not switch to showing results when the search returns an error', function () {
xit('does not switch to showing results when the search returns an error', function () {
var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
......
......@@ -66,7 +66,7 @@ define([
expect(Backbone.history.navigate.calls[0].args).toContain('browse');
});
it('gives the search field focus when clicking on the search teams link', function () {
xit('gives the search field focus when clicking on the search teams link', function () {
var emptyMembership = TeamSpecHelpers.createMockTeamMemberships([]),
teamsView = createTopicTeamsView({ teamMemberships: emptyMembership });
spyOn($.fn, 'focus').andCallThrough();
......
......@@ -303,7 +303,7 @@
viewWithHeader = this.createViewWithHeader({
subject: topic,
mainView: teamsView,
headerActionsView: searchFieldView,
headerActionsView: null, // TODO: add back SearchFieldView when search is enabled
title: options.title,
description: options.description,
breadcrumbs: options.breadcrumbs
......
......@@ -57,13 +57,16 @@
},
searchTeams: function (event) {
var searchField = $('.page-header-search .search-field');
//var searchField = $('.page-header-search .search-field');
event.preventDefault();
searchField.focus();
searchField.select();
$('html, body').animate({
scrollTop: 0
}, 500);
//searchField.focus();
//searchField.select();
//$('html, body').animate({
// scrollTop: 0
//}, 500);
// TODO! Will navigate to correct place once required functionality is available
Backbone.history.navigate('browse', {trigger: true});
},
showCreateTeamForm: function (event) {
......
......@@ -52,7 +52,7 @@ from .serializers import (
add_team_count
)
from .search_indexes import CourseTeamIndexer
from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam
from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam, ElasticSearchConnectionError
TEAM_MEMBERSHIPS_PER_PAGE = 2
TOPICS_PER_PAGE = 12
......@@ -330,7 +330,13 @@ class TeamsListView(ExpandableFieldViewMixin, GenericAPIView):
result_filter.update({'topic_id': request.QUERY_PARAMS['topic_id']})
if text_search and CourseTeamIndexer.search_is_enabled():
search_engine = CourseTeamIndexer.engine()
try:
search_engine = CourseTeamIndexer.engine()
except ElasticSearchConnectionError:
return Response(
build_api_error(ugettext_noop('Error connecting to elasticsearch')),
status=status.HTTP_400_BAD_REQUEST
)
result_filter.update({'course_id': course_id_string})
search_results = search_engine.search(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment