import logging
import sys
+from typing import List
+
from contextlib import contextmanager
from threading import Lock, Condition
from typing import no_type_check
"""
return "cephfs.{}.meta".format(volname), "cephfs.{}.data".format(volname)
+def get_pool_names(mgr, volname):
+ """
+ return metadata and data pools (list) names of volume as a tuple
+ """
+ fs_map = mgr.get("fs_map")
+ metadata_pool_id = None
+ data_pool_ids = [] # type: List[int]
+ for f in fs_map['filesystems']:
+ if volname == f['mdsmap']['fs_name']:
+ metadata_pool_id = f['mdsmap']['metadata_pool']
+ data_pool_ids = f['mdsmap']['data_pools']
+ break
+ if metadata_pool_id is None:
+ return None, None
+
+ osdmap = mgr.get("osd_map")
+ pools = dict([(p['pool'], p['pool_name']) for p in osdmap['pools']])
+ metadata_pool = pools[metadata_pool_id]
+ data_pools = [pools[id] for id in data_pool_ids]
+ return metadata_pool, data_pools
+
def create_volume(mgr, volname, placement):
"""
create volume (pool, filesystem and mds)
# create mds
return create_mds(mgr, volname, placement)
-def delete_volume(mgr, volname):
+def delete_volume(mgr, volname, metadata_pool, data_pools):
"""
- delete the given module (tear down mds, remove filesystem)
+ delete the given module (tear down mds, remove filesystem, remove pools)
"""
# Tear down MDS daemons
try:
err = "Filesystem not found for volume '{0}'".format(volname)
log.warning(err)
return -errno.ENOENT, "", err
- metadata_pool, data_pool = gen_pool_names(volname)
r, outb, outs = remove_pool(mgr, metadata_pool)
if r != 0:
return r, outb, outs
- return remove_pool(mgr, data_pool)
+
+ for data_pool in data_pools:
+ r, outb, outs = remove_pool(mgr, data_pool)
+ if r != 0:
+ return r, outb, outs
+ result_str = "metadata pool: {0} data pool: {1} removed".format(metadata_pool, str(data_pools))
+ return r, result_str, ""
def list_volumes(mgr):
"""