From efc48be90c4bc9d5002cce23715fd7a4b29de3d5 Mon Sep 17 00:00:00 2001 From: Huang Hao Date: Mon, 29 Sep 2014 14:29:26 +0800 Subject: [PATCH] Catch exceptions for IrisRestClient. Print exception when execption raised in IrisRestClient code. But don't break original workflow. Also change event type into a part of url, so it's more easier to see that in access log. Change-Id: Idca9874e4904366b3333d57b6be531548e0e8401 --- common/iris_rest_client.py | 73 +++++++++++++++++++++++++++++++----------- job_submit.py | 3 +- tests/test_iris_rest_client.py | 29 +++++++++++++++++ 3 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 tests/test_iris_rest_client.py diff --git a/common/iris_rest_client.py b/common/iris_rest_client.py index 73036ba..83297f4 100644 --- a/common/iris_rest_client.py +++ b/common/iris_rest_client.py @@ -1,5 +1,8 @@ """IRIS requests client""" +import sys import urlparse +import traceback + import requests @@ -18,33 +21,62 @@ class IrisRestClient(object): Get csrftoken from server address, use csrftoken to login server, then get new csrftoken for accessing the server. """ - self.session = requests.Session() - self.session.get(self.server) - csrftoken = self.session.cookies.get('csrftoken') + session = requests.Session() + try: + session.get(self.server) + except: + traceback.print_exc() + return False - assert csrftoken + csrftoken = session.cookies.get('csrftoken') + if not csrftoken: + print >> sys.stderr, "Can't get csrf token" + return False data = dict(username=user, password=pwd) header = {'X-CSRFToken': csrftoken} - response = self.session.post(urlparse.urljoin(self.server, '/login/'), - data=data, headers=header) + try: + response = session.post( + urlparse.urljoin(self.server, '/login/'), + data=data, + headers=header) + except: + traceback.print_exc() + return False - self.csrftoken = self.session.cookies['csrftoken'] - self.header = {'X-CSRFToken': self.csrftoken} - return response + csrftoken = session.cookies.get('csrftoken') + if not csrftoken: + print >> sys.stderr, "Can't get csrf token2" + return False + + self.header = {'X-CSRFToken': csrftoken} + self.csrftoken = csrftoken + self.session = session + return True def _post(self, url, **kwargs): """Commom post method with header""" - detail = {} - response = self.session.post(urlparse.urljoin(self.server, url), - headers=self.header, **kwargs) + if not self.session: + return { + 'status': 'Error', + 'detail': 'Client error! Please connect to the correct server', + } try: - detail.update(response.json()) - detail['status'] = response.status_code - except ValueError: - detail['detail'] = 'Server error, please contact the administrator!' - detail['status'] = 'Error' + res = self.session.post( + urlparse.urljoin(self.server, url), + headers=self.header, + **kwargs) + detail = res.json() + except: + traceback.print_exc() + detail = { + 'status': 'Error', + 'detail': traceback.format_exc(), + } + else: + detail['status'] = res.status_code + return detail def scm_update(self, domain_file, gittree_file): @@ -59,8 +91,11 @@ class IrisRestClient(object): files = (('domains', domains), ('gittrees', gittrees)) return self._post('app/packagedb/scm/check/', files=files) - def publish_event(self, data): + def publish_event(self, typ, data): """ Publish submissions related events to IRIS server """ - return self._post('api/submissions/events/', data=data) + url = 'api/submissions/events/%s/' % typ + res = self._post(url, data=data) + print >> sys.stderr, 'events|%s|%s' % (url, res) + return res diff --git a/job_submit.py b/job_submit.py index 8517e65..3cd8e81 100755 --- a/job_submit.py +++ b/job_submit.py @@ -125,8 +125,7 @@ def main(build_type): os.getenv("IRIS_SERVER"), os.getenv("IRIS_USERNAME"), base64.b64decode(os.getenv('IRIS_PASSWORDX',''))) - rest.publish_event({ - "event": "submitted", + rest.publish_event("submitted", { "branch": git_branch, "commit_id": gerrit_newrev, "gitpath": gerrit_project, diff --git a/tests/test_iris_rest_client.py b/tests/test_iris_rest_client.py new file mode 100644 index 0000000..9e1b261 --- /dev/null +++ b/tests/test_iris_rest_client.py @@ -0,0 +1,29 @@ +#pylint: skip-file +import unittest + +import mock + +from common.iris_rest_client import IrisRestClient as Client + + +class ClientTests(unittest.TestCase): + + def test_wont_raise_exception_if_server_is_None(self): + c = Client(None) + r = c.publish_event('bad', {}) + self.assertEquals('Error', r['status']) + + def test_wont_raise_exception_if_server_is_bad(self): + c = Client('bad_server', 'robot', 'robot') + r = c.publish_event('bad', {}) + self.assertEquals('Error', r['status']) + + def test_wont_raise_exception_if_can_not_connect_to_server(self): + c = Client('http://server.does.not.exist', 'robot', 'robot') + r = c.publish_event('bad', True) + self.assertEquals('Error', r['status']) + + @mock.patch('requests.Session') + def test_ok(self, Session): + c = Client('http://www.google.com', 'robot', 'robot') + c.publish_event('good', {}) -- 2.7.4