コード例 #1
0
ファイル: helper.py プロジェクト: wang-shun/console
def modify_net(payload):
    NetsModel.update_nets_model()
    net_id = payload.pop("net_id")
    net_name = payload.pop("net_name")

    payload.update({"subnet_id": net_id})
    payload.update({"name": net_name})

    # call api
    # resp = api.get(payload=payload, timeout=10)
    resp = api.post(payload=payload)

    code = resp["code"]
    msg = resp["msg"]
    api_code = resp["data"].get('ret_code', -1)
    api_status = resp['api_status']

    if code != Code.OK:
        logger.error(
            "ModifyNet error: api_ret_code (%d), api_status (%d), msg (%s)" %
            (api_code, api_status, msg))
        code = convert_api_code(api_code)
        return console_response(code=code, msg=msg)

    net_info = resp["data"]["ret_set"][0]
    net_info = filter_needed_net_info(net_info)

    return console_response(code=Code.OK,
                            msg=msg,
                            total_count=len(net_info),
                            ret_set=net_info)
コード例 #2
0
ファイル: api_calling_base.py プロジェクト: wang-shun/console
def base_post_api_calling(dataparams, params, payload, optional_params,
                          **kwargs):
    payload, kwargs = base_prepared(params, payload, optional_params, **kwargs)
    urlparams = []
    for k in dict(payload).keys():
        if k not in dataparams:
            urlparams.append(k)
    resp = api.post(payload=payload, urlparams=urlparams, **kwargs)
    return resp
コード例 #3
0
    def set_policy(cls, policy_list):
        payload = {
            "zone": "policy",
            "action": "SetPolicy",
            "policy_list": policy_list
        }
        resp = api.post(payload)

        if resp['code'] != 0:
            ret_code = AdminErrorCode.SET_POLICY_FAILED
            logger.error("set_policy failed: %s" % resp["msg"])
            return console_response(ret_code, resp["msg"])
        return console_response(resp['code'], resp["msg"])
コード例 #4
0
    def set_drs(cls, CPU, RAM, switch):
        payload = {
            "zone": "drs",
            "action": "SetDrs",
            "CPU": CPU,
            "RAM": RAM,
            "switch": switch
        }
        resp = api.post(payload)

        if resp["code"] != 0:
            ret_code = AdminErrorCode.SET_DRS_FAILED
            logger.error("set_drs failed %s" % resp["msg"])
            return console_response(ret_code, resp["msg"])
        return console_response(0, resp["msg"])
コード例 #5
0
ファイル: helper.py プロジェクト: wang-shun/console
    def get_osapi_result(payload, item_name, params):
        rs_resp = api.post(payload=payload, urlparams=params)
        logger.debug("the osapi resp for describe_screen_pm_loads is " +
                     str(rs_resp))

        if rs_resp['code'] != 0:
            return []
        rs_resp = rs_resp['data']
        if rs_resp['ret_code'] != 0:
            return []

        rs_ret_set = rs_resp['ret_set']
        if len(rs_ret_set) > 0:
            rs = rs_ret_set[0].get(item_name)
            return rs
        else:
            return []
コード例 #6
0
ファイル: helper.py プロジェクト: wang-shun/console
def get_lb_monitor_info(payload, resources):
    resource_ids = []
    resource_type = payload.get("resource_type")
    sort_method = payload("sort_method")
    if resource_type == 'loadbalancer':
        for resource in resources:
            resource_ids.append(resource['id'])
    elif resource_type == 'listener':
        for resource in resources:
            listeners = resource['statuses']['loadbalancer']['listeners']
            for listener in listeners:
                resource_ids.append(listener['id'])
    else:
        for resource in resources:
            listeners = resource['statuses']['loadbalancer']['listeners']
            for listener in listeners:
                members = listener['pools'][0]['members']
                for member in members:
                    resource_ids.append(member['id'])
    payload.update({"resource_ids": resource_ids})
    urlparams = ["resource_type", "monitor_timestamp", "format"]
    resp = api.post(payload=deepcopy(payload), urlparams=urlparams)
    logger.debug("the osapi resp for multi monitor is " + str(resp))
    code = resp.get('code', 1)
    msg = resp.get('msg', 'failed')
    if code != 0:
        code = CommonErrorCode.REQUEST_API_ERROR
    else:
        msg = "Success"
    ret_set = resp.get('data', {}).get('ret_set', [])
    new_monitor_infos = format_lb_monitor_info(ret_set, resources,
                                               resource_type,
                                               payload['items'][0])
    new_monitor_infos = sort_monitor_info_version2(new_monitor_infos,
                                                   sort_method)
    return console_response(code=code,
                            msg=msg,
                            total_count=len(new_monitor_infos),
                            ret_set=new_monitor_infos)
コード例 #7
0
ファイル: helper.py プロジェクト: wang-shun/console
def describe_screen_pmvr_rate(payload, urlparams):
    try:
        rs_resp = api.post(payload=payload, urlparams=urlparams)
        logger.debug("the osapi resp for describe_screen_pmvr_rate is " +
                     str(rs_resp))

        if rs_resp['code'] != 0:
            return []

        rs_resp = rs_resp['data']
        if rs_resp['ret_code'] != 0:
            return []

        rs_ret_set = rs_resp['ret_set']
    except Exception:
        return []

    for ret in rs_ret_set:
        ret['v_cpu'] = Decimal(ret.get('v_cpu', 0)).quantize(Decimal('0.0'))
        ret['v_mem'] = Decimal(ret.get('v_mem', 0)).quantize(Decimal('0.0'))

    num = len(rs_ret_set) if payload['num'] == 0 else payload['num']
    return rs_ret_set[0:num]
コード例 #8
0
ファイル: helper.py プロジェクト: wang-shun/console
def get_rds_monitor_info(payload, resources):
    uuid_list = []
    for resource in resources:
        uuid_list.append(resource['id'])
    payload.update({"uuid": uuid_list})
    resp = api.post(payload=deepcopy(payload))
    logger.debug("the osapi resp for multi monitor is " + str(resp))
    sort_method = payload.get("sort_method")
    code = resp.get('code', 1)
    msg = resp.get('msg', 'failed')
    if code != 0:
        code = CommonErrorCode.REQUEST_API_ERROR
    else:
        msg = "Success"
    ret_set = resp.get('data', {}).get('ret_set', [])
    timestamp = payload.get("timestamp")
    new_monitor_infos = format_rds_monitor_info(ret_set, resources,
                                                payload['item'], timestamp)
    new_monitor_infos = sort_monitor_info_version2(new_monitor_infos,
                                                   sort_method)
    return console_response(code=code,
                            msg=msg,
                            total_count=len(new_monitor_infos),
                            ret_set=new_monitor_infos)
コード例 #9
0
ファイル: helper.py プロジェクト: wang-shun/console
def create_keypairs(payload):
    """
    Create Keypairs Synchronously
    """

    count = payload.pop("count")
    name_base = payload.pop("name")
    zone = payload["zone"]
    owner = payload["owner"]

    ret_set = []
    private_keypair = {}
    succ_num = 0
    ret_code, ret_msg = 0, "succ"

    for n in xrange(count):
        _payload = deepcopy(payload)
        keypair_name = get_keypair_name(name_base, n)
        keypair_id = make_keypair_id()

        _payload.update({"name": keypair_id})  # use kp_id as keypair-name

        if _payload.get("public_key") is not None:
            url_params = deepcopy(_payload)
            url_params.pop("public_key")
            resp = api.post(_payload, urlparams=url_params.keys())  # call api
        else:
            # resp = api.get(_payload, timeout=10)
            resp = api.get(_payload)

        if resp.get("code") != 0:
            ret_code = KeypairErrorCode.CREATE_KEYPAIR_FAILED
            ret_msg = resp["msg"]
            logger.error("keypair get failed, %d, %s" %
                         (resp["code"], resp["msg"]))
            continue

        private_key = resp["data"]["ret_set"][0].get("private_key", None)
        private_keypair = {
            "keypair_id": keypair_id,
            "private_key": private_key
        }

        if not cache_private_key_file(private_keypair):
            ret_code = KeypairErrorCode.CREATE_KEYPAIR_FAILED
            ret_msg = "Save keypairs failed"
            continue

        # save to backend db
        keypair, err = KeypairsModel.save_keypair(zone=zone,
                                                  owner=owner,
                                                  name=keypair_name,
                                                  keypair_id=keypair_id)

        if err is not None:
            ret_code = KeypairErrorCode.CREATE_KEYPAIR_FAILED
            ret_msg = resp["msg"]
            logger.error("Save keypair error, %s" % str(err))
            continue

        # # make response
        # keypair_info = resp["data"]["ret_set"][0]
        # keypair_info["keypair_name"] = keypair_name
        # keypair_info["create_datetime"] = keypair.create_datetime
        # keypair_info = filter_needed_keypair_info(keypair_info)
        # keypair_info = keypair_info[0]

        ret_set.append(keypair_id)
        succ_num += 1

    return console_response(ret_code, ret_msg, succ_num, ret_set)
コード例 #10
0
def collect_virtual_machine_data(date, account, zone):
    if VirtualMachineUseRecord.objects.filter(
            zone=zone, time=date.strftime("%Y%m%d00")).exists():
        return
    vms = get_all_vms(account, zone)
    vm_ids = [
        vm["id"] for vm in vms if vm.get("OS-EXT-STS:vm_state") == "active"
    ]  # 只获取运行中的vm的数据
    db_vms = InstancesModel.objects.filter(seen_flag=1,
                                           deleted=False,
                                           zone=zone,
                                           uuid__in=vm_ids)
    vm_dict = {vm.uuid: vm for vm in db_vms}
    vm_ids = vm_dict.keys()
    items = [{'memory.usage': None}, {'cpu_util': None}]
    data_set = [{"item": items, "uuid": vm_id} for vm_id in vm_ids]
    timestamp = datetime_to_timestamp(date + timedelta(days=1))  # 接口参数是截止时间
    payload = {
        "owner": account.user.username,
        "zone": zone.name,
        "action": "ceilometer",
        "data_set": data_set,
        "data_fmt": "one_day_data",
        "timestamp": int(timestamp),
    }
    params = ["data_fmt", "timestamp"]
    res = api.post(payload, urlparams=params)
    if res["code"] != 0:
        logger.error("%scollect_virtual_machine_data: osapi return %s" %
                     (EXCEPTION_PREFIX, res))
        return []
    data = res["data"]["ret_set"]
    records = []
    date_str = date.strftime("%Y%m%d")
    for uuid, items in data.iteritems():
        vm = vm_dict[uuid]
        vm_memory_total = [vm.instance_type.memory] * 24
        vm_cpu_total = [vm.instance_type.vcpus] * 24
        vm_memory_usage_rate = list_cal(merge_value(items[0]["memory.usage"]),
                                        100,
                                        "/",
                                        null_as="return_null")
        vm_cpu_usage_rate = list_cal(merge_value(items[1]["cpu_util"]),
                                     100,
                                     "/",
                                     null_as="return_null")
        vm_memory_used = list_cal(vm_memory_total, vm_memory_usage_rate, "*")
        vm_cpu_used = list_cal(vm_cpu_total, vm_cpu_usage_rate, "*")
        vm_disk_total = [0] * 24  # TODO lack of disk data
        vm_disk_used = [0] * 24

        for hour in range(24):
            create_params = {
                "instance": vm,
                "app_system": vm.app_system,
                "time": "%s%02d" % (date_str, hour),
                "cpu_total": vm_cpu_total[hour],
                "cpu_used": vm_cpu_used[hour],
                "memory_total": vm_memory_total[hour],
                "memory_used": vm_memory_used[hour],
                "disk_total": vm_disk_total[hour],
                "disk_used": vm_disk_used[hour],
                "zone": zone,
            }
            records.append(VirtualMachineUseRecord(**create_params))
    VirtualMachineUseRecord.objects.bulk_create(records)
コード例 #11
0
ファイル: views.py プロジェクト: wang-shun/console
    def post(self, request, *args, **kwargs):
        form = SingleMonitorValidator(data=request.data)
        if not form.is_valid():
            return Response(console_response(code=90001, msg=form.errors))
        _data = form.validated_data

        ins_id = _data.get("instance_id")
        instance_record = InstancesModel.get_instance_by_id(instance_id=ins_id)
        uuid = instance_record.uuid

        _payload = Payload(
            request=request,
            action=None,
        )
        _payload = _payload.dumps()
        resp = get_resources_info(_payload, 'Instance')
        ret_code = resp.get("ret_code")
        if ret_code is None or ret_code != 0:
            return Response(resp)
        instances = resp.get("ret_set")
        instance = None
        for ins in instances:
            if ins.get("id").strip() == uuid.strip():
                instance = ins
                break
        if instance is None:
            msg = "instance with uuid " + uuid + " not found"
            return Response(
                console_response(InstanceErrorCode.INSTANCE_NOT_FOUND, msg))

        data_fmt = _data.get("data_fmt")
        item_set = request.data.get("item_set")
        timestamp = _data.get("timestamp")
        point_num = _data.get("point_num")
        standard_point_num = _data.get("standard_point_num")
        standard_point_num = False if standard_point_num else True

        timestamp = get_current_timestamp()
        if item_set is None:
            item_set = get_all_item_for_single_mintor(instance)
        item_set = dict(item_set)

        post_data_list = []
        post_data_item = {}
        name_dict = {}
        items = []

        for k, v in item_set.items():
            item_name = item_mapper.get(k)
            data_list = list(v)
            data_list, partial_name_dict = format_data_list(
                k, data_list, instance, _payload)

            name_dict.update(partial_name_dict)
            for item_data in data_list:
                item = {}
                item[item_name] = item_data
                items.append(item)
        post_data_item["uuid"] = uuid  # 主机uuid
        post_data_item["item"] = items
        post_data_list.append(post_data_item)

        data_fmt_para = data_fmt
        if data_fmt_para == "addition_time_data":
            data_fmt_para = "real_time_data"
        _payload = Payload(request=request,
                           action='ceilometer',
                           timestamp=timestamp,
                           data_fmt=data_fmt_para,
                           data_set=post_data_list)
        urlparams = ["timestamp", "data_fmt"]
        resp = api.post(payload=_payload.dumps(), urlparams=urlparams)

        code = resp.get('code', 1)
        msg = "Success"
        if resp.get("code") == 0 and resp.get("data").get("ret_code") == 0:
            resp = format_single_response(resp, name_dict, point_num, data_fmt)
            code = resp.get('code')
            msg = resp.get('msg')
        else:
            code = CommonErrorCode.REQUEST_API_ERROR
            msg = resp.get('msg')
        ret_set = resp.get('data', {}).get('ret_set', [])

        resp = console_response(code=code,
                                msg=msg,
                                total_count=len(ret_set),
                                ret_set=ret_set)
        return Response(resp)
コード例 #12
0
def create_instance_from_backup(payload):
    backup_id = payload.pop("backup_id")
    version = payload.pop("version")
    resource_name = payload.pop("resource_name")
    owner = payload.get("owner")
    zone = payload.get("zone")
    charge_mode = payload.get("charge_mode")
    pool_name = payload.pop("pool_name")
    nets = payload.pop("nets")

    image_uuid = InstanceBackupModel.get_backup_by_id(backup_id).uuid
    instance_name = resource_name

    flavor_resp = get_flavor_info_through_backup(payload, image_uuid)
    if flavor_resp.get("ret_code") != 0:
        return flavor_resp
    ins_image_info = flavor_resp["ret_set"][0]
    flavor = int(ins_image_info.get("flavor_id"))
    instance_type = InstanceTypeModel. \
        get_instance_type_by_flavor_id(str(flavor))
    if instance_type is None:
        logger.error("cannot find instance type with flavor id " + str(flavor))
        return console_response(
            BackupErrorCode.ASSOCIATE_INSTANCE_NOT_FOUND,
            "cannot find instance type with flavor" + flavor)

    instance_id = make_instance_id()

    security_group_resp = get_default_security_group(payload, logger)
    if security_group_resp.get("ret_code") != 0:
        return security_group_resp

    default_security_group_uuid = security_group_resp["ret_set"][0]

    nets_info = format_payload_nets(nets, False)

    payload.update({
        "action": "CreateInstance",
        "name": instance_id,
        "flavor": flavor,
        "version": version,
        "image": image_uuid,
        "secgroup": default_security_group_uuid,
        "net_info": nets_info,
        "availability_zone": pool_name
    })

    urlparams = [
        "name", "flavor", "image", "secgroup", "zone", "owner",
        "availability_zone"
    ]
    # resp = api.post(payload=payload, urlparams=urlparams, timeout=10)
    resp = api.post(payload=payload, urlparams=urlparams)
    if resp.get("code") != 0:
        return console_response(CommonErrorCode.REQUEST_API_ERROR,
                                resp.get("msg"))
    instance_ret = resp["data"]["ret_set"]
    if isinstance(instance_ret, list):
        instance_ret = instance_ret[0]
    instance_uuid = instance_ret.get("id")

    instance, err = InstancesModel.save_instance(
        uuid=instance_uuid,
        instance_name=instance_name,
        instance_id=instance_id,
        zone=zone,
        owner=owner,
        instance_type=instance_type.instance_type_id,
        charge_mode=charge_mode,
        backup_id=backup_id,
        seen_flag=1)
    if err is not None:
        logger.error("save instance error, %s" % str(err))
        return console_response(InstanceErrorCode.RUN_INSTANCES_FAILED,
                                str(err))

    return console_response(0, "Success", 1, [{
        "instance_id": instance_id
    }], {"resource_id": instance_id})
コード例 #13
0
def get_nets_info(addresses,
                  instance_id,
                  subnet_uuid_info,
                  ip_info,
                  zone='yz',
                  owner='root'):
    with Timer() as total_spent:
        DEBUG_INFO = '''
            get_nets_info_spent ===> {total_spent}
            DescribeNets ===> {DescribeNetsSpent}
        '''
        with Timer() as DescribeNetsSpent:
            payload = {'zone': zone, 'owner': owner, 'action': 'DescribeNets'}
            resp = api.post(payload=payload)
        if resp["code"] == 0:
            nets_model = resp["data"]["ret_set"]
        else:
            logger.error("cannot get the DescribeNets info")
            return [], 0

        nets = []
        net_count = 0
        for network_key in addresses.keys():
            network_type = "private"

            for net_address in addresses[network_key]:
                net = {}
                net["ip_address"] = net_address["addr"]
                net["ip_version"] = net_address["version"]
                mac_address = net_address["OS-EXT-IPS-MAC:mac_addr"]
                net["mac_address"] = mac_address
                net["ip_type"] = net_address.get("OS-EXT-IPS:type", "")

                try:
                    subnet_uuid = subnet_uuid_info[instance_id][
                        mac_address].get(net_address["addr"])
                except:
                    subnet_uuid = None

                subnet_inst = None
                for _ in nets_model:
                    if _["id"] == subnet_uuid:
                        subnet_inst = _
                        break
                if subnet_inst:
                    net["net_name"] = subnet_inst["name"]
                    net["net_id"] = subnet_inst["name"]
                    net["id"] = subnet_inst["id"]
                    net["gateway_ip"] = subnet_inst["gateway_ip"]
                    net["net_type"] = "public" if subnet_inst[
                        "gateway_ip"] else None
                if not net.get("net_type", None):
                    net["net_type"] = network_type
                if network_key == "base-net":
                    net["net_name"] = network_key
                    net["net_id"] = network_key

                if ip_info and net["ip_address"] in ip_info:
                    net["ip_id"] = ip_info[net["ip_address"]]["ip_id"]
                    net["ip_name"] = ip_info[net["ip_address"]]["ip_name"]

                if net["ip_type"] != "floating":
                    net_count += 1

                nets.append(net)
    logger.debug(
        DEBUG_INFO.format(total_spent=total_spent,
                          DescribeNetsSpent=DescribeNetsSpent))
    return nets, net_count
コード例 #14
0
ファイル: helper.py プロジェクト: wang-shun/console
def monitor_multi_host(payload,
                       instances,
                       call_source='console',
                       data_disk_flag=False):
    """
    monitor all hosts
    """
    item = payload.pop("item")
    # timestamp = payload.get("timestamp")
    point_num = payload.get("point_num")

    item_name = item_mapper.get(item)
    data_fmt = payload.pop("data_fmt")
    sort_method = payload.pop("sort_method", "name")
    # print sort_method

    # standard = payload.pop("standard_point_num", True)

    info_dict, name_dict = get_multi_monitor_info(instances, item, payload,
                                                  data_disk_flag)
    post_data_list = []
    instance_info_dict = {}
    for instance in instances:
        post_data_item = {}

        uuid = instance.get("id")
        instance_info_dict[uuid] = instance
        item_info_list = info_dict.get(uuid)
        items = []
        for item_info in item_info_list:
            single_item = {}
            single_item[item_name] = item_info
            items.append(single_item)
        post_data_item["uuid"] = uuid
        post_data_item["item"] = items
        post_data_list.append(post_data_item)

    # if timestamp is None:
    #     timestamp = get_timestamp(data_fmt)
    # timestamp = get_timestamp(timestamp, data_fmt)
    timestamp = get_current_timestamp()
    data_fmt_para = data_fmt
    if data_fmt == "addition_time_data":
        data_fmt_para = "real_time_data"
    payload.update({"timestamp": timestamp})
    payload.update({"data_fmt": data_fmt_para})
    payload.update({"data_set": post_data_list})

    urlparams = ["timestamp", "data_fmt"]
    # urlparams= ["data_fmt"]
    # resp = api.post(payload=payload, urlparams=urlparams, timeout=10)
    resp = api.post(payload=payload, urlparams=urlparams)
    logger.debug("the osapi resp for multi monitor is " + str(resp))
    if call_source == 'finance-monitor':
        return resp

    # resp = format_multi_response(resp, name_dict, point_num, data_fmt,
    #                              timestamp, standard, item)
    resp = format_multi_response(resp, name_dict, point_num, data_fmt, item,
                                 sort_method, instance_info_dict, call_source)

    code = resp.get('code', 1)
    msg = resp.get('msg', 'failed')
    if code != 0:
        code = CommonErrorCode.REQUEST_API_ERROR
    else:
        msg = "Success"

    ret_set = resp.get('data', {}).get('ret_set', [])
    return console_response(code=code,
                            msg=msg,
                            total_count=len(ret_set),
                            ret_set=ret_set)
コード例 #15
0
ファイル: helper.py プロジェクト: wang-shun/console
def create_net(payload):
    """
    Create net Synchronously
    """
    net_type = payload.pop("net_type")
    net_name = payload.pop("net_name")
    # is_base = payload.pop("is_base", False)
    # zone = payload["zone"]
    # owner = payload["owner"]

    # network_uuid = payload.get("network_uuid")
    # network_id = NetworksModel.get_network_by_uuid(network_uuid)

    #    net_id = make_net_id(is_base)
    payload["net_id"] = net_name
    payload = update_request_params(payload, NET_FILTER_MAP)

    # call api
    # resp = api.get(payload=payload, timeout=10)
    resp = api.post(payload=payload)
    code = resp["code"]
    msg = resp["msg"]
    # api_code = resp["data"].get('ret_code', -1)
    # api_status = resp['api_status']
    create_status = []
    if code != Code.OK:
        return console_response(code=code, msg=msg)

    net_info = resp["data"]["ret_set"][0]

    # uuid = net_info["id"]
    net_id = net_info["name"]

    # save net
    '''
    net, err = save_net(uuid=uuid,
                        net_name=net_name,
                        net_type=net_type,
                        net_id=net_id,
                        network_id=network_id,
                        zone=zone,
                        owner=owner)

    if err is not None:
        logger.error("Save net error, %s" % str(err))
        return console_response(code=ErrorCode.net.SAVE_NET_FAILED,
                                msg=msg)
    '''
    if net_type == 'vlan':
        cidr = payload.get("cidr", '').split('/')[0]
        BaseNetModel.objects.change_net_used(cidr)

    # net_info["create_datetime"] = net.create_datetime
    net_info["type"] = net_type

    net_info = filter_needed_net_info(net_info)
    create_status.append(net_info)
    action_record = {"net_id": net_id}

    return console_response(code=Code.OK,
                            msg=msg,
                            total_count=len(create_status),
                            ret_set=create_status,
                            action_record=action_record)