diff --git a/charms_ceph/broker.py b/charms_ceph/broker.py index 8f040a5..2542769 100644 --- a/charms_ceph/broker.py +++ b/charms_ceph/broker.py @@ -750,6 +750,7 @@ def handle_create_cephfs(request, service): """ cephfs_name = request.get('mds_name') data_pool = request.get('data_pool') + extra_pools = request.get('extra_pools', []) metadata_pool = request.get('metadata_pool') # Check if the user params were provided if not cephfs_name or not data_pool or not metadata_pool: @@ -758,14 +759,12 @@ def handle_create_cephfs(request, service): return {'exit-code': 1, 'stderr': msg} # Sanity check that the required pools exist - if not pool_exists(service=service, name=data_pool): - msg = "CephFS data pool does not exist. Cannot create CephFS" - log(msg, level=ERROR) - return {'exit-code': 1, 'stderr': msg} - if not pool_exists(service=service, name=metadata_pool): - msg = "CephFS metadata pool does not exist. Cannot create CephFS" - log(msg, level=ERROR) - return {'exit-code': 1, 'stderr': msg} + for pool_name in [data_pool, metadata_pool] + extra_pools: + if not pool_exists(service=service, name=pool_name): + msg = "CephFS pool {} does not exist. Cannot create CephFS".format( + pool_name) + log(msg, level=ERROR) + return {'exit-code': 1, 'stderr': msg} if get_cephfs(service=service): # CephFS new has already been called @@ -786,6 +785,14 @@ def handle_create_cephfs(request, service): else: log(err.output, level=ERROR) return {'exit-code': 1, 'stderr': err.output} + for pool_name in extra_pools: + cmd = ["ceph", '--id', service, "fs", "add_data_pool", cephfs_name, + pool_name] + try: + check_output(cmd) + except CalledProcessError as err: + log(err.output, level=ERROR) + return {'exit-code': 1, 'stderr': err.output} def handle_rgw_region_set(request, service): diff --git a/unit_tests/test_broker.py b/unit_tests/test_broker.py index 8adafe4..b850bc7 100644 --- a/unit_tests/test_broker.py +++ b/unit_tests/test_broker.py @@ -494,6 +494,43 @@ class CephBrokerTestCase(unittest.TestCase): self.assertEqual(json.loads(rc)['exit-code'], 0) self.assertEqual(json.loads(rc)['request-id'], '1ef5aede') + @patch.object(charms_ceph.broker, 'get_cephfs') + @patch.object(charms_ceph.broker, 'check_output') + @patch.object(charms_ceph.broker, 'pool_exists') + @patch.object(charms_ceph.broker, 'log') + def test_process_requests_create_cephfs_ec(self, + mock_log, + mock_pool_exists, + check_output, + get_cephfs): + get_cephfs.return_value = [] + mock_pool_exists.return_value = True + reqs = json.dumps({'api-version': 1, + 'request-id': '1ef5aede', + 'ops': [{ + 'op': 'create-cephfs', + 'mds_name': 'foo', + 'extra_pools': ['ec_pool'], + 'data_pool': 'data', + 'metadata_pool': 'metadata', + }]}) + rc = charms_ceph.broker.process_requests(reqs) + mock_pool_exists.assert_has_calls( + [ + call(service='admin', name='data'), + call(service='admin', name='ec_pool'), + call(service='admin', name='metadata'), + ], + any_order=True) + check_output.assert_has_calls( + [ + call(['ceph', '--id', 'admin', 'fs', 'new', 'foo', 'metadata', + 'data']), + call(['ceph', '--id', 'admin', 'fs', 'add_data_pool', 'foo', + 'ec_pool'])]) + self.assertEqual(json.loads(rc)['exit-code'], 0) + self.assertEqual(json.loads(rc)['request-id'], '1ef5aede') + @patch.object(charms_ceph.broker, 'check_output') @patch.object(charms_ceph.broker, 'get_osd_weight') @patch.object(charms_ceph.broker, 'log')