示例#1
0
    def drop_pool(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        pool_name = str(params['pool_name'])
        disk_id = params['disk_id']
        disk_part = params['disk_part']

        # 删除pool
        e, res = apipal.Pool().del_pool(pool_name)
        if e and res.find("not added in PAL") == -1:
            rc.retcode = msg_ios.RC_IOS_PAL_POOL_DROP_FAILED
            rc.message = "pal pool drop failed:%s" % res
            return rc, ''

        time.sleep(1)

        # 从pal中删除磁盘
        part = common.GetPartInfo(disk_id, disk_part)
        if part != None:
            e, res = apipal.Disk().del_disk(part['DEVNAME'])
            if e and res.find("not added in PAL") == -1:
                logger.run.error("Drop pal disk failed,%s:%s:%s" %
                                 (part['DEVNAME'], e, res))
        return rc, ''
示例#2
0
    def add_lun_with_basedisk(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        disk_id   = params['disk_id']
        disk_part = params['disk_part']

        part = common.GetPartInfo(disk_id, disk_part)
        if part == None:
            rc.retcode = msg_ios.RC_IOS_DISKPART_NOT_EXIST
            rc.message = "part %s,%s not exist" % (disk_id, disk_part)
            return rc, ''
        return rc, {'DEVNAME':part['DEVNAME']}
示例#3
0
    def load_smartcache(self, params):
        cache_dev = common.GetPartInfo(params['cache_disk_id'],
                                       params['cache_disk_part'],
                                       self.disk_list)
        if cache_dev == None:
            logger.run.error(
                "Cann't find cache dev by uuid:%s, index:%s" %
                (params['cache_disk_id'], params['cache_disk_part']))
            return params, ""

        data_dev = common.GetPartInfo(params['data_disk_id'],
                                      params['data_disk_part'], self.disk_list)
        if data_dev == None:
            logger.run.error(
                "Cann't find data dev by uuid:%s, index:%s" %
                (params['data_disk_id'], params['data_disk_part']))
            return params, ""

        logger.run.info(
            "Start load smartcache '%s'" %
            (",".join(["%s:%s" % (k, v) for k, v in params.items()])))

        e, res = APISmartCache().load({
            'cache_dev': cache_dev['DEVNAME'],
            'data_dev': data_dev['DEVNAME']
        })
        result = False
        if e:
            print res
            logger.run.error(
                "Load cache '%s' failed, e:%s, res:%s" %
                (",".join(["%s:%s" % (k, v)
                           for k, v in params.items()]), e, res))
            result = False
        else:
            result = True
        return params, result
示例#4
0
    def SyncLun(self):
        # 同步增加
        lun_list = APISmartScsi().get_lun_list()
        for lun_info in self.lun_infos:
            params = {}
            params["group_name"] = []
            group_uuids = []
            for info in lun_info.group_info:
                if info.group_state:
                    group_uuids.append(info.group_uuid)
            if lun_info.config_state == False:
                continue

            lun_name = "%s_%s" % (self.node_name, lun_info.lun_name)
            # 过滤已经在线有组lun
            if lun_name in lun_list.keys(
            ) and lun_list[lun_name]['attrs'].has_key(
                    'exported') and lun_list[lun_name]['attrs']['group_name']:
                group_num = 0
                for name in group_uuids:
                    if name in lun_list[lun_name]['attrs']["group_name"]:
                        continue
                    params["group_name"].append(name)
                    group_num += 1
                if not group_num:
                    continue
            # 过滤已经在线无组lun
            elif lun_name in lun_list.keys(
            ) and lun_list[lun_name]['attrs'].has_key(
                    'exported'
            ) and not lun_list[lun_name]['attrs']['group_name']:
                continue
            else:
                params["group_name"] = group_uuids
            logger.run.info("lun group %s" % params["group_name"])
            if lun_info.lun_type == msg_pds.LUN_TYPE_BASEDEV:
                for basedev_info in self.basedev_infos:
                    if basedev_info.basedev_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_basedev_id]:
                        if os.path.exists(basedev_info.dev_name):
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = basedev_info.dev_name
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            elif lun_info.lun_type == msg_pds.LUN_TYPE_BASEDISK:
                for basedisk_info in self.basedisk_infos:
                    if basedisk_info.basedisk_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_basedisk_id]:
                        part = common.GetPartInfo(basedisk_info.disk_id,
                                                  basedisk_info.disk_part,
                                                  self.disk_list)
                        if part != None:
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = part['DEVNAME']
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            elif lun_info.lun_type == msg_pds.LUN_TYPE_SMARTCACHE:
                for smartcache_info in self.smartcache_infos:
                    if smartcache_info.smartcache_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_smartcache_id]:
                        if os.path.exists(
                                os.path.join("/dev/mapper",
                                             smartcache_info.smartcache_id)):
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = os.path.join(
                                "/dev/mapper", smartcache_info.smartcache_id)
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            elif lun_info.lun_type == msg_pds.LUN_TYPE_PALCACHE:
                for palcache_info in self.palcache_infos:
                    if palcache_info.palcache_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_palcache_id]:
                        if os.path.exists(
                                os.path.join("/dev/",
                                             palcache_info.palcache_name)):
                            # pal目前认到的target, target除了在dev下确认外,还需要在target list二次确认
                            paltarget = apipal.Target()
                            e, pal_targets = paltarget.get_target_list()
                            if e:
                                logger.run.error(
                                    "Get pal target list failed:%s" %
                                    pal_targets)
                                continue
                            ok_flag = False
                            for target in pal_targets:
                                if str(target.uuid()
                                       ) == palcache_info.palcache_id:
                                    if apipal.testBit(target.state(),
                                                      apipal.TARGET_LOADED):
                                        ok_flag = True
                                    break
                            if ok_flag == False:
                                logger.run.error(
                                    "PalCache %s status is not ok" %
                                    palcache_info.palcache_name)
                                continue
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = os.path.join(
                                "/dev/", palcache_info.palcache_name)
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            elif lun_info.lun_type == msg_pds.LUN_TYPE_PALRAW:
                for palraw_info in self.palraw_infos:
                    if palraw_info.palraw_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_palraw_id]:
                        if os.path.exists(
                                os.path.join("/dev/",
                                             palraw_info.palraw_name)):
                            # pal目前认到的target, target除了在dev下确认外,还需要在target list二次确认
                            paltarget = apipal.Target()
                            e, pal_targets = paltarget.get_target_list()
                            if e:
                                logger.run.error(
                                    "Get pal target list failed:%s" %
                                    pal_targets)
                                continue
                            ok_flag = False
                            for target in pal_targets:
                                if str(target.uuid()) == palraw_info.palraw_id:
                                    if apipal.testBit(target.state(),
                                                      apipal.TARGET_LOADED):
                                        ok_flag = True
                                    break
                            if ok_flag == False:
                                logger.run.error("PalRaw %s status is not ok" %
                                                 palraw_info.palraw_name)
                                continue
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = os.path.join(
                                "/dev/", palraw_info.palraw_name)
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            elif lun_info.lun_type == msg_pds.LUN_TYPE_PALPMT:
                for palpmt_info in self.palpmt_infos:
                    if palpmt_info.palpmt_id == lun_info.Extensions[
                            msg_pds.ext_luninfo_palpmt_id]:
                        if os.path.exists(
                                os.path.join("/dev/",
                                             palpmt_info.palpmt_name)):
                            # pal目前认到的target, target除了在dev下确认外,还需要在target list二次确认
                            paltarget = apipal.Target()
                            e, pal_targets = paltarget.get_target_list()
                            if e:
                                logger.run.error(
                                    "Get pal target list failed:%s" %
                                    pal_targets)
                                continue
                            ok_flag = False
                            for target in pal_targets:
                                if str(target.uuid()) == palpmt_info.palpmt_id:
                                    if apipal.testBit(target.state(),
                                                      apipal.TARGET_LOADED):
                                        ok_flag = True
                                    break
                            if ok_flag == False:
                                logger.run.error("PalPmt %s status is not ok" %
                                                 palpmt_info.palpmt_name)
                                continue
                            logger.run.info("Start auto load lun %s" %
                                            (lun_info.lun_name))
                            params['device_name'] = "%s_%s" % (
                                self.node_name, lun_info.lun_name)
                            params['path'] = os.path.join(
                                "/dev/", palpmt_info.palpmt_name)
                            params['t10_dev_id'] = lun_info.lun_id[:23]
                            apismartscsi = APISmartScsi()
                            e = apismartscsi.add_lun(params)
                            if e:
                                logger.run.error("Add lun failed:%s" %
                                                 apismartscsi.errmsg)
                        break
            else:
                assert (0)

        # 同步删除
        lun_list = APISmartScsi().get_lun_list()
        for lun_name in lun_list.keys():
            if lun_name not in [
                    "%s_%s" % (self.node_name, lun_info.lun_name)
                    for lun_info in self.lun_infos
            ]:
                apismartscsi = APISmartScsi()
                if lun_list[lun_name]["attrs"]["group_name"]:
                    for k in lun_list[lun_name]["attrs"]["group_name"]:
                        logger.run.info("Start auto remove lun %s group %s" %
                                        (lun_name, k))
                        e, exist_lun = apismartscsi.drop_lun_with_group(
                            lun_name, k)
                        if e:
                            logger.run.error("Drop lun failed:%s" %
                                             apismartscsi.errmsg)
                else:
                    logger.run.info("Start auto remove lun %s" % lun_name)
                    e, exist_lun = apismartscsi.drop_lun_with_group(lun_name)
                    if e:
                        logger.run.error("Drop lun failed:%s" %
                                         apismartscsi.errmsg)

        APISmartScsi().enable_targets()
        return self.FinishMachine()
示例#5
0
    def PreparePal(self):
        # 在同步pal的时候, 需要先刷新target-id, 以及检查模块
        pal_ids = []
        pal_ids.extend(
            [palcache_info.pal_id for palcache_info in self.palcache_infos])
        pal_ids.extend(
            [palraw_info.pal_id for palraw_info in self.palraw_infos])
        pal_ids.extend(
            [palpmt_info.pal_id for palpmt_info in self.palpmt_infos])
        common.CheckDriverConfigure(pal_ids)

        palpool = apipal.Pool()
        paldisk = apipal.Disk()
        paltarget = apipal.Target()

        # pal目前认到的磁盘
        e, pal_disks = paldisk.get_disk_list()
        if e:
            logger.run.error("Get pal disk list failed:%s" % pal_disks)
            return
        pal_disks_path_name = [disk.path_name() for disk in pal_disks]

        # pal目前认到的target
        e, pal_targets = paltarget.get_target_list()
        if e:
            logger.run.error("Get pal target list failed:%s" % pal_targets)
            return
        pal_targets_name = [target.name() for target in pal_targets]

        # pal目前认到的pool
        e, pal_pools = palpool.get_pool_list()
        if e:
            logger.run.error("Get pal pool list failed:%s" % pal_pools)
            return
        pal_pools_name = [pool.name() for pool in pal_pools]

        pool_id_to_info = {}
        todo_load_pool_disk = []
        todo_load_cache_disk = []
        todo_load_raw_disk = []
        todo_del_target = []
        todo_del_pool = []

        # 获取需要删除的垃圾target
        cfg_target_name = []
        cfg_target_name.extend([
            palcache_info.palcache_name
            for palcache_info in self.palcache_infos
        ])
        cfg_target_name.extend(
            [palraw_info.palraw_name for palraw_info in self.palraw_infos])
        cfg_target_name.extend(
            [palpmt_info.palpmt_name for palpmt_info in self.palpmt_infos])
        for target_name in pal_targets_name:
            if target_name not in cfg_target_name:
                todo_del_target.append(target_name)

        # 获取需要删除的垃圾pool
        for pool_name in pal_pools_name:
            if pool_name not in [
                    pool_info.pool_name for pool_info in self.pool_infos
            ]:
                todo_del_pool.append(pool_name)

        # 清理垃圾target
        for target_name in todo_del_target:
            logger.run.info("Auto del target %s" % target_name)
            e, res = paltarget.del_target(target_name)
            if e: logger.run.warning("Auto del target failed :%s" % res)

        # 清理垃圾pool
        for pool_name in todo_del_pool:
            logger.run.info("Auto del pool %s" % pool_name)
            e, res = palpool.del_pool(pool_name)
            if e: logger.run.warning("Auto del pool failed :%s" % res)

        # 获取pool没有load的盘
        for pool_info in self.pool_infos:
            pool_id_to_info[pool_info.pool_id] = pool_info
            assert (len(pool_info.pool_disk_infos) == 1)
            # 如果pool已经is_invalid or is_disable则不再尝试load pool的盘
            if pool_info.is_invalid == True or pool_info.is_disable == True:
                logger.run.info(
                    "Skip check pool %s disk for is invalid or is disable" %
                    pool_info.pool_name)
                continue
            pool_disk_info = pool_info.pool_disk_infos[0]
            part = common.GetPartInfo(pool_disk_info.disk_id,
                                      pool_disk_info.disk_part, self.disk_list)
            if part == None:
                logger.run.warning("Pal pool %s disk miss" %
                                   pool_info.pool_name)
                continue
            if part['DEVNAME'] not in pal_disks_path_name:
                todo_load_pool_disk.append(part['DEVNAME'])

        # 获取palcache没有load的盘
        for palcache_info in self.palcache_infos:
            part = common.GetPartInfo(palcache_info.disk_id,
                                      palcache_info.disk_part, self.disk_list)
            if part == None:
                continue
            if part['DEVNAME'] not in pal_disks_path_name:
                todo_load_cache_disk.append({
                    "dev_name": part['DEVNAME'],
                    "pool_id": palcache_info.pool_id
                })

        # 获取palraw没有load的盘
        for palraw_info in self.palraw_infos:
            part = common.GetPartInfo(palraw_info.disk_id,
                                      palraw_info.disk_part, self.disk_list)
            if part == None:
                continue
            if part['DEVNAME'] not in pal_disks_path_name:
                todo_load_raw_disk.append({"dev_name": part['DEVNAME']})

        # load所有pool需要load的盘
        for dev_name in todo_load_pool_disk:
            logger.run.info("Auto load pool disk %s" % dev_name)
            e, res = paldisk.load_disk(dev_name)
            if e:
                logger.run.error("Load pool disk faild %s:%s" %
                                 (dev_name, res))

        # 重新获取pal目前认到的pool, 且为running状态的pool
        e, pal_pools = palpool.get_pool_list()
        if e:
            logger.run.error("Get pal pool list failed:%s" % pal_pools)
            return
        loading_pal_pools_id = [
            pool.uuid() for pool in pal_pools
            if apipal.testBit(pool.state(), apipal.POOL_STATE_LOADING)
        ]

        for todo_info in todo_load_cache_disk:
            dev_name = todo_info['dev_name']
            pool_id = todo_info['pool_id']
            # 如果target对应的pool已经标记为disable, 则使用raw的方式load磁盘
            if pool_id in pool_id_to_info.keys(
            ) and pool_id_to_info[pool_id].is_disable == True:
                logger.run.info(
                    "Start load disk %s by raw for disable pool %s" %
                    (dev_name, pool_id_to_info[pool_id].pool_name))
                e, res = paldisk.load_disk(dev_name, 'raw')
                if e:
                    logger.run.error("Load cache disk faild %s:%s" %
                                     (dev_name, res))
                continue
            # 如果target对应的pool已经标记为rebuild, 则使用cache的方式load磁盘
            if pool_id in pool_id_to_info.keys() and pool_id_to_info[
                    pool_id].is_rebuild == True and pool_id_to_info[
                        pool_id].is_invalid == False:
                logger.run.info("Start load disk %s by rebuild pool %s" %
                                (dev_name, pool_id_to_info[pool_id].pool_name))
                e, res = paldisk.load_disk(dev_name, 'cache',
                                           pool_id_to_info[pool_id].pool_name)
                if e:
                    logger.run.error("Load cache disk faild %s:%s" %
                                     (dev_name, res))
                continue
            # load所有target需要load的盘, 仅load target对应的pool是loading状态的target
            if pool_id not in loading_pal_pools_id:
                logger.run.info("Skip load disk %s by not loading pool %s" %
                                (dev_name, pool_id))
                continue
            logger.run.info("Auto load cache disk %s" % dev_name)
            e, res = paldisk.load_disk(dev_name)
            if e:
                logger.run.error("Load cache disk faild %s:%s" %
                                 (dev_name, res))

        for todo_info in todo_load_raw_disk:
            dev_name = todo_info['dev_name']
            logger.run.info("Auto load raw disk %s" % dev_name)
            e, res = paldisk.load_disk(dev_name)
            if e:
                logger.run.error("Load raw disk faild %s:%s" % (dev_name, res))
        return self.SyncPoolDirtyThresh()
示例#6
0
    def add_lun_with_palraw(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        target_name = str(params['target_name'])
        disk_id     = params['disk_id']
        disk_part   = params['disk_part']

        # 首先检查数据盘是否存在
        part = common.GetPartInfo(disk_id, disk_part)
        if part == None:
            rc.retcode = msg_ios.RC_IOS_DISKPART_NOT_EXIST
            rc.message = "part %s,%s not exist" % (disk_id, disk_part)
            return rc, ''

        if params['keep_res'] == True:
            # 检查target是否存在
            e, target_list = apipal.Target().get_target_list()
            if e or target_name not in [target.name() for target in target_list]:
                err_msg="Cann't find target %s, dev:%s, res:%s"%(target_name, part['DEVNAME'], target_list)
                logger.run.error(err_msg)
                rc.retcode = msg_ios.RC_IOS_PAL_TARGET_IS_INVALID
                rc.message = "PAL-Target %s is invalid" % (target_name)
                return rc, ''
            return rc, {'DEVNAME':os.path.join("/dev", target_name)}
        else:
            # 添加磁盘
            e, res = apipal.Disk().add_disk(part['DEVNAME'], False)
            if e:
                if res.find("already added in PAL") != -1:
                    e, res = apipal.Disk().del_disk(part['DEVNAME'])
                    if e:
                        rc.retcode = msg_ios.RC_IOS_PAL_DISK_ADD_FAILED
                        rc.message = "pal add disk failed :%s" % res
                        return rc, ''
                    e, res = apipal.Disk().add_disk(part['DEVNAME'], False)
                    if e:
                        rc.retcode = msg_ios.RC_IOS_PAL_DISK_ADD_FAILED
                        rc.message = "pal add disk failed  :%s" % res
                        return rc, ''
                else:
                    rc.retcode = msg_ios.RC_IOS_PAL_DISK_ADD_FAILED
                    rc.message = "pal add disk failed  :%s" % res
                    return rc, ''
            # 创建target 
            e, res = apipal.Target().add_target_palraw(target_name, part['DEVNAME'])
            if e:
                if res.find("target already exists") != -1:
                    e, res = apipal.Target().del_target(target_name)
                    if e:
                        rc.retcode = msg_ios.RC_IOS_PAL_TARGET_ADD_FAILED
                        rc.message = "pal add target failed :%s" % res
                        return rc, ''
                    time.sleep(2)
                    e, res = apipal.Target().add_target_palraw(target_name, part['DEVNAME'])
                    if e:
                        rc.retcode = msg_ios.RC_IOS_PAL_TARGET_ADD_FAILED
                        rc.message = "pal add target failed  :%s" % res
                        return rc, ''
                else:
                    rc.retcode = msg_ios.RC_IOS_PAL_TARGET_ADD_FAILED
                    rc.message = "pal add target failed  :%s" % res
                    return rc, ''
            # 补充pal的pal-id, 和target-id
            e, target_list = apipal.Target().get_target_list()
            if e:
                rc.retcode = msg_ios.RC_IOS_PAL_TARGET_LIST_FAILED
                rc.message = "Get target list failed:%s" % target_list
                return rc, ''
            target_pal_id = None
            target_id     = None
            for target in target_list:
                if str(target.name()) == str(target_name):
                    target_pal_id = target.id()
                    target_id     = str(target.uuid())
                    break
            if target_pal_id == None or target_id == None:
                rc.retcode = msg_ios.RC_IOS_GET_TARGET_ID_FAILED
                rc.message = "Get target id failed"
                return rc, ''
            return rc, {'DEVNAME':os.path.join("/dev", target_name), 'target_pal_id':target_pal_id, 'target_id':target_id}
示例#7
0
    def add_lun_with_cache(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        smartcache_id   = params['smartcache_id']
        data_disk_id    = params['data_disk_id']
        data_disk_part  = params['data_disk_part']
        cache_disk_id   = params['cache_disk_id']
        cache_disk_part = params['cache_disk_part']

        # 数据盘信息
        data_part = common.GetPartInfo(data_disk_id, data_disk_part)
        if data_part == None:
            rc.retcode = msg_ios.RC_IOS_DISKPART_NOT_EXIST
            rc.message = "part %s,%s not exist" % (data_disk_id, data_disk_part)
            return rc, ''

        # cache盘信息
        cache_part = common.GetPartInfo(cache_disk_id, cache_disk_part)
        if cache_part == None:
            rc.retcode = msg_ios.RC_IOS_DISKPART_NOT_EXIST
            rc.message = "part %s,%s not exist" % (data_disk_id, data_disk_part)
            return rc, ''

        if params['keep_res'] == True:
            e, smartcache_list = APISmartCache().list()
            if e or smartcache_id not in smartcache_list:
                err_msg="Cann't find sc %s, dev:%s, cache:%s, res:%s"%(smartcache_id,data_part['DEVNAME'],cache_part['DEVNAME'],smartcache_list)
                logger.run.error(err_msg)
                rc.retcode = msg_ios.RC_IOS_SMARTCACHE_IS_INVALID
                rc.message = "Smartcache %s is invalid" % (smartcache_id)
                return rc, ''
        else:
            # 检查数据盘和cache盘是否有属于某个在线的dm设备,如果有,则先卸载
            e, smartcache_list = APISmartCache().list()
            if not e:
                for s_id in smartcache_list.keys():
                    e, smartcache_info = APISmartCache().info({"cache_name":s_id})
                    if e: continue
                    if smartcache_info['data_dev'] == data_part['DEVNAME'] or smartcache_info['cache_dev'] == cache_part['DEVNAME']:
                        logger.run.info("Dm remove smartcache %s" % s_id)
                        APISmartCache().dm_remove({"cache_name":s_id})

            # 无论磁盘是否真的做过smartcache,都先清除下磁盘的smartcache-supperblock
            APISmartCache().destroy({"cache_dev":data_part['DEVNAME']})
            APISmartCache().destroy({"cache_dev":cache_part['DEVNAME']})

            # 绑定smartcache
            e, res = APISmartCache().create({'cache_name':smartcache_id, 'data_dev':data_part['DEVNAME'], 'cache_dev':cache_part['DEVNAME']})
            if e:
                err_msg="Create smartcache failed %s, dev:%s, cache:%s, msg:%s"%(smartcache_id, data_part['DEVNAME'], cache_part['DEVNAME'], res)
                logger.run.error(err_msg)
                rc.retcode = msg_ios.RC_IOS_CREATE_SMARTCACHE_FAILED
                rc.message = "Create smartcache failed"
                return rc, ''

        # 获取创建出来的cache信息
        e, part = APISmartCache().info({'cache_name':smartcache_id})
        if e:
            logger.run.error("Get smartcache info:%s failed" % smartcache_id)
            rc.retcode = msg_ios.RC_IOS_LIST_SMARTCACHE_FAILED
            rc.message = "Get smartcache info failed"
            return rc, ''
        return rc, {'DEVNAME':part['DEVNAME']}