Esempio n. 1
0
def update_disk_backup_time(disk_id, logger):
    try:
        disk_ins = DisksModel.get_disk_by_id(disk_id=disk_id)
        disk_ins.backup_time = int(
            time.mktime(datetime.datetime.utcnow().timetuple()))
        disk_ins.save()
    except Exception as exp:
        logger.error("errors occur while save the last backup "
                     "time to disk table, %s" % str(exp))
Esempio n. 2
0
def restore_disk_backup(payload):
    resource_id = payload.pop("resource_id", None)
    backup_id = payload.pop("backup_id")
    action = payload.pop("action")
    version = payload.pop("version")
    backup_info = DiskBackupModel.get_backup_by_id(backup_id=backup_id)
    backup_uuid = backup_info.uuid

    if resource_id is not None:
        try:
            resource_uuid = DisksModel.get_disk_by_id(disk_id=resource_id).uuid
        except Exception:
            error_info = "cannot find disk with disk_id " + resource_id
            return console_response(BackupErrorCode.RESTORE_RESOURCE_NOT_FOUND,
                                    error_info)
    else:
        payload.update({
            "action": "DescribeDiskBackup",
            "backup_id": backup_uuid
        })
        # resp = api.get(payload=payload, timeout=10)
        resp = api.get(payload=payload)
        if resp.get("code") != 0:
            return console_response(CommonErrorCode.REQUEST_API_ERROR,
                                    resp.get("msg"))
        elif resp["data"]["total_count"] <= 0:
            return console_response(
                BackupErrorCode.ASSOCIATE_DISK_NOT_FOUND,
                "the disk related to the backup cannot "
                "be found, may be it has already "
                "been deleted")
        resource_uuid = resp["data"]["ret_set"][0]["volume_id"]
        zone_record = ZoneModel.get_zone_by_name(payload["zone"])
        resource_record = DisksModel.get_disk_by_uuid(resource_uuid,
                                                      zone_record)
        if resource_record:
            resource_id = resource_record.disk_id
    payload.update({
        "action": action,
        "version": version,
        "disk_uuid": resource_uuid,
        "backup_id": backup_uuid
    })
    # resp = api.get(payload=payload, timeout=10)
    resp = api.get(payload=payload)

    msg = resp.get("msg")
    if msg is None:
        msg = "Success"
    code = 0
    if resp.get("code") != 0:
        code = CommonErrorCode.REQUEST_API_ERROR
    # source_backup_id is for record
    return console_response(code, msg, 1, [{
        "disk_id": resource_id,
        "backup_id": backup_id
    }], {"source_backup_id": resource_id})
Esempio n. 3
0
def create_disk_backup(payload):
    _backup_name = payload.pop("backup_name")  # 用于前端展示的备份的名称
    _resource_id = payload.pop("resource_id")
    _version = payload.get("version")
    _owner = payload.get("owner")
    _zone = payload.get("zone")
    _action = payload.get("action")
    charge_mode = payload.get("charge_mode")
    backup_id = payload["name"]

    resource_uuid = DisksModel.get_disk_by_id(disk_id=_resource_id).uuid
    # 获取备份硬盘信息
    cr = get_bakcup_disk_info(payload, resource_uuid, logger)
    if cr.get("ret_code") != 0:
        return cr
    else:
        disk_resp = cr["ret_set"][0]
    disk_type = disk_resp["data"]["ret_set"][0]["volume_type"]

    payload.pop("volume_id")
    payload.update({
        "disk_uuid":
        resource_uuid,
        "action":
        _action,
        "version":
        _version,
        "description":
        disk_resp["data"]["ret_set"][0]["volume_type"]
    })

    _resp = api.get(payload=payload)
    if _resp.get("code") == 0:
        uuid = _resp["data"]["ret_set"][0]["id"]
        _inst, err = DiskBackupModel.objects.create(zone=_zone,
                                                    owner=_owner,
                                                    backup_id=backup_id,
                                                    backup_name=_backup_name,
                                                    uuid=uuid,
                                                    backup_type="disk",
                                                    disk_type=disk_type,
                                                    charge_mode=charge_mode)
        if err is not None:
            return console_response(BackupErrorCode.SAVE_BACKUP_FAILED,
                                    str(err))
        # 更新硬盘备份时间
        update_disk_backup_time(_resource_id, logger)
        # source_backup_id is added for record action
        return console_response(
            0,
            "Success",
            1, [backup_id],
            action_record={"source_backup_id": _resource_id})
    else:
        return console_response(CommonErrorCode.REQUEST_API_ERROR,
                                _resp.get("msg"))
Esempio n. 4
0
def format_payload_disks(disks):
    disk_info = {}
    device_end = ord('b')
    for disk_id in disks:
        device_end += 1
        disk_inst = DisksModel.get_disk_by_id(disk_id)
        if disk_inst:
            device = "vd" + chr(device_end)
            disk_info[device] = disk_inst.uuid
    return disk_info
Esempio n. 5
0
def waiting_disk_creating_and_restore(payload):
    disk_id = payload.pop("disk_id")
    backup_id = payload.pop("backup_id")
    version = payload.pop("version")

    disk_uuid = DisksModel.get_disk_by_id(disk_id).uuid
    # 默认尝试 每2秒查看1次,超时时间为20分钟
    try_time = 600
    create_succ = False
    while try_time > 0:
        payload.update({
            "action": "DescribeDisks",
            "version": version,
            "volume_id": disk_uuid
        })
        # describe_disk_resp = api.get(payload=payload, timeout=10)
        describe_disk_resp = api.get(payload=payload)
        if describe_disk_resp.get("code") == 0:
            status = describe_disk_resp["data"]["ret_set"][0]["status"]
            if status.strip() == 'available':
                create_succ = True
                break
            elif status.strip() == 'creating':
                if try_time > 1:
                    gevent.sleep(2)
            else:
                return console_response(DiskErrorCode.CREATE_DISK_FAILED,
                                        "create disk failed")
        else:
            if try_time > 1:
                logger("describe the status of disk failed, will try again")
                gevent.sleep(2)
        try_time -= 1
    if create_succ is True:
        logger.info(
            "create disk successfully, begin to restore from the backup")
        payload.update({
            "action": "RestoreDiskBackup",
            "backup_type": "disk",
            "resource_id": disk_id,
            "backup_id": backup_id,
            "version": version
        })

        return restore_disk_backup(payload)
    else:
        DisksModel.delete_disk(disk_id)
        logger.error("create disk failed,the billing should be deleted")
        return console_response(DiskErrorCode.CREATE_DISK_FAILED,
                                "create disk failed")
Esempio n. 6
0
def get_resource_name(device_name):
    resource_name = device_name
    if device_name.startswith("d-"):
        resource_name = DisksModel.get_disk_by_id(device_name)
    elif device_name.startswith("i-"):
        resource_name = InstancesModel.get_instance_by_id(device_name)
    elif device_name.startswith("lb-"):
        resource_name = LoadbalancerModel.get_lb_by_id(device_name)
    elif device_name.startswith("lbl-"):
        resource_name = ListenersModel.get_lbl_by_id(device_name)
    elif device_name.startswith("rds-"):
        resource_name = RdsModel.get_rds_by_id(device_name)
    if isinstance(resource_name, BaseModel):
        resource_name = resource_name.name
    return resource_name