Exemplo n.º 1
0
    def online_asmdisk(self, params={}):
        rc = msg_pds.ResponseCode()

        ret, dbs = asm.get_grid_env()
        if ret:
            logger.run.error("Parse oratab env failed: %s" % dbs)
            rc.retcode = msg_mds.RC_MDS_GET_GRID_ENV_FAILED
            return rc, None

        if dbs.has_key("grid_home"):
            grid_home = dbs["grid_home"]
        else:
            logger.run.error("Can not find Oracle grid home")
            rc.retcode = msg_mds.RC_MDS_GET_GRID_ENV_FAILED
            return rc, None

        sql = AsmOraSQLPlus(grid_home)
        if self.asmdisk_name:
            ret, result = sql.online_asm_disk(self.diskgroup_name,
                                              self.asmdisk_name)
        else:
            ret, result = sql.online_asm_disk(self.diskgroup_name,
                                              failgroup=self.failgroup)
        if ret:
            logger.run.error("ASMDisk online failed: %s" % result)
            rc.retcode = msg_mds.RC_MDS_ASMDISK_ONLINE_FAILED
            return rc, None

        logger.run.info("ASMDisk %s online success" % self.asmdisk_name)
        rc.retcode = msg_pds.RC_SUCCESS
        return rc, None
Exemplo n.º 2
0
    def get_slot_list(self, params={}):
        rc = msg_pds.ResponseCode()

        # 获取槽位、bus address列表
        ret, slot_address = self.get_slot_address()
        if ret:
            rc.retcode = msg_ios.RC_IOS_GET_SLOT_LIST_FAILED
            rc.message = "Get slot list failed: %s" % slot_address
            return rc, None

        # 分别获取宝存卡、镁光ssd设备名、raid卡、华为nvme和对应的bus address
        ret1, address_device_shannon = self.get_shannon_address_device()
        ret2, address_device_micron = self.get_micron_address_device()
        ret3, address_device_raid = self.get_raid_address_device()
        ret4, address_device_huawei = self.get_huawei_address_device()

        slot_list = []
        for slot, address in slot_address.items():
            slot_info = msg_pds.SlotInfo()
            slot_info.slot_id = slot
            slot_info.bus_address = address
            if not ret1 and address in address_device_shannon:
                slot_info.dev_name = address_device_shannon[address]
            if not ret2 and address in address_device_micron:
                slot_info.dev_name = address_device_micron[address]
            if not ret3 and address in address_device_raid:
                slot_info.dev_name = address_device_raid[address]
            if not ret4 and address in address_device_huawei:
                slot_info.dev_name = address_device_huawei[address]

            slot_list.append(slot_info)

        return rc, slot_list
Exemplo n.º 3
0
    def Entry_LunActive(self, response):
        rc = msg_pds.ResponseCode()
        if response.rc.retcode != msg_pds.RC_SUCCESS:
            # 向另外的计算节点发送请求,全部失败才返回
            if self.request_num < len(self.database_node_list):
                self.request_num += 1
                return self.send_asm_request()
            else:
                if self.lun_info.asm_status == "OFFLINE":
                    logger.run.error(response.rc.message)
                    rc.retcode = response.rc.retcode
                    return rc, None
                else:
                    self.response.rc.CopyFrom(response.rc)
                    self.SendResponse(self.response)
                    return MS_FINISH
        else:
            # 有一个请求成功则直接返回
            if self.lun_info.asm_status == "OFFLINE":
                logger.run.info("Lun %s active success" %
                                self.request_body.lun_name)
                rc.retcode = msg_pds.RC_SUCCESS
                return rc, None

            self.response.rc.retcode = msg_pds.RC_SUCCESS
            self.SendResponse(self.response)
            return MS_FINISH
Exemplo n.º 4
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, ''
Exemplo n.º 5
0
 def Entry_LunOffline(self, response):
     rc = msg_pds.ResponseCode()
     if response.rc.retcode != msg_pds.RC_SUCCESS:
         logger.run.error(response.rc.message)
         rc.retcode = response.rc.retcode
         return rc, None
     
     return self.drop_lun()
Exemplo n.º 6
0
    def add_lun_with_basedev(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        if not os.path.exists(params['dev_name']):
            rc.retcode = msg_ios.RC_IOS_DEV_NOT_EXIST
            rc.message = "Device %s not exist" % params['dev_name']
            return rc, ''
        return rc, {'DEVNAME':params['dev_name']}
Exemplo n.º 7
0
    def add_lun_with_palpmt(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        target_name = str(params['target_name'])
        pool_name   = params['pool_name']
        size        = params['size']

        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, res:%s"%(target_name, 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:
            # 创建target 
            e, res = apipal.Target().add_target_palpmt(target_name, pool_name, size)
            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_palpmt(target_name, pool_name, size)
                    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}
Exemplo n.º 8
0
    def Entry_LunOnline(self, response):
        rc = msg_pds.ResponseCode()
        if response.rc.retcode != msg_pds.RC_SUCCESS:
            logger.run.error(response.rc.message)
            rc.retcode = response.rc.retcode
            return rc, None

        self.LongWork(self.active_lun, {})

        rc.retcode = msg_pds.RC_SUCCESS
        return rc, None
Exemplo n.º 9
0
 def Entry_LunDrop(self, response):
     if response.rc.retcode != msg_pds.RC_SUCCESS:
         if self.lun_info.asm_status == "ACTIVE":
             rc = msg_pds.ResponseCode()
             logger.run.error(response.rc.message)
             rc.retcode = response.rc.retcode
             return rc, None
         else:
             self.response.rc.CopyFrom(response.rc)
             self.SendResponse(self.response)
             return MS_FINISH
     return self.LunDropMetaData()
Exemplo n.º 10
0
    def check_disk_available(self, disk_part_name):
        # disk_part_name : hdNpM
        rc = msg_pds.ResponseCode()
        if len(disk_part_name.split('p')) != 2:
            rc.retcode = msg_mds.RC_MDS_ERROR_PARAMS
            rc.message = "Disk name '%s' is not legal, please use 'hdNpM'" % disk_part_name
            return rc, None

        disk_part = disk_part_name.split('p')[1]
        disk_name = disk_part_name.split('p')[0]
        if not disk_part.isdigit():
            rc.retcode = msg_mds.RC_MDS_ERROR_PARAMS
            rc.message = "Disk name '%s' is not legal" % disk_part_name
            return rc, None
        disk_part = int(disk_part)

        # 检查磁盘是否存在
        disk_info = common.GetDiskInfoByName(disk_name)
        if disk_info == None:
            rc.retcode = msg_mds.RC_MDS_DISK_NOT_EXIST
            rc.message = "Disk '%s' is not exist" % disk_name
            return rc, None

        # 检查分区是否存在
        if len([
                diskpart for diskpart in disk_info.diskparts
                if diskpart.disk_part == disk_part
        ]) == 0:
            rc.retcode = msg_mds.RC_MDS_DISK_PART_NOT_EXIST
            rc.message = "Disk %s's part %s is not exist" % (disk_name,
                                                             disk_part)
            return rc, None

        # 检查磁盘分区是否有被POOL使用过
        pool_info = common.GetPoolInfoByDiskPart(disk_info.header.uuid,
                                                 disk_part)
        if pool_info != None:
            rc.retcode = msg_mds.RC_MDS_DISK_PART_IS_IN_USED
            rc.message = "Disk '%s' is used by Pool:'%s'" % (
                disk_part_name, pool_info.pool_name)
            return rc, None

        # 检查磁盘是否已经创建过lun
        lun_info = common.GetLunInfoByDiskPart(disk_info.header.uuid,
                                               disk_part)
        if lun_info != None:
            rc.retcode = msg_mds.RC_MDS_DISK_PART_IS_IN_USED
            rc.message = "Disk '%s' is used by Lun:'%s'" % (disk_part_name,
                                                            lun_info.lun_name)
            return rc, None

        rc.retcode = msg_pds.RC_SUCCESS
        return rc, disk_info
Exemplo n.º 11
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']}
Exemplo n.º 12
0
    def rescan_scsi_bus(self, params):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS

        # 如果有扫描进程, 则不再扫描
        e, out = command(
            "/usr/bin/ps -elf | grep smartstore_srp_rescan_scsi_bus.sh | grep -v grep"
        )
        if out.find("smartstore_srp_rescan_scsi_bus") != -1:
            return rc, None

        command("/usr/bin/smartstore_srp_rescan_scsi_bus.sh --offline")
        command("/usr/bin/smartstore_srp_rescan_scsi_bus.sh --online")

        return rc, None
Exemplo n.º 13
0
    def check_pool_available(self, pool_name):
        # pool_name : pool01
        rc = msg_pds.ResponseCode()
        # 检查pool是否存在
        pool_info = common.GetPoolInfoByName(pool_name)
        if pool_info == None:
            rc.retcode = msg_mds.RC_MDS_POOL_NOT_EXIST
            rc.message = "Pool '%s' is not exist" % pool_name
            return rc, None
        # 检查pool是否在线
        if pool_info.actual_state == False:
            rc.retcode = msg_mds.RC_MDS_POOL_NOT_AVAILABLE
            rc.message = "Pool %s is not available" % pool_name
            return rc, None

        rc.retcode = msg_pds.RC_SUCCESS
        return rc, pool_info
Exemplo n.º 14
0
    def rebalance_wait(self, params={}):
        rc = msg_pds.ResponseCode()
        while True:
            time.sleep(1)
            lun_info = common.GetLunInfoByName(self.lun_name)
            if lun_info.asm_status != "DROPPING":
                break

        if lun_info.asm_status == "HUNG":
            logger.run.error("Lun drop faild: asm drop filed because disk space not enough")
            rc.retcode = msg_mds.RC_MDS_LUN_DROP_FAILED
            return rc, None
        
        self.LongWork(self.offline_lun, {})

        rc.retcode = msg_pds.RC_SUCCESS
        return rc, None
Exemplo n.º 15
0
    def active_lun(self, params={}):
        rc = msg_pds.ResponseCode()

        time.sleep(5)
        lun_info = common.GetLunInfoByName(self.lun_name)
        if lun_info.asm_status != "INACTIVE":
            logger.run.error(
                "[Lun Active] lun %s online success, but active failed! because it not in asm group."
                % self.request_body.lun_name)
            rc.retcode = msg_mds.RC_MDS_LUN_ACTIVE_NOT_ALLOWED
            return rc, None

        self.mds_database_request = MakeRequest(msg_mds.ASMDISK_ONLINE_REQUEST)
        asmdisk_info = common.GetASMDiskInfoByLunName(
            self.request_body.lun_name)
        self.mds_database_request.body.Extensions[
            msg_mds.asmdisk_online_request].asmdisk_name = asmdisk_info.dskname

        # 先向第一个计算节点发送请求
        self.request_num = 1
        return self.send_asm_request()
Exemplo n.º 16
0
    def send_broadcast(self, params={}):
        rc = msg_pds.ResponseCode()
        rc.retcode = msg_pds.RC_SUCCESS
        ncard = config.safe_get('model-config', 'discover-ncard')
        nip = common.get_ip_address(ncard)
        if nip == None:
            logger.run.error("Can't get ip from :%s" % ncard)
            return rc, []
        data = {"action": "discover", "broadcast_version": g.broadcast_version}
        smartmon_ip = config.safe_get('network', 'listen-ip')
        if g.is_smartmon == True:
            data.update({"smartmon_ip": smartmon_ip})
        data = json.dumps(data)
        data = struct.pack('I', len(data)) + data
        host = "%s.0" % ".".join(nip.split(".")[:3])
        desc = (host, config.safe_get_int('model-config', 'discover-port'))
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.settimeout(2)
        sock.sendto(data, desc)

        data_nsnode = []
        try:
            data = ""
            while True:
                data += sock.recv(1024)
                if len(data) >= (pkSize +
                                 struct.unpack('I', data[:pkSize])[0]):
                    _data = data[pkSize:pkSize +
                                 struct.unpack('I', data[:pkSize])[0]]
                    data_nsnode.append(_data)
                    data = data[pkSize + struct.unpack('I', data[:pkSize])[0]:]
        except socket.timeout as e:
            pass
        sock.close()
        return rc, data_nsnode
Exemplo n.º 17
0
    def recv_file_and_storage(self, request_body):
        rc = msg_pds.ResponseCode()
        if request_body.HasField(
                'first_upload') and request_body.first_upload == True:
            if not os.path.isdir(g.bak_dir):
                os.makedirs(g.bak_dir)
            try:
                for _file in request_body.fileinfo:
                    node_name = request_body.node_name + "_" + request_body.listen_ip
                    node_dir = os.path.join(g.bak_dir, node_name)
                    if not os.path.isdir(node_dir):
                        os.mkdir(node_dir)
                    ret, version = self.get_file_verison(
                        node_dir, _file.file_name)
                    local_time = time.strftime('%Y%m%d%H',
                                               time.localtime(time.time()))
                    file_name = _file.file_name + "_" + str(
                        local_time) + "_" + str(version)
                    file_name = os.path.join(node_dir, file_name)
                    content = base64.decodestring(_file.file_content)
                    with open(file_name, 'wb') as f:
                        f.write(content)
                    f.close()
            except:
                logger.run.error("Recv upload file from %s error" %
                                 request_body.node_name)
                rc.retcode = msg_mds.RC_MDS_UPLOAD_FILE_FAIL
                return rc, None

            logger.run.info("Recv upload file from %s success" %
                            request_body.node_name)
            rc.retcode = msg_pds.RC_SUCCESS
            return rc, None

        elif request_body.HasField(
                'first_upload') and request_body.first_upload == False:
            if not os.path.isdir(g.second_bak_dir):
                os.makedirs(g.second_bak_dir)
            try:
                for _file in request_body.fileinfo:
                    ret, version = self.get_file_verison(
                        g.second_bak_dir, _file.file_name)
                    local_time = time.strftime('%Y%m%d%H',
                                               time.localtime(time.time()))
                    file_name = _file.file_name + "_" + str(
                        local_time) + "_" + str(version)
                    file_name = os.path.join(g.second_bak_dir, file_name)
                    content = base64.decodestring(_file.file_content)
                    with open(file_name, 'wb') as f:
                        f.write(content)
                    f.close()
            except:
                logger.run.error("Recv second  upload file from %s error" %
                                 request_body.node_name)
                rc.retcode = msg_mds.RC_MDS_UPLOAD_FILE_FAIL
                return rc, None

            logger.run.info("Recv second upload file from %s success" %
                            request_body.node_name)
            rc.retcode = msg_pds.RC_SUCCESS
            return rc, None
Exemplo n.º 18
0
    def LunDropMetaData(self):
        rc = msg_pds.ResponseCode()
        if self.lun_info.lun_type == msg_pds.LUN_TYPE_SMARTCACHE:
            smartcache_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_smartcache].smartcache_id

            e, _ = dbservice.srv.delete("/smartcache/%s" % smartcache_id)
            if e:
                logger.run.error("Delete smartcache info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            smartcache_list = msg_mds.G_SmartCacheList()
            for smartcache_info in filter(lambda smartcache_info:smartcache_info.smartcache_id!=smartcache_id,g.smartcache_list.smartcache_infos):
                smartcache_list.smartcache_infos.add().CopyFrom(smartcache_info)
            g.smartcache_list = smartcache_list

        elif self.lun_info.lun_type == msg_pds.LUN_TYPE_BASEDISK:
            basedisk_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_basedisk].basedisk_id

            e, _ = dbservice.srv.delete("/basedisk/%s" % basedisk_id)
            if e:
                logger.run.error("Delete basedisk info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            basedisk_list = msg_mds.G_BaseDiskList()
            for basedisk_info in filter(lambda basedisk_info:basedisk_info.basedisk_id!=basedisk_id,g.basedisk_list.basedisk_infos):
                basedisk_list.basedisk_infos.add().CopyFrom(basedisk_info)
            g.basedisk_list = basedisk_list

        elif self.lun_info.lun_type == msg_pds.LUN_TYPE_BASEDEV:
            basedev_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_basedev].basedev_id

            e, _ = dbservice.srv.delete("/basedev/%s" % basedev_id)
            if e:
                logger.run.error("Delete basedev info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            basedev_list = msg_mds.G_BaseDevList()
            for basedev_info in filter(lambda basedev_info:basedev_info.basedev_id!=basedev_id,g.basedev_list.basedev_infos):
                basedev_list.basedev_infos.add().CopyFrom(basedev_info)
            g.basedev_list = basedev_list

        elif self.lun_info.lun_type == msg_pds.LUN_TYPE_PALCACHE:
            palcache_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_palcache].palcache_id

            e, _ = dbservice.srv.delete("/palcache/%s" % palcache_id)
            if e:
                logger.run.error("Delete palcache info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            palcache_list = msg_mds.G_PalCacheList()
            for palcache_info in filter(lambda palcache_info:palcache_info.palcache_id!=palcache_id,g.palcache_list.palcache_infos):
                palcache_list.palcache_infos.add().CopyFrom(palcache_info)
            g.palcache_list = palcache_list

        elif self.lun_info.lun_type == msg_pds.LUN_TYPE_PALRAW:
            palraw_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_palraw].palraw_id

            e, _ = dbservice.srv.delete("/palraw/%s" % palraw_id)
            if e:
                logger.run.error("Delete palraw info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            palraw_list = msg_mds.G_PalRawList()
            for palraw_info in filter(lambda palraw_info:palraw_info.palraw_id!=palraw_id,g.palraw_list.palraw_infos):
                palraw_list.palraw_infos.add().CopyFrom(palraw_info)
            g.palraw_list = palraw_list

        elif self.lun_info.lun_type == msg_pds.LUN_TYPE_PALPMT:
            palpmt_id = self.ios_request_body.Extensions[msg_ios.ext_lundroprequest_palpmt].palpmt_id

            e, _ = dbservice.srv.delete("/palpmt/%s" % palpmt_id)
            if e:
                logger.run.error("Delete palpmt info faild %s:%s" % (e, _))
                if self.lun_info.asm_status == "ACTIVE":
                    rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    return rc, None
                else:
                    self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                    self.response.rc.message = "Drop data failed"
                    self.SendResponse(self.response)
                    return MS_FINISH

            palpmt_list = msg_mds.G_PalPmtList()
            for palpmt_info in filter(lambda palpmt_info:palpmt_info.palpmt_id!=palpmt_id,g.palpmt_list.palpmt_infos):
                palpmt_list.palpmt_infos.add().CopyFrom(palpmt_info)
            g.palpmt_list = palpmt_list

        else:
            assert(0)

        e, _ = dbservice.srv.delete("/lun/%s" % self.lun_info.lun_id)
        if e:
            logger.run.error("Delete lun info faild %s:%s" % (e, _))
            if self.lun_info.asm_status == "ACTIVE":
                rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                return rc, None
            else:
                self.response.rc.retcode = msg_mds.RC_MDS_DELETE_DB_DATA_FAILED
                self.response.rc.message = "Drop data failed"
                self.SendResponse(self.response)
                return MS_FINISH

        # 从内存中删除该Lun
        lun_list = msg_mds.G_LunList()
        for lun_info in filter(lambda lun_info:lun_info.lun_id!=self.lun_info.lun_id,g.lun_list.lun_infos):
            lun_list.lun_infos.add().CopyFrom(lun_info)
        g.lun_list = lun_list

        if self.lun_info.asm_status == "ACTIVE":
            logger.run.info("Lun %s drop success" % self.request_body.lun_name)
            rc.retcode = msg_pds.RC_SUCCESS
            return rc, None

        self.response.body.Extensions[msg_mds.lun_drop_response].drop_success = True
        self.response.rc.retcode = msg_pds.RC_SUCCESS
        self.SendResponse(self.response)
        return MS_FINISH
Exemplo n.º 19
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}
Exemplo n.º 20
0
    def get_disk_list(self, params={}):
        todo_check_disk = []
        rc = msg_pds.ResponseCode()

        # 获取megaraid磁盘列表
        e, disk_list = MegaRaid().get_disk_list()
        if e:
            rc.retcode = msg_ios.RC_IOS_GET_DISK_LIST
            rc.message = "Get megaraid disk list failed : %s" % disk_list
            return rc, ''

        for disk in disk_list:
            raid_disk_info = msg_pds.RaidDiskInfo()
            raid_disk_info.raid_type = msg_pds.RAID_TYPE_MEGARAID
            raid_disk_info.ctl = str(disk['ctl'])
            raid_disk_info.eid = disk['eid']
            raid_disk_info.slot = disk['slot']
            raid_disk_info.drive_type = disk['drive_type']
            raid_disk_info.protocol = disk['protocol']
            raid_disk_info.pci_addr = disk['pci_addr']
            raid_disk_info.size = disk['size']
            raid_disk_info.model = disk['model']
            raid_disk_info.state = disk['state']
            if disk.has_key('dev_name') and disk['dev_name'] != "":
                raid_disk_info.dev_name = disk['dev_name']
                _disk = {}
                _disk['did'] = disk['did']
                _disk['raid_type'] = "megaraid"
                _disk['dev_name'] = disk['dev_name']
                _disk['drive_type'] = disk['drive_type']
                todo_check_disk.append(_disk)
            _raid_disk_info = self.mds_request.body.Extensions[
                msg_mds.heartbeat_disk_list_request].raid_disk_infos.add()
            _raid_disk_info.CopyFrom(raid_disk_info)

        # 获取sas2raid磁盘列表
        e, disk_list = SAS2Raid().get_disk_list()
        if e:
            rc.retcode = msg_ios.RC_IOS_GET_DISK_LIST
            rc.message = "Get sas2raid disk list failed : %s" % disk_list
            return rc, ''
        for disk in disk_list:
            raid_disk_info = msg_pds.RaidDiskInfo()
            raid_disk_info.raid_type = msg_pds.RAID_TYPE_SAS2RAID
            raid_disk_info.ctl = str(disk['ctl'])
            raid_disk_info.eid = disk['eid']
            raid_disk_info.slot = disk['slot']
            raid_disk_info.drive_type = disk['drive_type']
            raid_disk_info.protocol = disk['protocol']
            raid_disk_info.pci_addr = disk['pci_addr']
            raid_disk_info.size = disk['size']
            raid_disk_info.model = disk['model']
            raid_disk_info.state = disk['state']
            if disk.has_key('dev_name') and disk['dev_name'] != "":
                raid_disk_info.dev_name = disk['dev_name']
                _disk = {}
                _disk['raid_type'] = "sas2raid"
                _disk['did'] = None
                _disk['dev_name'] = disk['dev_name']
                _disk['drive_type'] = disk['drive_type']
                todo_check_disk.append(_disk)
            _raid_disk_info = self.mds_request.body.Extensions[
                msg_mds.heartbeat_disk_list_request].raid_disk_infos.add()
            _raid_disk_info.CopyFrom(raid_disk_info)

        # 获取hpsaraid磁盘列表
        e, disk_list = HPSARaid().get_disk_list()
        if e:
            rc.retcode = msg_ios.RC_IOS_GET_DISK_LIST
            rc.message = "Get hpsaraid disk list failed : %s" % disk_list
            return rc, ''
        Suffix = 1
        for disk in disk_list:
            raid_disk_info = msg_pds.RaidDiskInfo()
            raid_disk_info.raid_type = msg_pds.RAID_TYPE_HPSARAID
            raid_disk_info.ctl = disk['ctl']
            raid_disk_info.eid = disk['eid']
            raid_disk_info.slot = disk['slot']
            raid_disk_info.drive_type = disk['drive_type']
            raid_disk_info.protocol = disk['protocol']
            raid_disk_info.pci_addr = disk['pci_addr']
            raid_disk_info.size = disk['size']
            raid_disk_info.model = disk['model']
            raid_disk_info.state = disk['state']
            if disk.has_key('dev_name') and disk['dev_name'] != "":
                raid_disk_info.dev_name = disk['dev_name']
                # 判断是否逻辑盘符相同
                same_name = False
                for d in todo_check_disk:
                    if d['dev_name'] == disk['dev_name']:
                        same_name = True
                _disk = {}
                if same_name == True:
                    _disk['dev_name'] = "%s%s" % (disk['dev_name'], Suffix)
                    Suffix = Suffix + 1
                else:
                    _disk['dev_name'] = disk['dev_name']
                _disk['raid_type'] = "cciss"
                _disk['did'] = disk['slot'] - 1
                _disk['slot'] = disk['slot']
                _disk['drive_type'] = disk['drive_type']
                _disk['serial1'] = disk['Serial']
                todo_check_disk.append(_disk)
            _raid_disk_info = self.mds_request.body.Extensions[
                msg_mds.heartbeat_disk_list_request].raid_disk_infos.add()
            _raid_disk_info.CopyFrom(raid_disk_info)

        # 获取系统认到的磁盘列表
        e, disk_list = APIDisk().get_disk_list()
        if e:
            rc.retcode = msg_ios.RC_IOS_GET_DISK_LIST
            rc.message = "Get disk list failed : %s" % disk_list
            return rc, ''
        for disk in disk_list:
            disk_info = self.mds_request.body.Extensions[
                msg_mds.heartbeat_disk_list_request].disk_infos.add()
            if disk.has_key('DEVNAME') and disk['DEVNAME'] != "":
                if disk.has_key('drive_type') and disk['drive_type'] == "nvme":
                    _disk = {}
                    _disk['dev_name'] = disk['DEVNAME']
                    _disk['drive_type'] = disk['drive_type']
                    todo_check_disk.append(_disk)
                if disk.has_key(
                        'drive_type') and disk['drive_type'] == "df_pcie":
                    _disk = {}
                    _disk['dev_name'] = disk['DEVNAME']
                    _disk['drive_type'] = disk['drive_type']
                    todo_check_disk.append(_disk)
                disk_info.dev_name = disk['DEVNAME']
            disk_info.size = disk['SIZE']
            if disk.has_key('HEADER'):
                disk_info.header.uuid = disk['HEADER']['uuid']
            for part in disk['PARTS']:
                diskpart = disk_info.diskparts.add()
                diskpart.disk_part = int(part['INDEX'])
                diskpart.size = part['SIZE']
                diskpart.dev_name = part['DEVNAME']
        return rc, todo_check_disk
Exemplo n.º 21
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']}