Пример #1
0
 def get_metric_confg(self, resource_id):
     name_list = str(resource_id).split(APPLICATION_ID_SEPARATOR)
     application_id = name_list[0]
     metric_id = name_list[1]
     resourse_type = name_list[2]
     try:
         met = Metric.objects.get(id=metric_id)
     except Exception:
         raise ValidationError('Metric[id:{}]:{}'.format(
             metric_id, _("不存在")))
     api_json = met.to_api_json()
     if resourse_type == 'application':
         try:
             application = MODULE_DICT.get(resourse_type).objects.get(
                 id=application_id)
         except Exception:
             raise ValidationError('{}[id:{}]:{}'.format(
                 _("应用"), application_id, _("不存在")))
         app_config = application.get_config()
         app_config_new = handel_custom_network_mode(app_config)
         app_spec = app_config_new.get('spec', {}).get('template',
                                                       {}).get('spec', {})
         api_json['networkMode'] = app_spec.get('networkMode')
         api_json['networkType'] = app_spec.get('networkType')
     return json.dumps(api_json)
Пример #2
0
def get_all_template_info_by_project(project_id):
    # 获取项目下所有的模板信息
    # 暂时不支持YAML模板查询
    temps = Template.objects.filter(
        project_id=project_id,
        edit_mode=TemplateEditMode.PageForm.value).values('id', 'name')
    tem_dict = {tem['id']: tem['name'] for tem in temps}
    tem_ids = tem_dict.keys()

    # 获取所有的可见版本
    show_vers = ShowVersion.objects.filter(template_id__in=tem_ids).values(
        'id', 'real_version_id', 'name', 'template_id')

    resource_list = []

    for _show in show_vers:
        show_version_id = _show['id']
        real_version_id = _show['real_version_id']
        template_id = _show['template_id']
        template_name = tem_dict.get(template_id)

        # 每个版本的具体信息
        versioned_entity = VersionedEntity.objects.get(template_id=template_id,
                                                       id=real_version_id)
        entity = versioned_entity.get_entity()
        for category in entity:
            ids = entity.get(category)
            id_list = ids.split(',') if ids else []
            res_list = MODULE_DICT.get(category).objects.filter(
                id__in=id_list).values('id', 'name', 'config')
            for resource in res_list:
                config = resource['config']
                resource_list.append({
                    'template_id':
                    template_id,
                    'template_name':
                    template_name,
                    'show_version_id':
                    show_version_id,
                    'show_version_name':
                    _show['name'],
                    'category':
                    category,
                    'category_name':
                    CATE_SHOW_NAME.get(category, category),
                    'resource_id':
                    resource['id'],
                    'resource_name':
                    resource['name'],
                    'config':
                    config
                })
    return resource_list
Пример #3
0
def get_all_template_config(project_id):
    # 暂时不支持YAML模板查询
    tem_ids = Template.objects.filter(
        project_id=project_id,
        edit_mode=TemplateEditMode.PageForm.value).values_list('id', flat=True)
    tem_ids = list(tem_ids)
    real_version_ids = ShowVersion.objects.filter(
        template_id__in=tem_ids).values_list('real_version_id', flat=True)
    real_version_ids = list(real_version_ids)
    versioned_entity = VersionedEntity.objects.filter(
        id__in=real_version_ids).values('entity', 'id')
    # 多个 show_ver 对应 一个 real_version,real_version 需要按show_ver出现的次数重复计数
    real_version_count_dict = Counter(real_version_ids)

    category_dict = {}
    for ver in versioned_entity:
        try:
            entity = json.loads(ver['entity'])
        except Exception as error:
            logger.exception('load entity error, %s, %s', ver, error)
            continue

        # 重复出现的id,需要重复添加
        count = real_version_count_dict.get(ver['id'])
        i = 0
        while i < count:
            for category in entity:
                ids = entity.get(category)
                id_list = ids.split(',') if ids else []
                id_list = [int(_id) for _id in id_list]
                if category in category_dict:
                    category_dict[category].extend(id_list)
                else:
                    category_dict[category] = id_list
            i = i + 1

    resource_list = []
    for category in category_dict:
        category_id_list = category_dict[category]
        # 统计每个id出现的次数
        category_id_count_dict = Counter(category_id_list)
        res_list = MODULE_DICT.get(category).objects.filter(
            id__in=category_id_list).values('config', 'id')
        for resource in res_list:
            # 重复出现的id,需要重复添加
            count = category_id_count_dict.get(resource['id'])
            i = 0
            while i < count:
                resource_list.append({'config': resource['config']})
                i = i + 1
    return resource_list
Пример #4
0
    def post(self, request, project_id, version_id):
        version_entity = validate_version_id(project_id,
                                             version_id,
                                             is_version_entity_retrun=True)

        project_kind = request.project.kind
        self.slz = VariableNamespaceSLZ(data=request.data,
                                        context={'project_kind': project_kind})
        self.slz.is_valid(raise_exception=True)
        slz_data = self.slz.data

        if 'instance_entity' not in slz_data:
            raise ValidationError(_("请选择要实例化的模板"))
        instance_entity = slz_data['instance_entity']

        lb_services = []
        key_list = []
        for cate in instance_entity:
            cate_data = instance_entity[cate]
            cate_id_list = [i.get('id') for i in cate_data if i.get('id')]
            # 查询这些配置文件的变量名
            for _id in cate_id_list:
                if cate in ['metric']:
                    config = self.get_metric_confg(_id)
                else:
                    try:
                        resource = MODULE_DICT.get(cate).objects.get(id=_id)
                    except Exception:
                        continue
                    config = resource.config
                search_list = check_var_by_config(config)
                key_list.extend(search_list)
                # mesos Deployment 需要再查询 Application 的配置文件
                if cate in ['deployment']:
                    deployment_app = VersionedEntity.get_application_by_deployment_id(
                        version_id, _id)
                    deployment_app_config = deployment_app.config
                    _search_list = check_var_by_config(deployment_app_config)
                    key_list.extend(_search_list)

            # mesos service 查询需要lb的列表
            if project_kind == 2 and cate == 'service':
                lb_services = version_entity.get_lb_services_by_ids(
                    cate_id_list)

        key_list = list(set(key_list))
        variable_dict = {}
        if key_list:
            # 验证变量名是否符合规范,不符合抛出异常,否则后续用 django 模板渲染变量也会抛出异常

            var_objects = Variable.objects.filter(
                Q(project_id=project_id) | Q(project_id=0))

            access_token = request.user.token.access_token
            namespace_res = paas_cc.get_namespace_list(access_token,
                                                       project_id,
                                                       limit=ALL_LIMIT)
            namespace_data = namespace_res.get('data', {}).get('results') or []
            namespace_dict = {
                str(i['id']): i['cluster_id']
                for i in namespace_data
            }

            ns_list = slz_data['namespaces'].split(
                ',') if slz_data['namespaces'] else []
            for ns_id in ns_list:
                _v_list = []
                for _key in key_list:
                    key_obj = var_objects.filter(key=_key)
                    if key_obj.exists():
                        _obj = key_obj.first()
                        # 只显示自定义变量
                        if _obj.category == 'custom':
                            cluster_id = namespace_dict.get(ns_id, 0)
                            _v_list.append({
                                "key":
                                _obj.key,
                                "name":
                                _obj.name,
                                "value":
                                _obj.get_show_value(cluster_id, ns_id)
                            })
                    else:
                        _v_list.append({
                            "key": _key,
                            "name": _key,
                            "value": ""
                        })
                variable_dict[ns_id] = _v_list
        return Response({
            "code": 0,
            "message": "OK",
            "data": {
                "lb_services": lb_services,
                "variable_dict": variable_dict
            }
        })
Пример #5
0
def init_template(project_id, project_code, project_kind, access_token,
                  username):
    """创建项目时,初始化示例模板集
    request.project.english_name
    """
    # 判断模板集是否已经创建, 如果已经创建, 删除旧模板
    exit_templates = Template.objects.filter(project_id=project_id,
                                             name=TEMPLATE_NAME)
    if exit_templates.exists():
        _delete_old_init_templates(exit_templates, project_id, project_code,
                                   access_token, username)

    template_data = {}
    if project_kind == K8S_KIND:
        template_data = K8S_TEMPLATE.get('data', {})
    elif project_kind == MESOS_KIND:
        template_data = MESOS_TEMPLATE.get('data', {})

    logger.info(
        f'init_template [begin] project_id: {project_id}, project_kind: {ClusterType.get(project_kind)}'
    )
    # 新建模板集
    init_template = Template.objects.create(
        project_id=project_id,
        name=TEMPLATE_NAME,
        desc=TEMPLATE_DESC,
        creator=username,
        updator=username,
    )

    new_entity = {}
    for cate in template_data:
        new_item_id_list = []
        data_list = template_data[cate]
        for _data in data_list:
            _save_data = {}
            for _d_key in _data:
                # 新建,忽略 id 字段
                if _d_key == 'id':
                    continue
                # 目前只有 dict、list这两类非字符格式
                _d_value = _data[_d_key]
                if isinstance(_d_value, list) or isinstance(_d_value, dict):
                    _save_data[_d_key] = json.dumps(_d_value)
                else:
                    _save_data[_d_key] = _d_value
            _ins = MODULE_DICT.get(cate).objects.create(**_save_data)
            new_item_id_list.append(str(_ins.id))
        new_entity[cate] = ','.join(new_item_id_list)

    # 新建version
    new_ver = VersionedEntity.objects.create(
        template_id=init_template.id,
        entity=json.dumps(new_entity),
        version=get_default_version(),
        creator=username,
        updator=username,
    )
    # 新建可见版本
    ShowVersion.objects.create(
        template_id=init_template.id,
        real_version_id=new_ver.id,
        name='init_version',
    )

    # 将模板集注册到权限中心
    request = RequestClass(username=username,
                           access_token=access_token,
                           project_code=project_code)
    perm = bcs_perm.Templates(request, project_id, bcs_perm.NO_RES)
    perm.register(str(init_template.id), str(init_template.name))

    logger.info(
        f'init_template [end] project_id: {project_id}, project_kind: {ClusterType.get(project_kind)}'
    )
    return