From c0c2512df6795a69e8c5b6e9b0df3bcf483393ba Mon Sep 17 00:00:00 2001 From: Edward Hope-Morley Date: Sat, 8 Nov 2014 20:15:17 +0000 Subject: [PATCH] added unit tests --- hooks/__init__.py | 0 hooks/ceph_broker.py | 11 ++++++--- hooks/hooks.py | 17 +++++++------- unit_tests/__init__.py | 2 ++ unit_tests/test_ceph_broker.py | 41 +++++++++++++++++++++++++++++++--- 5 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 hooks/__init__.py create mode 100644 unit_tests/__init__.py diff --git a/hooks/__init__.py b/hooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hooks/ceph_broker.py b/hooks/ceph_broker.py index 280f05f..ccbc2ad 100644 --- a/hooks/ceph_broker.py +++ b/hooks/ceph_broker.py @@ -23,16 +23,21 @@ def process_requests(reqs): # setup to use them for these operations. svc = 'admin' if op == "create_pool": - pool = req.get('pool') + pool = req.get('name') replicas = req.get('replicas') if not all([pool, replicas]): log("Missing parameter(s)", level=ERROR) return 1 if not pool_exists(service=svc, name=pool): - log("Creating pool '%s'" % (pool), level=INFO) + log("Creating pool '%s' (replicas=%s)" % (pool, replicas), + level=INFO) create_pool(service=svc, name=pool, replicas=replicas) else: - log("Pool '%s' already exists" % (pool), level=INFO) + log("Pool '%s' already exists - skipping create" % (pool), + level=INFO) + else: + log("Unknown operation '%s'" % (op)) + return 1 return 0 diff --git a/hooks/hooks.py b/hooks/hooks.py index 301a87a..11aa5ed 100755 --- a/hooks/hooks.py +++ b/hooks/hooks.py @@ -296,17 +296,18 @@ def client_relation_joined(relid=None): @hooks.hook('client-relation-changed') def client_relation_changed(relid=None): - if ceph.is_quorum(): - resp = None + """Process broker requests from ceph client relations.""" + if ceph.is_quorum() and ceph.is_leader(): settings = relation_get(rid=relid) if 'broker_req' in settings: req = settings['broker_req'] - log("Broker request received") - resp = process_requests(json.loads(req)) - - if resp is not None: - relation_set(relation_id=relid, - relation_settings={'broker_rsp': resp}) + log("Broker request received from ceph client") + exit_code = process_requests(json.loads(req)) + # Construct JSON response dict allowing other data to be added as + # and when we need it. + resp = json.dumps({'exit_code': exit_code}) + relation_set(relation_id=relid, + relation_settings={'broker_rsp': resp}) else: log('mon cluster not in quorum') diff --git a/unit_tests/__init__.py b/unit_tests/__init__.py new file mode 100644 index 0000000..f80aab3 --- /dev/null +++ b/unit_tests/__init__.py @@ -0,0 +1,2 @@ +import sys +sys.path.append('hooks') diff --git a/unit_tests/test_ceph_broker.py b/unit_tests/test_ceph_broker.py index faca458..0d4a337 100644 --- a/unit_tests/test_ceph_broker.py +++ b/unit_tests/test_ceph_broker.py @@ -1,11 +1,46 @@ -#import mock +import mock import unittest +import ceph_broker + class CephBrokerTestCase(unittest.TestCase): def setUp(self): super(CephBrokerTestCase, self).setUp() - def test_process_requests(self): - pass + @mock.patch('ceph_broker.log') + def test_process_requests_noop(self, mock_log): + rc = ceph_broker.process_requests([{}]) + self.assertEqual(rc, 1) + + @mock.patch('ceph_broker.log') + def test_process_requests_invalid(self, mock_log): + rc = ceph_broker.process_requests([{'op': 'invalid_op'}]) + self.assertEqual(rc, 1) + + @mock.patch('ceph_broker.create_pool') + @mock.patch('ceph_broker.pool_exists') + @mock.patch('ceph_broker.log') + def test_process_requests_create_pool(self, mock_log, mock_pool_exists, + mock_create_pool): + mock_pool_exists.return_value = False + rc = ceph_broker.process_requests([{'op': 'create_pool', 'name': 'foo', + 'replicas': 3}]) + mock_pool_exists.assert_called_with(service='admin', name='foo') + mock_create_pool.assert_called_with(service='admin', name='foo', + replicas=3) + self.assertEqual(rc, 0) + + @mock.patch('ceph_broker.create_pool') + @mock.patch('ceph_broker.pool_exists') + @mock.patch('ceph_broker.log') + def test_process_requests_create_pool_exists(self, mock_log, + mock_pool_exists, + mock_create_pool): + mock_pool_exists.return_value = True + rc = ceph_broker.process_requests([{'op': 'create_pool', 'name': 'foo', + 'replicas': 3}]) + mock_pool_exists.assert_called_with(service='admin', name='foo') + self.assertFalse(mock_create_pool.called) + self.assertEqual(rc, 0)