コード例 #1
0
 def get_dctype_by_net_area_id(self, net_area_id):
     net_area_data = n_a_s.NetAreaService().get_net_area_info(net_area_id)
     datacenter_id = net_area_data['datacenter_id']
     datacenter_data = DataCenterService().get_datacenter_info(
         datacenter_id)
     dc_type = datacenter_data['dc_type']
     return dc_type
コード例 #2
0
def net_area_delete():
    net_area_ids = request.values.get('net_area_ids')
    if not net_area_ids:
        logging.error('no net_area_ids when delete net area')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR)

    net_area_ids_list = net_area_ids.split(',')
    # 操作的net area数
    all_num = len(net_area_ids_list)
    msg = None
    fail_num = 0
    for _id in net_area_ids_list:
        # 有集群和网段的都不能删除
        _hostpool_num = hostpool_s.HostPoolService(
        ).get_hostpool_nums_in_net_area(_id)
        if _hostpool_num > 0:
            logging.error('no allow to delete net area %s that has hostpool',
                          _id)
            fail_num += 1
            # 单台操作且已失败则直接跳出循环
            if all_num == 1:
                msg = '该网络区域下已分配有集群,不允许删除'
                break
            continue

        _segment_num = segment_s.SegmentService().get_segment_nums_in_net_area(
            _id)
        if _segment_num > 0:
            logging.error(
                'no allow to delete net area %s that has network segment', _id)
            fail_num += 1
            # 单台操作且已失败则直接跳出循环
            if all_num == 1:
                msg = '该网络区域下已分配有网段,不允许删除'
                break
            continue

        _ret = net_area_s.NetAreaService().delete_net_area(_id)
        if _ret <= 0:
            logging.error('db delete net area %s fail when delete net area',
                          _id)
            fail_num += 1
            continue

    # 全失败
    if fail_num == all_num:
        logging.error("delete net area all failed")
        if msg:
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR, msg=msg)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)
    # 部分成功
    if 0 < fail_num < all_num:
        logging.error("delete all %s net area part %s failed", all_num,
                      fail_num)
        return json_helper.format_api_resp(code=ErrorCode.SUCCESS_PART,
                                           msg="部分网络区域删除成功")
    return json_helper.format_api_resp(code=ErrorCode.SUCCESS)
コード例 #3
0
def datacenter_delete():
    datacenter_ids = request.values.get('datacenter_ids')
    if not datacenter_ids:
        logging.error('no datacenter_ids when delete datacenter')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR)

    datacenter_ids_list = datacenter_ids.split(',')
    # 操作的datacenter数
    all_num = len(datacenter_ids_list)
    msg = None
    fail_num = 0
    for _id in datacenter_ids_list:
        _net_area_nums = net_area_s.NetAreaService().get_net_area_nums_in_dc(
            _id)
        if _net_area_nums > 0:
            logging.error('no allow to delete datacenter %s that has net area',
                          _id)
            fail_num += 1
            # 单台操作且已失败则直接跳出循环
            if all_num == 1:
                msg = '该机房下已分配有网络区域,不允许删除'
                break
            continue

        _ret = dc_s.DataCenterService().delete_datacenter(_id)
        if _ret <= 0:
            logging.error(
                'db delete datacenter %s fail when delete datacenter', _id)
            fail_num += 1
            continue

        _dc_info = dc_s.DataCenterService().get_datacenter_info(_id)
        if not _dc_info:
            logging.error(
                'datacenter info %s is not exist in db when delete datacenter',
                _id)
            fail_num += 1
            continue

        # 把该机房的主机名增量值清空
        incre_s.clean_dc_increment_value(_dc_info['name'])

    # 全失败
    if fail_num == all_num:
        logging.error("delete datacenter all failed")
        if msg:
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR, msg=msg)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)
    # 部分成功
    if 0 < fail_num < all_num:
        logging.error("delete all %s datacenter part %s failed", all_num,
                      fail_num)
        return json_helper.format_api_resp(code=ErrorCode.SUCCESS_PART,
                                           msg="部分机房删除成功")
    return json_helper.format_api_resp(code=ErrorCode.SUCCESS)
コード例 #4
0
def ip_resource_display_to_other_platform_new():
    '''
        将kvm已有的网段展示给其他平台新接口,查询指定网段可用的ip数量
    :return:
    '''
    data_from_vishnu = request.data
    logging.info(data_from_vishnu)
    data_requset = json_helper.loads(data_from_vishnu)
    req_datacenter = data_requset['dataCenter']
    req_env = data_requset['env']
    req_net_area = data_requset['netArea']
    req_net_name = data_requset['netName']
    # 校验入参是否为空
    if not req_env or not req_net_area or not req_net_name or not req_datacenter:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail='入参有空值')

    # 查询指定环境、网络区域是否有所需网段
    ret_segment = segment_service.SegmentService().get_segment_info_bysegment(req_net_name.split('/')[0])
    if not ret_segment:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail="无法找到需要申请的网段")

    ret_net_area_info = net_area.NetAreaService().get_net_area_info(ret_segment['net_area_id'])
    if not ret_net_area_info:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail="无法找到指定网段所属网络区域信息")

    ret_datacenter_info = datacenter_service.DataCenterService().get_datacenter_info(
        ret_net_area_info['datacenter_id'])
    if not ret_datacenter_info:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail="无法找到指定机房信息")
    if req_env not in DataCenterTypeForVishnu.TYPE_DICT:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail="无法找到指定机房类型信息")
    if str(DataCenterTypeForVishnu.TYPE_DICT[req_env]) != ret_datacenter_info['dc_type']:
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.FAILED, detail="无法找到指定网络区域对应网段信息")

    # 获取可用ip
    ret_ip_available_status, ret_ip_available = ip_service.get_all_available_segment_ip(ret_segment['id'], str(
        DataCenterTypeForVishnu.TYPE_DICT[req_env]))

    if not ret_ip_available_status:
        ret_params = {
            "ip_num": 0
        }
        return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.SUCCEED, detail=ret_params)
    ret_params = {
        "ip_num": len(ret_ip_available)
    }
    return json_helper.format_api_resp_msg_to_vishnu_resource(job_status=VsJobStatus.SUCCEED, detail=ret_params)
コード例 #5
0
def ip_instance_info():
    '''
        获取IP分配给VM的详细信息
    :return:
    '''
    ip_address = request.values.get('ip_address')
    if not ip_address:
        logging.info('no ip_address when get ip info')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR)

    ip_info = ip_s.IPService().get_ip_info_by_ipaddress(ip_address)
    if not ip_info:
        logging.error('IP %s info no exist in db when get ip info', ip_address)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

    # 检查ip是否为应用vip
    vip_info = vip_s.VIPService().get_vip_by_id(ip_info['id'])
    if not vip_info:
        if ip_info['status'] != IPStatus.USED:
            logging.info('IP %s status %s is not used when get ip info',
                         ip_address, ip_info['status'])
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg="IP状态不对,不能查看IP详细信息")

        ip_instance_data = ip_s.get_instance_info_by_ip(ip_address)
        if ip_instance_data:
            instance_name = ip_instance_data.get('instance_name', None)
            datacenter_name = ip_instance_data.get('datacenter_name', None)
            net_area_name = ip_instance_data.get('net_area_name', None)
        else:
            instance_name = None
            datacenter_name = None
            net_area_name = None

        ip_data = {
            'ip_address': ip_address,
            'datacenter': datacenter_name,
            'net_area': net_area_name,
            'instance_name': instance_name,
            'gateway': ip_info['gateway_ip'],
            'netmask': ip_info['netmask'],
            'vlan': ip_info['vlan'],
            'service_id': '',
            'is_vip': '0'
        }
    else:
        segment_info = segment_s.SegmentService().get_segment_info(
            ip_info['segment_id'])
        if not segment_info:
            _msg = '无法获取IP:%s的网段信息' % ip_address
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg=_msg)

        net_area_info = net_area.NetAreaService().get_net_area_info(
            segment_info['net_area_id'])
        if not net_area_info:
            net_area_name = ''
        net_area_name = net_area_info['name']
        datacenter_info = datacenter_service.DataCenterService(
        ).get_datacenter_info(net_area_info['datacenter_id'])
        if not datacenter_info:
            datacenter_name = ''
        datacenter_name = datacenter_info['name']

        ip_data = {
            'ip_address': ip_address,
            'datacenter': datacenter_name,
            'net_area': net_area_name,
            'instance_name': '',
            'gateway': ip_info['gateway_ip'],
            'netmask': ip_info['netmask'],
            'vlan': ip_info['vlan'],
            'sys_code': vip_info['sys_code'],
            'is_vip': '1'
        }

    return json_helper.format_api_resp(code=ErrorCode.SUCCESS, data=ip_data)
コード例 #6
0
def ip_apply_from_other_platform():
    '''
        外部平台申请ip
    :return:
    '''
    data_from_vishnu = request.data
    logging.info(data_from_vishnu)
    data_requset = json_helper.loads(data_from_vishnu)
    req_datacenter = data_requset['datacenter']
    req_env = data_requset['env']
    req_net_area = data_requset['net_area']
    req_net_name = data_requset['net_name']
    cluster_id = data_requset['cluster_id']
    opuser = data_requset['opUser']
    sys_code = data_requset['sys_code']
    taskid_vs = data_requset['taskid']
    ip_count = data_requset['ipCount']
    prd_dr_ip_all_needed = data_requset['prdDrAllNeeded']  # '0'代表普通申请,'1'需要同时申请prd、dr环境的ip

    # 校验入参是否为空
    if not req_env or not req_net_area or not req_net_name or not req_datacenter:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail='empty input of env, net area information or net name '
                                                      'when apply ip')
    if not cluster_id or not opuser or not sys_code or not taskid_vs:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail='empty input of cluster_id, opuser, '
                                                      'task id or sys_code when apply ip')

    if not str(ip_count) or not str(prd_dr_ip_all_needed):
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail='empty input of ipCount or prdDrAllNeeded when apply ip')

    # 查询指定环境、网络区域是否有所需网段
    ret_segment = segment_service.SegmentService().get_segment_info_bysegment(req_net_name.split('/')[0])
    if not ret_segment:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail="无法找到需要申请的网段")

    ret_net_area_info = net_area.NetAreaService().get_net_area_info(ret_segment['net_area_id'])
    if not ret_net_area_info:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail="无法找到指定网段所属网络区域信息")

    ret_datacenter_info = datacenter_service.DataCenterService().get_datacenter_info(ret_net_area_info['datacenter_id'])
    if not ret_datacenter_info:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail="无法找到指定机房信息")
    if req_env not in DataCenterTypeForVishnu.TYPE_DICT:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail="无法找到指定机房类型信息")
    if str(DataCenterTypeForVishnu.TYPE_DICT[req_env]) != ret_datacenter_info['dc_type']:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail="无法找到指定网络区域对应网段信息")

    # 如果是申请生产或者容灾环境ip,需判断网段对应关系表中是否有记录
    if req_env == 'PRD':
        segment_dr = segment_m.SegmentMatchService().get_segment_match_info_by_prd_segment_id(
            ret_segment['id'])
        if not segment_dr:
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='指定机房、网络区域下无法找到生产网段对应的容灾网段ID')
        segment_dr_data = segment_s.SegmentService().get_segment_info(segment_dr['dr_segment_id'])
        if not segment_dr_data:
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='指定机房、网络区域下无法找到生产网段对应的容灾网段详细信息')

    elif req_env == 'DR':
        segment_prd = segment_m.SegmentMatchService().get_segment_match_info_by_dr_segment_id(
            ret_segment['id'])
        if not segment_prd:
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='指定机房、网络区域下无法找到容灾网段对应的生产网段ID')
        segment_prd_data = segment_s.SegmentService().get_segment_info(segment_prd['prd_segment_id'])
        if not segment_prd_data:
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='指定机房、网络区域下无法找到容灾网段对应的生产网段详细信息')

    # 获取IP资源,先判断是否有人也在分配IP资源,有则等待1s,时间之后再优化
    ip_lock_unused = False
    while not ip_lock_unused:
        ret_ip_lock_status = ip_l_s.IpLockService().get_ip_lock_info('ip')
        if not ret_ip_lock_status:
            logging.error('外部接口分配vip:检查IP时无法获取资源锁状态')
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='检查IP时无法获取资源锁状态')
        if ret_ip_lock_status['istraceing'] == IpLockStatus.USED:
            time.sleep(1)
        else:
            ip_lock_unused = True

    # 更新ip_lock表istraceing字段为1
    ret_ip_lock_used_status, ret_ip_lock_used_datas = __update_ip_lock_used()
    if not ret_ip_lock_used_status:
        logging.error(ret_ip_lock_used_datas)
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail=ret_ip_lock_used_datas)
    try:
        segments_data_list = []
        segments_data_list.append(ret_segment)
        # 获取可用ip
        ret_ip_datas, ret_ip_segment_datas = ip_service.get_available_ips(segments_data_list, int(ip_count), str(
            DataCenterTypeForVishnu.TYPE_DICT[req_env]))
        if not ret_ip_datas:
            ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused()
            if not ret_ip_lock_unused_status:
                logging.error(ret_ip_lock_unused_datas)
                return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                       detail=ret_ip_lock_unused_datas)
            return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                                   detail='指定机房、网络区域下无法找到%s个可用IP' % str(ip_count))

        # 标记ip为预分配
        logging.info(ret_ip_datas)
        ips_list = []
        prd_ips_list = []
        dr_ips_list = []
        ip_details = {}
        for ip in ret_ip_datas:
            update_data = {
                'status': IPStatus.USED
            }
            where_data = {
                'id': ip['id']
            }
            ret_mark_ip = ip_service.IPService().update_ip_info(update_data, where_data)
            if ret_mark_ip <= 0:
                continue

            # 录入vip信息到数据库中
            insert_vip_data = {
                'ip_id': ip['id'],
                'cluster_id': cluster_id,
                'apply_user_id': opuser,
                'sys_code': sys_code,
                'isdeleted': '0',
                'created_at': get_datetime_str()
            }
            ret_vip = vip_service.VIPService().add_vip_info(insert_vip_data)
            if ret_vip.get('row_num') <= 0:
                continue

            ip_datas = {
                'ip': ip['ip_address'],
                'vlanId': ip['vlan'],
                'subnetMask': __exchange_maskint(int(ip['netmask'])),
                'gateway': ip['gateway_ip']
            }
            ips_list.append(ip_datas)

            # 生产环境需要预分配对应容灾环境ip,容灾环境需要预分配生产环境ip
            if req_env == 'PRD':
                # 拼凑虚拟机容灾ip并预分配ip
                dr_ip = segment_dr_data['segment'].split('.')[0] + '.' + segment_dr_data['segment'].split('.')[1] + \
                        '.' + ip['ip_address'].split('.')[2] + '.' + ip['ip_address'].split('.')[3]
                dr_ip_info = ip_service.IPService().get_ip_by_ip_address(dr_ip)
                # 如果容灾环境ip未初始化,默认初始化
                if not dr_ip_info:
                    if not __init_ip(segment_dr_data, dr_ip):
                        continue
                    dr_ip_info = ip_service.IPService().get_ip_by_ip_address(dr_ip)

                if prd_dr_ip_all_needed == '1':
                    update_data = {
                        'status': IPStatus.USED
                    }
                    where_data = {
                        'id': dr_ip_info['id']
                    }
                    ret_mark_ip = ip_service.IPService().update_ip_info(update_data, where_data)
                    if ret_mark_ip <= 0:
                        continue

                    # 录入vip信息到数据库中
                    insert_vip_data = {
                        'ip_id': dr_ip_info['id'],
                        'cluster_id': cluster_id,
                        'apply_user_id': opuser,
                        'sys_code': sys_code,
                        'isdeleted': '0',
                        'created_at': get_datetime_str()
                    }
                    ret_vip = vip_service.VIPService().add_vip_info(insert_vip_data)
                    if ret_vip.get('row_num') <= 0:
                        continue
                else:
                    update_data = {
                        'status': IPStatus.PRE_ALLOCATION
                    }
                    where_data = {
                        'ip_address': dr_ip
                    }
                    ret_mark_ip = ip_service.IPService().update_ip_info(update_data, where_data)
                    if ret_mark_ip <= 0:
                        continue

                # 拼装容灾ip信息
                dr_ip_datas = {
                    'ip': dr_ip_info['ip_address'],
                    'vlanId': dr_ip_info['vlan'],
                    'subnetMask': __exchange_maskint(int(dr_ip_info['netmask'])),
                    'gateway': dr_ip_info['gateway_ip']
                }
                dr_ips_list.append(dr_ip_datas)
            elif req_env == 'DR':
                # 拼凑虚拟机生产ip并预分配ip
                prd_ip = segment_prd_data['segment'].split('.')[0] + '.' + segment_prd_data['segment'].split('.')[1] + \
                         '.' + ip['ip_address'].split('.')[2] + '.' + ip['ip_address'].split('.')[3]
                prd_ip_info = ip_service.IPService().get_ip_by_ip_address(prd_ip)
                # 如果生产环境ip未初始化,默认初始化
                if not prd_ip_info:
                    if not __init_ip(segment_prd_data, prd_ip):
                        continue
                    prd_ip_info = ip_service.IPService().get_ip_by_ip_address(prd_ip)

                if prd_dr_ip_all_needed == '1':
                    update_data = {
                        'status': IPStatus.USED
                    }
                    where_data = {
                        'id': prd_ip_info['id']
                    }
                    ret_mark_ip = ip_service.IPService().update_ip_info(update_data, where_data)
                    if ret_mark_ip <= 0:
                        continue

                    # 录入vip信息到数据库中
                    insert_vip_data = {
                        'ip_id': prd_ip_info['id'],
                        'cluster_id': cluster_id,
                        'apply_user_id': opuser,
                        'sys_code': sys_code,
                        'isdeleted': '0',
                        'created_at': get_datetime_str()
                    }
                    ret_vip = vip_service.VIPService().add_vip_info(insert_vip_data)
                    if ret_vip.get('row_num') <= 0:
                        continue
                else:
                    update_data = {
                        'status': IPStatus.PRE_ALLOCATION
                    }
                    where_data = {
                        'ip_address': prd_ip
                    }
                    ret_mark_ip = ip_service.IPService().update_ip_info(update_data, where_data)
                    if ret_mark_ip <= 0:
                        continue

                # 拼装生产ip信息
                prd_ip_datas = {
                    'ip': prd_ip_info['ip_address'],
                    'vlanId': prd_ip_info['vlan'],
                    'subnetMask': __exchange_maskint(int(prd_ip_info['netmask'])),
                    'gateway': prd_ip_info['gateway_ip']
                }
                prd_ips_list.append(prd_ip_datas)
    except Exception as e:
        _msg = '外部平台申请IP:预分配ip出现异常: distribution ip exception,err:%s'%e
        logging.error(_msg)
        ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused()
        if not ret_ip_lock_unused_status:
            logging.error(ret_ip_lock_unused_datas)
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR, msg=ret_ip_lock_unused_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR, msg=_msg)

    # 更新ip_lock表istraceing字段为0
    ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused()
    if not ret_ip_lock_unused_status:
        logging.error(ret_ip_lock_unused_datas)
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail=ret_ip_lock_unused_datas)

    if len(ips_list) <= 0:
        return json_helper.format_api_resp_msg(code=ErrorCode.SYS_ERR, job_status=VsJobStatus.FAILED,
                                               detail='指定机房、网络区域下%s个可用IP修改为预分配状态全部失败' % str(ip_count))
    elif req_env == 'PRD' and (len(ips_list) + len(dr_ips_list)) < int(ip_count) * 2:
        return json_helper.format_api_resp_msg(code=ErrorCode.SUCCESS_PART, job_status=VsJobStatus.FAILED,
                                               detail='生产环境指定机房、网络区域下%s个可用IP修改为预分配状态部分失败' % str(ip_count))
    elif req_env == 'DR' and (len(ips_list) + len(prd_ips_list)) < int(ip_count) * 2:
        return json_helper.format_api_resp_msg(code=ErrorCode.SUCCESS_PART, job_status=VsJobStatus.FAILED,
                                               detail='容灾环境指定机房、网络区域下%s个可用IP修改为预分配状态部分失败' % str(ip_count))
    elif len(ips_list) < int(ip_count):
        return json_helper.format_api_resp_msg(code=ErrorCode.SUCCESS_PART, job_status=VsJobStatus.FAILED,
                                               detail='指定机房、网络区域下%s个可用IP修改为预分配状态部分失败' % str(ip_count))
    else:
        if req_env == 'PRD':
            ip_details['prd'] = ips_list
            ip_details['dr'] = dr_ips_list
        elif req_env == 'DR':
            ip_details['dr'] = ips_list
            ip_details['prd'] = prd_ips_list
        else:
            ip_details['default'] = ips_list
        return json_helper.format_api_resp_msg(code=ErrorCode.SUCCESS, job_status=VsJobStatus.SUCCEED,
                                               detail=ip_details)
コード例 #7
0
def net_area_add():
    datacenter_id = request.values.get('datacenter_id')
    name = request.values.get('name')
    imagecache01 = request.values.get('imagecache01')
    imagecache02 = request.values.get('imagecache02')

    if not name or not datacenter_id or not imagecache01 or not imagecache02:
        logging.info('no area_name or datacenter_id when add net_area')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR)

    dc_data = dc_s.DataCenterService().get_datacenter_info(datacenter_id)
    if not dc_data:
        logging.error('datacenter %s no exist in db when add net_area',
                      datacenter_id)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

    # 同一环境下机房下的网络区域不能重名
    name_exist = net_area_s.check_name_exist_in_same_dc_type(
        name, dc_data['dc_type'])
    if name_exist:
        logging.error('name %s in dc_type %s is duplicated when add net_area',
                      name, dc_data['dc_type'])
        return json_helper.format_api_resp(code=ErrorCode.DUPLICATED_ERR,
                                           msg='同环境机房下的网络区域名不能重复,请修改网络区域名')

    # 两台imagecache不能重复
    if imagecache01 == imagecache02:
        logging.info('imagecache address duplicated')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR,
                                           msg="镜像缓存服务器地址重复")

    insert_data = {
        'datacenter_id': datacenter_id,
        'name': name,
        'displayname': name,
        'created_at': get_datetime_str(),
    }
    ret = net_area_s.NetAreaService().add_net_area(insert_data)
    if ret == -1:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

    net_area_id = ret.get('last_id')
    insert_imagecache01 = {
        "net_area_id": net_area_id,
        "imagecache_ip": imagecache01,
        "create_at": get_datetime_str()
    }
    ret = imca_s.ImageCacheService().add_imagecache_info(insert_imagecache01)
    if ret.get('row_num') <= 0:
        logging.error("add imagecache01 error, insert_data:%s",
                      str(insert_data))
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="新增cache01地址失败")

    insert_imagecache02 = {
        "net_area_id": net_area_id,
        "imagecache_ip": imagecache02,
        "create_at": get_datetime_str()
    }
    ret = imca_s.ImageCacheService().add_imagecache_info(insert_imagecache02)
    if ret.get('row_num') <= 0:
        logging.error("add imagecache02 error, insert_data:%s",
                      str(insert_data))
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="新增cache02地址失败")

    return json_helper.format_api_resp(code=ErrorCode.SUCCESS, msg="新增网络区域成功")
コード例 #8
0
def net_area_update(net_area_id):
    name = request.values.get('name')
    imagecache01 = request.values.get('imagecache01')
    imagecache02 = request.values.get('imagecache02')
    if not net_area_id or not name or not imagecache01 or not imagecache02:
        logging.error('the params is invalid when update net area')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR)

    net_area_data = net_area_s.NetAreaService().get_net_area_info(net_area_id)
    if not net_area_data:
        logging.error('net area %s is no exist in db when update net area',
                      net_area_id)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

    if net_area_data['name'] != name:
        dc_data = dc_s.DataCenterService().get_datacenter_info(
            net_area_data['datacenter_id'])
        if not dc_data:
            logging.error(
                'datacenter %s is no exist in db when update net area',
                net_area_data['datacenter_id'])
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

        # 同一环境下机房下的网络区域不能重名
        name_exist = net_area_s.check_name_exist_in_same_dc_type(
            name, dc_data['dc_type'])
        if name_exist:
            logging.error(
                'name %s in dc_type %s is duplicated when update net area',
                name, dc_data['dc_type'])
            return json_helper.format_api_resp(code=ErrorCode.DUPLICATED_ERR,
                                               msg='同环境机房下的网络区域名不能重复,请修改网络区域名')

    # 两台imagecache不能重复
    if imagecache01 == imagecache02:
        logging.info('imagecache address duplicated')
        return json_helper.format_api_resp(code=ErrorCode.PARAM_ERR,
                                           msg="镜像缓存服务器地址重复")

    update_data = {
        'name': name,
        'displayname': name,
        'updated_at': get_datetime_str()
    }
    where_data = {
        'id': net_area_id,
    }
    ret = net_area_s.NetAreaService().update_net_area_info(
        update_data, where_data)
    if ret < 0:
        logging.error("update net area error, update_data:%s, where_data:%s",
                      str(update_data), str(where_data))
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR)

    imagecache_data = imca_s.ImageCacheService(
    ).get_imagecache_info_by_net_area_id(net_area_id)
    imagecache01_data = imagecache_data[0]
    imagecache02_data = imagecache_data[1]
    exist_cache_ids = [imagecache01_data['id'], imagecache02_data['id']]
    # update imagecache01
    where_data = {"id": exist_cache_ids[0]}
    update_data = {"imagecache_ip": imagecache01}
    ret = imca_s.ImageCacheService().update_imagecache_info(
        update_data, where_data)
    # update imagecache02
    where_data = {"id": exist_cache_ids[1]}
    update_data = {"imagecache_ip": imagecache02}
    ret = imca_s.ImageCacheService().update_imagecache_info(
        update_data, where_data)
    return json_helper.format_api_resp(code=ErrorCode.SUCCESS)
コード例 #9
0
def ip_apply():
    '''
        IP申请
    :return:
    '''
    req_env = request.values.get('env')
    req_net_area = request.values.get('net_area')
    req_net_name = request.values.get('segment')
    cluster_id = request.values.get('cluster_id')
    opuser = request.values.get('opUser')
    sys_code = request.values.get('sys_code')

    # 校验入参是否为空
    if not req_env or not req_net_area or not req_net_name:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="环境、网络区域、网段名输入为空")
    if not cluster_id or not opuser or not sys_code:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="物理集群、操作用户、系统编码为空输入为空")

    # 查询指定环境、网络区域是否有所需网段
    ret_segment = segment_service.SegmentService().get_segment_info_bysegment(
        req_net_name)
    if not ret_segment:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="无法找到需要申请的网段")

    ret_net_area_info = net_area.NetAreaService().get_net_area_info(
        ret_segment['net_area_id'])
    if not ret_net_area_info:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="无法找到指定网络区域信息")
    ret_datacenter_info = datacenter_service.DataCenterService(
    ).get_datacenter_info(ret_net_area_info['datacenter_id'])
    if not ret_datacenter_info:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="无法找到指定机房信息")
    if req_env not in DataCenterTypeForVishnu.TYPE_DICT:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="无法找到指定机房类型信息")
    if str(DataCenterTypeForVishnu.TYPE_DICT[req_env]
           ) != ret_datacenter_info['dc_type']:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="无法找到指定网络区域对应网段信息")

    # 获取IP资源,先判断是否有人也在分配IP资源,有则等待1s,时间之后再优化
    ip_lock_unused = False
    while not ip_lock_unused:
        ret_ip_lock_status = ip_l_s.IpLockService().get_ip_lock_info('ip')
        if not ret_ip_lock_status:
            logging.error('kvm平台分配vip:检查IP时无法获取资源锁状态')
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg='检查IP时无法获取资源锁状态')
        if ret_ip_lock_status['istraceing'] == IpLockStatus.USED:
            time.sleep(1)
        else:
            ip_lock_unused = True

    # 更新ip_lock表istraceing字段为1
    ret_ip_lock_used_status, ret_ip_lock_used_datas = __update_ip_lock_used()
    if not ret_ip_lock_used_status:
        logging.error(ret_ip_lock_used_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg=ret_ip_lock_used_datas)
    # 获取可用ip
    try:
        ret_ip_available_status, ret_ip_available = ip_service.get_available_segment_ip(
            ret_segment['id'], str(DataCenterTypeForVishnu.TYPE_DICT[req_env]))
    except Exception as e:
        _msg = 'IP申请ip_apply:获取指定网段可用ip出现异常 : get segment available ip exception when ip apply,err:%s' % e
        logging.error(_msg)
        ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused(
        )
        if not ret_ip_lock_unused_status:
            logging.error(ret_ip_lock_unused_datas)
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg=ret_ip_lock_unused_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR, msg=_msg)

    if not ret_ip_available_status:
        ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused(
        )
        if not ret_ip_lock_unused_status:
            logging.error(ret_ip_lock_unused_datas)
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg=ret_ip_lock_unused_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="指定网段没有可用ip")

    # 标记ip已使用
    update_data = {'status': IPStatus.USED}
    where_data = {'id': ret_ip_available['id']}
    ret_mark_ip = ip_service.IPService().update_ip_info(
        update_data, where_data)
    if ret_mark_ip <= 0:
        ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused(
        )
        if not ret_ip_lock_unused_status:
            logging.error(ret_ip_lock_unused_datas)
            return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                               msg=ret_ip_lock_unused_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="标记ip为已使用状态失败,请重新申请")

    # 更新ip_lock表istraceing字段为0
    ret_ip_lock_unused_status, ret_ip_lock_unused_datas = __update_ip_lock_unused(
    )
    if not ret_ip_lock_unused_status:
        logging.error(ret_ip_lock_unused_datas)
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg=ret_ip_lock_unused_datas)

    # 录入vip信息到数据库中
    insert_vip_data = {
        'ip_id': ret_ip_available['id'],
        'cluster_id': cluster_id,
        'apply_user_id': opuser,
        'sys_code': sys_code,
        'isdeleted': '0',
        'created_at': get_datetime_str()
    }
    ret_vip = vip_service.VIPService().add_vip_info(insert_vip_data)
    if ret_vip.get('row_num') <= 0:
        return json_helper.format_api_resp(code=ErrorCode.SYS_ERR,
                                           msg="录入ip信息失败,请联系系统管理员")

    ip_msg = {"vip": ret_ip_available['ip_address']}

    return json_helper.format_api_resp(code=ErrorCode.SUCCESS, data=ip_msg)