Catch exceptions for IrisRestClient.
authorHuang Hao <hao.h.huang@intel.com>
Mon, 29 Sep 2014 06:29:26 +0000 (14:29 +0800)
committerHuang Hao <hao.h.huang@intel.com>
Mon, 29 Sep 2014 06:46:10 +0000 (14:46 +0800)
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
job_submit.py
tests/test_iris_rest_client.py [new file with mode: 0644]

index 73036ba..83297f4 100644 (file)
@@ -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
index 8517e65..3cd8e81 100755 (executable)
@@ -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 (file)
index 0000000..9e1b261
--- /dev/null
@@ -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', {})