aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2020-07-28 16:50:24 -0700
committerBryan Newbold <bnewbold@robocracy.org>2020-07-28 16:50:24 -0700
commit76cec8852f6e431b1c87f7d25f8bd4404f1c67e1 (patch)
tree71138532359586d340ec7784c7543f826bac4abf
parent1301f6ba6c6ea31bdbcd3619d7f235912726f30a (diff)
downloadfatcat-76cec8852f6e431b1c87f7d25f8bd4404f1c67e1.tar.gz
fatcat-76cec8852f6e431b1c87f7d25f8bd4404f1c67e1.zip
search: catch ES errors and display better
-rw-r--r--python/fatcat_web/routes.py12
-rw-r--r--python/fatcat_web/search.py22
-rw-r--r--python/fatcat_web/templates/container_search.html2
-rw-r--r--python/fatcat_web/templates/release_search.html2
-rw-r--r--python/fatcat_web/templates/search_macros.html28
5 files changed, 46 insertions, 20 deletions
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 4a66b3c2..77b5dc55 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -14,7 +14,7 @@ from fatcat_tools.normal import *
from fatcat_web import app, api, auth_api, priv_api, mwoauth, Config
from fatcat_web.auth import handle_token_login, handle_logout, load_user, handle_ia_xauth, handle_wmoauth
from fatcat_web.cors import crossdomain
-from fatcat_web.search import ReleaseQuery, GenericQuery, do_release_search, do_container_search, get_elastic_entity_stats, get_elastic_container_stats, get_elastic_container_histogram
+from fatcat_web.search import ReleaseQuery, GenericQuery, do_release_search, do_container_search, get_elastic_entity_stats, get_elastic_container_stats, get_elastic_container_histogram, FatcatSearchError
from fatcat_web.entity_helpers import *
from fatcat_web.graphics import *
from fatcat_web.kafka import *
@@ -710,7 +710,10 @@ def release_search():
return render_template('release_search.html', query=ReleaseQuery(), found=None)
query = ReleaseQuery.from_args(request.args)
- found = do_release_search(query)
+ try:
+ found = do_release_search(query)
+ except FatcatSearchError as fse:
+ return render_template('release_search.html', query=query, es_error=fse), fse.status_code
return render_template('release_search.html', query=query, found=found)
@app.route('/container/search', methods=['GET', 'POST'])
@@ -720,7 +723,10 @@ def container_search():
return render_template('container_search.html', query=GenericQuery(), found=None)
query = GenericQuery.from_args(request.args)
- found = do_container_search(query)
+ try:
+ found = do_container_search(query)
+ except FatcatSearchError as fse:
+ return render_template('container_search.html', query=query, es_error=fse), fse.status_code
return render_template('container_search.html', query=query, found=found)
def get_changelog_stats():
diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py
index fe0610e5..3fd7f9dc 100644
--- a/python/fatcat_web/search.py
+++ b/python/fatcat_web/search.py
@@ -15,6 +15,15 @@ import elasticsearch_dsl.response
from fatcat_web import app
+class FatcatSearchError(Exception):
+
+ def __init__(self, status_code: int, name: str, description: str = None):
+ if status_code == "N/A":
+ status_code = 503
+ self.status_code = status_code
+ self.name = name
+ self.description = description
+
@dataclass
class ReleaseQuery:
q: Optional[str] = None
@@ -109,14 +118,19 @@ def wrap_es_execution(search: Search) -> Any:
except elasticsearch.exceptions.RequestError as e:
# this is a "user" error
print("elasticsearch 400: " + str(e.info), file=sys.stderr)
+ description = None
if e.info.get("error", {}).get("root_cause", {}):
- raise ValueError(str(e.info["error"]["root_cause"][0].get("reason")))
- else:
- raise ValueError(str(e.info))
+ description = str(e.info["error"]["root_cause"][0].get("reason"))
+ raise FatcatSearchError(e.status_code, str(e.error), description)
+ except elasticsearch.exceptions.ConnectionError as e:
+ raise FatcatSearchError(e.status_code, "ConnectionError: search engine not available")
except elasticsearch.exceptions.TransportError as e:
# all other errors
print("elasticsearch non-200 status code: {}".format(e.info), file=sys.stderr)
- raise IOError(str(e.info))
+ description = None
+ if e.info.get("error", {}).get("root_cause", {}):
+ description = str(e.info["error"]["root_cause"][0].get("reason"))
+ raise FatcatSearchError(e.status_code, str(e.error), description)
return resp
def do_container_search(
diff --git a/python/fatcat_web/templates/container_search.html b/python/fatcat_web/templates/container_search.html
index ce868991..bd92dc2b 100644
--- a/python/fatcat_web/templates/container_search.html
+++ b/python/fatcat_web/templates/container_search.html
@@ -80,6 +80,8 @@
{% endif %}
+{% elif es_error %}
+ {{ search_macros.es_error_msg(es_error) }}
{% endif %}
</div>
diff --git a/python/fatcat_web/templates/release_search.html b/python/fatcat_web/templates/release_search.html
index e004efc1..7fb475e3 100644
--- a/python/fatcat_web/templates/release_search.html
+++ b/python/fatcat_web/templates/release_search.html
@@ -74,6 +74,8 @@
{% endif %}
+{% elif es_error %}
+ {{ search_macros.es_error_msg(es_error) }}
{% endif %}
</div>
diff --git a/python/fatcat_web/templates/search_macros.html b/python/fatcat_web/templates/search_macros.html
index 383c271c..a207bfbc 100644
--- a/python/fatcat_web/templates/search_macros.html
+++ b/python/fatcat_web/templates/search_macros.html
@@ -44,23 +44,25 @@ found.count_returned }} out of {{ found.count_found }} results</i>&nbsp;&nbsp;
{% macro es_error_msg(es_error) %}
<div class="ui icon error message">
<i class="ban icon"></i>
- {% if es_error.status_code == 400 %}
- <div class="content">
- <div class="header">
+ <div class="content">
+ <div class="header">
+ {% if es_error.status_code == 400 %}
Query Error
- </div>
+ {% else %}
+ Search Index Error
+ {% if es_error.status_code %}({{ es_error.status_code }}){% endif %}
+ {% endif %}
+ </div>
+ {% if es_error.description %}
<p>Computer said: <code>{{ es_error.description }}</code>
+ {% elif es_error.name %}
+ <p><b>{{ es_error.name }}</b>
+ {% endif %}
+ {% if es_error.status_code == 400 %}
<p>Query parsing is currently very naive. Sometimes you can fix this
problem by adding quotes around terms or entire phrases.
- </div>
- {% else %}
- <div class="content">
- <div class="header">
- Search Index Error ({{ es_error.status_code }})
- </div>
- <p>Computer said: <code>{{ es_error.description }}</code>
- </div>
- {% endif %}
+ {% endif %}
+ </div>
</div>
{% endmacro %}