summaryrefslogtreecommitdiff
path: root/pylibchorus
diff options
context:
space:
mode:
authorkballou <kballou@devnulllabs.io>2015-04-07 17:59:23 -0600
committerkballou <kballou@devnulllabs.io>2015-04-09 13:35:21 -0600
commita3d62066a169c26712c30061232146dd46926ff1 (patch)
tree24868c2adbb68222cc9ba66c77510b41f34f1851 /pylibchorus
parent5deca4625a64c764937b77d677a15b6ce938f700 (diff)
downloadpylibchorus-a3d62066a169c26712c30061232146dd46926ff1.tar.gz
pylibchorus-a3d62066a169c26712c30061232146dd46926ff1.tar.xz
Add initial skeleton code
* Includes the `ChorusSession` object that underpins all API calls
Diffstat (limited to 'pylibchorus')
-rw-r--r--pylibchorus/__init__.py6
-rw-r--r--pylibchorus/chorus_client.py85
-rw-r--r--pylibchorus/tests/__init__.py6
-rw-r--r--pylibchorus/tests/chorus_client_tests.py74
-rw-r--r--pylibchorus/version.py5
5 files changed, 176 insertions, 0 deletions
diff --git a/pylibchorus/__init__.py b/pylibchorus/__init__.py
new file mode 100644
index 0000000..7e473c2
--- /dev/null
+++ b/pylibchorus/__init__.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+'''PyLibChorus -- Python Chorus API Library'''
+
+import logging
+
+LOG = logging.getLogger(__name__)
diff --git a/pylibchorus/chorus_client.py b/pylibchorus/chorus_client.py
new file mode 100644
index 0000000..5c7119f
--- /dev/null
+++ b/pylibchorus/chorus_client.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+'''Alpine/Chorus Client API Module'''
+
+import logging
+import requests
+
+LOG = logging.Logger(name=__name__)
+
+CONTENT_TYPE = 'application/x-www-form-urlencoded'
+JSON_CONTENT_TYPE = 'application/json'
+
+class ChorusSession(object):
+ '''Chorus User Session Object'''
+
+ def __init__(self, config):
+ self.config = config
+ self.sid = None
+ self.cookies = None
+
+ def __enter__(self):
+ '''create session and return sid and cookies'''
+
+ request_data = _login_(self.config.get('alpine', 'username'),
+ self.config.get('alpine', 'password'))
+
+ LOG.debug("Opening Chorus Session")
+ post = requests.post(self.get_url(request_data['url']),
+ params=request_data['params'],
+ data=request_data['data'],
+ headers=request_data['headers'])
+ LOG.info("Status code for session open: %d", post.status_code)
+ json = post.json()
+
+ self.sid = json['response']['session_id']
+ self.cookies = post.cookies
+ return self
+
+ def __exit__(self, _type, _value, _traceback):
+ '''Close chorus session'''
+ request_data = _logout_(self.sid, self.cookies)
+ LOG.debug("Closing Chorus Session")
+ delete = requests.delete(self.get_url(request_data['url']),
+ params=request_data['params'],
+ headers=request_data['headers'],
+ cookies=request_data['cookies'])
+
+ LOG.info("Status code for close: %d", delete.status_code)
+
+ def get_url(self, path=""):
+ '''Return the host and path for the chorus instance'''
+
+ return "http://%s/%s" % (self.config.get('alpine', 'host'), path)
+
+def _login_(username, password):
+ '''Create Request Data for ChorusSession'''
+ return {
+ 'data': {
+ 'username': username,
+ 'password': password,
+ },
+ 'headers': {
+ 'content-type': CONTENT_TYPE,
+ },
+ 'params': {
+ 'session_id': '',
+ },
+ 'cookies': None,
+ 'url': '/sessions?session_id=',
+ 'method': 'POST',
+ }
+
+def _logout_(sid, cookies):
+ '''Create request data for ChorusSession'''
+ return {
+ 'data': None,
+ 'headers': {
+ 'content-type': CONTENT_TYPE,
+ },
+ 'params': {
+ 'session_id': sid,
+ },
+ 'cookies': cookies,
+ 'url': '/sessions',
+ 'method': 'DELETE',
+ }
diff --git a/pylibchorus/tests/__init__.py b/pylibchorus/tests/__init__.py
new file mode 100644
index 0000000..d4e601a
--- /dev/null
+++ b/pylibchorus/tests/__init__.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+'''PyLibChorus Tests Module'''
+
+import logging
+
+logging.basicConfig(level=logging.DEBUG)
diff --git a/pylibchorus/tests/chorus_client_tests.py b/pylibchorus/tests/chorus_client_tests.py
new file mode 100644
index 0000000..e2eb6e1
--- /dev/null
+++ b/pylibchorus/tests/chorus_client_tests.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+'''Chorus Client Test Cases'''
+
+import logging
+from pylibchorus.chorus_client import _login_
+from pylibchorus.chorus_client import _logout_
+import unittest
+
+LOG = logging.getLogger(__name__)
+
+class ChorusSessionTests(unittest.TestCase):
+ '''ChorusSession Test Case'''
+
+ def test_login_returns_request_data(self):
+ '''Test _login_ returns request data'''
+ actual = _login_('chorusadmin', 'secret')
+ self.assertIsNotNone(actual)
+ self.assertIn('data', actual)
+ self.assertIn('headers', actual)
+ self.assertIn('params', actual)
+ self.assertIn('cookies', actual)
+ self.assertIn('url', actual)
+ self.assertIn('method', actual)
+ self.assertIsNotNone(actual['data'])
+ self.assertIsNotNone(actual['headers'])
+ self.assertIsNotNone(actual['params'])
+ self.assertIsNone(actual['cookies'])
+ self.assertIsNotNone(actual['url'])
+ self.assertIsNotNone(actual['method'])
+ data = actual['data']
+ self.assertIn('username', data)
+ self.assertIn('password', data)
+ self.assertEquals(data['username'], 'chorusadmin')
+ self.assertEquals(data['password'], 'secret')
+ headers = actual['headers']
+ self.assertIn('content-type', headers)
+ self.assertEquals('application/x-www-form-urlencoded',
+ headers['content-type'])
+ params = actual['params']
+ self.assertIn('session_id', params)
+ self.assertEquals(params['session_id'], '')
+ self.assertEquals('/sessions?session_id=', actual['url'])
+ self.assertEquals('POST', actual['method'])
+
+
+ #pylint: disable=C0103
+ def test_logout_returns_request_data(self):
+ '''Test _logout_ returns correct request data'''
+ sid = 'foobar'
+ cookies = {'session_id', sid}
+ actual = _logout_(sid, cookies)
+ self.assertIsNotNone(actual)
+ self.assertIn('data', actual)
+ self.assertIn('headers', actual)
+ self.assertIn('params', actual)
+ self.assertIn('cookies', actual)
+ self.assertIn('url', actual)
+ self.assertIn('method', actual)
+ self.assertIsNone(actual['data'])
+ self.assertIsNotNone(actual['headers'])
+ self.assertIsNotNone(actual['params'])
+ self.assertIsNotNone(actual['cookies'])
+ self.assertIsNotNone(actual['url'])
+ self.assertIsNotNone(actual['method'])
+ headers = actual['headers']
+ self.assertIn('content-type', headers)
+ self.assertEquals('application/x-www-form-urlencoded',
+ headers['content-type'])
+ params = actual['params']
+ self.assertIn('session_id', params)
+ self.assertEquals(sid, params['session_id'])
+ self.assertEquals(cookies, actual['cookies'])
+ self.assertEquals('/sessions', actual['url'])
+ self.assertEquals('DELETE', actual['method'])
diff --git a/pylibchorus/version.py b/pylibchorus/version.py
new file mode 100644
index 0000000..ead4b0d
--- /dev/null
+++ b/pylibchorus/version.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+'''Version Information Definition'''
+
+__version_info__ = (0, 0, 1)
+__version__ = ".".join(str(i) for i in __version_info__)