code cleanup in the views exception handling

This commit is contained in:
Cameron Dawson 2013-08-22 16:50:23 -07:00
Родитель 9543d8d78a
Коммит 12dbe79fc0
4 изменённых файлов: 82 добавлений и 100 удалений

Просмотреть файл

@ -90,6 +90,4 @@ def test_objectstore_create_bad_project(webapp, job_sample, jm):
status=404
)
assert resp.status_int == 404
assert resp.json['message'] == ("No dataset found for project "
"u'badproject', contenttype "
"'objectstore'.")
assert resp.json['message'] == "No project with name badproject"

Просмотреть файл

@ -44,7 +44,7 @@ def test_resultset_list_bad_project(webapp, jm):
)
assert resp.status_int == 404
assert resp.json == {"message": "No dataset found for project u'foo', contenttype 'jobs'."}
assert resp.json == {"message": "No project with name foo"}
def test_resultset_detail(webapp, eleven_jobs_processed, jm):
@ -92,7 +92,7 @@ def test_result_set_detail_bad_project(webapp, jm):
expect_errors=True
)
assert resp.status_int == 404
assert resp.json == {"message": "No dataset found for project u'foo', contenttype 'jobs'."}
assert resp.json == {"message": "No project with name foo"}
def test_warning_levels_red_on_fail():

Просмотреть файл

@ -764,11 +764,13 @@ class JobsModel(TreeherderModelBase):
def get_json_blob_by_guid(self, guid):
"""retrieves a json_blob given its guid"""
return self.get_os_dhub().execute(
iter_obj = self.get_os_dhub().execute(
proc="objectstore.selects.get_json_blob_by_guid",
placeholders=[guid],
debug_show=self.DEBUG
debug_show=self.DEBUG,
return_type='iter',
)
return self.as_single(iter_obj, "objectstore", guid=guid)
def get_json_blob_list(self, page, limit):
"""

Просмотреть файл

@ -1,7 +1,6 @@
import simplejson as json
import itertools
from django.http import Http404
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
@ -12,6 +11,31 @@ from treeherder.model.derived import (JobsModel, DatasetNotFoundError,
ObjectNotFoundException)
def use_jobs_model(project, model_func):
"""
Create a jobsmodel and pass it to the ``func``.
``func`` must take a jobsmodel object and return a response object
Catches exceptions
"""
try:
jm = JobsModel(project)
return model_func(jm)
except DatasetNotFoundError as e:
return Response(
{"message": "No project with name {0}".format(project)},
status=404,
)
except ObjectNotFoundException as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
finally:
jm.disconnect()
class ObjectstoreViewSet(viewsets.ViewSet):
"""
This view is responsible for the objectstore endpoint.
@ -24,40 +48,36 @@ class ObjectstoreViewSet(viewsets.ViewSet):
"""
POST method implementation
"""
jm = JobsModel(project)
try:
def model_func(jm):
jm.store_job_data(
json.dumps(request.DATA),
request.DATA['job']['job_guid']
)
except DatasetNotFoundError as e:
return Response({"message": str(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": str(e)}, status=500)
finally:
jm.disconnect()
return Response({'message': 'well-formed JSON stored'})
return Response({'message': 'well-formed JSON stored'})
return use_jobs_model(project, model_func)
def retrieve(self, request, project, pk=None):
"""
GET method implementation for detail view
"""
jm = JobsModel(project)
obj = jm.get_json_blob_by_guid(pk)
if obj:
return Response(json.loads(obj[0]['json_blob']))
else:
raise Http404()
def model_func(jm):
obj = jm.get_json_blob_by_guid(pk)
return Response(json.loads(obj['json_blob']))
return use_jobs_model(project, model_func)
def list(self, request, project):
"""
GET method implementation for list view
"""
page = request.QUERY_PARAMS.get('page', 0)
jm = JobsModel(project)
objs = jm.get_json_blob_list(page, 10)
return Response([json.loads(obj['json_blob']) for obj in objs])
page = int(request.QUERY_PARAMS.get('page', 0))
def model_func(jm):
objs = jm.get_json_blob_list(page, 10)
return Response([json.loads(obj['json_blob']) for obj in objs])
return use_jobs_model(project, model_func)
class ArtifactViewSet(viewsets.ViewSet):
@ -70,22 +90,13 @@ class ArtifactViewSet(viewsets.ViewSet):
GET method implementation for an artifact blob
"""
try:
jm = JobsModel(project)
def model_func(jm):
obj = jm.get_job_artifact(pk)
if obj["type"] == "json":
obj["blob"] = json.loads(obj["blob"])
except DatasetNotFoundError as e:
return Response(
{"message": "No project with name {0}".format(project)},
status=404,
)
except ObjectNotFoundException as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
return Response(obj)
return Response(obj)
return use_jobs_model(project, model_func)
class JobsViewSet(viewsets.ViewSet):
@ -101,8 +112,7 @@ class JobsViewSet(viewsets.ViewSet):
Return a single job with log_references and
artifact names and links to the artifact blobs.
"""
try:
jm = JobsModel(project)
def model_func(jm):
job = jm.get_job(pk)
job["logs"] = jm.get_log_references(pk)
@ -115,33 +125,21 @@ class JobsViewSet(viewsets.ViewSet):
art["resource_uri"] = ref
job["artifacts"].append(art)
except DatasetNotFoundError as e:
return Response(
{"message": "No project with name {0}".format(project)},
status=404,
)
except ObjectNotFoundException as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
return Response(job)
return Response(job)
return use_jobs_model(project, model_func)
def list(self, request, project):
"""
GET method implementation for list view
"""
try:
page = request.QUERY_PARAMS.get('page', 0)
jm = JobsModel(project)
page = request.QUERY_PARAMS.get('page', 0)
def model_func(jm):
objs = jm.get_job_list(page, 10)
return Response(objs)
except DatasetNotFoundError as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
finally:
jm.disconnect()
return use_jobs_model(project, model_func)
@action()
def update_state(self, request, project, pk=None):
@ -149,32 +147,29 @@ class JobsViewSet(viewsets.ViewSet):
Change the state of a job.
"""
state = request.DATA.get('state', None)
jm = JobsModel(project)
# check that this state is valid
if state not in jm.STATES:
return Response(
{"message": ("'{0}' is not a valid state. Must be "
"one of: {1}".format(
state,
", ".join(jm.STATES)
))},
status=400,
)
def model_func(jm):
if not pk: # pragma nocover
return Response({"message": "job id required"}, status=400)
# check that this state is valid
if state not in jm.STATES:
return Response(
{"message": ("'{0}' is not a valid state. Must be "
"one of: {1}".format(
state,
", ".join(jm.STATES)
))},
status=400,
)
if not pk: # pragma nocover
return Response({"message": "job id required"}, status=400)
try:
jm.get_job(pk)
jm.set_state(pk, state)
jm.disconnect()
except ObjectNotFoundException as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
return Response({"message": "state updated to '{0}'".format(state)})
return Response({"message": "state updated to '{0}'".format(state)})
return use_jobs_model(project, model_func)
class ResultSetViewSet(viewsets.ViewSet):
@ -191,10 +186,9 @@ class ResultSetViewSet(viewsets.ViewSet):
filters = ["author"]
jm = JobsModel(project)
try:
page = request.QUERY_PARAMS.get('page', 0)
page = request.QUERY_PARAMS.get('page', 0)
def model_func(jm):
objs = jm.get_result_set_list(
page,
10,
@ -202,12 +196,8 @@ class ResultSetViewSet(viewsets.ViewSet):
if k in filters)
)
return Response(objs)
except DatasetNotFoundError as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
finally:
jm.disconnect()
return use_jobs_model(project, model_func)
@classmethod
def get_warning_level(cls, groups):
@ -247,9 +237,7 @@ class ResultSetViewSet(viewsets.ViewSet):
"""
filters = ["job_type_name"]
jm = JobsModel(project)
try:
def model_func(jm):
rs = jm.get_result_set_by_id(pk)
jobs_ungrouped = list(jm.get_result_set_job_list(
pk,
@ -301,14 +289,8 @@ class ResultSetViewSet(viewsets.ViewSet):
})
return Response(rs)
except DatasetNotFoundError as e:
return Response({"message": unicode(e)}, status=404)
except ObjectNotFoundException as e:
return Response({"message": unicode(e)}, status=404)
except Exception as e: # pragma nocover
return Response({"message": unicode(e)}, status=500)
finally:
jm.disconnect()
return use_jobs_model(project, model_func)
#####################