"""IRIS requests client"""
+import sys
import urlparse
+import traceback
+
import requests
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):
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
--- /dev/null
+#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', {})