示例#1
0
    def delete_single(self, request, data, project_id, muster_id, show_version_name, res_name, muster_name):
        """删除单个类型"""
        ns_id_list = data.get("namespace_list")
        category = data.get("category")
        if not (ns_id_list and category):
            raise error_codes.CheckFailed(_("参数不能为空!"))

        project_kind = request.project.kind
        category = to_bcs_res_name(project_kind, category)

        if category not in MODULE_DICT:
            raise error_codes.CheckFailed(f'category: {category} does not exist')
        # 获取要删除的实例的信息
        inst_info = self.get_instance_info(ns_id_list, [res_name], category=category)
        # 获取项目信息
        flag, project_kind = self.get_project_kind(request, project_id)
        if not flag:
            return project_kind
        with client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type="instance",
            resource=res_name,
            resource_id=res_name,
            extra=json.dumps(
                {
                    "muster_id": muster_id,
                    "show_version_name": show_version_name,
                    "res_name": res_name,
                    "category": category,
                }
            ),
            description=_("删除模板集实例"),
        ).log_delete():
            return self.delete_handler(request, inst_info, project_id, project_kind)
示例#2
0
 def get_category(self, request, kind):
     """获取类型"""
     category = request.GET.get("category")
     if kind == 1:
         if not category:
             raise error_codes.CheckFailed(_("应用类型不能为空"))
         else:
             if category not in CATEGORY_MAP:
                 raise error_codes.CheckFailed(_("类型不正确,请确认"))
             category = [CATEGORY_MAP[category]]
     else:
         category = ["application", "deployment"]
     return category
示例#3
0
 def get_filter_params(self, request, project_id):
     """获取过滤参数
     """
     cluster_type = request.GET.get("cluster_type")
     if not cluster_type or cluster_type not in CLUSTER_TYPE:
         raise error_codes.CheckFailed(_("集群类型不正确,请确认"))
     app_status = request.GET.get("app_status")
     if app_status and app_status not in APP_STATUS:
         raise error_codes.CheckFailed(_("应用状态不正确,请确认"))
     app_id = self.get_app_id(
         request, project_id, request.GET.get("app_id"), request.GET.get("app_name"))
     ns_id = self.get_namespace_id(
         request, project_id, request.GET.get("ns_id"), request.GET.get("ns_name"))
     return cluster_type, app_status, app_id, ns_id
示例#4
0
 def check_ns_with_project(self, request, project_id, ns_id, cluster_type,
                           cluster_env_map):
     """判断命名空间属于项目
     """
     resp = paas_cc.get_namespace_list(request.user.token.access_token,
                                       project_id,
                                       desire_all_data=True)
     if resp.get("code") != ErrorCode.NoError:
         raise error_codes.APIError.f(resp.get("message"))
     data = resp.get("data") or {}
     if not data.get("results"):
         raise error_codes.APIError(_("查询命名空间为空"))
     ns_list = data["results"]
     cluster_id = None
     ns_name = None
     for info in ns_list:
         if str(info["id"]) != str(ns_id):
             continue
         else:
             cluster_id = info["cluster_id"]
             ns_name = info["name"]
         if str(
                 cluster_env_map.get(
                     info["cluster_id"],
                     {}).get("cluster_env")) != str(cluster_type):
             raise error_codes.CheckFailed(_("命名空间不属于当前项目或集群"))
     return cluster_id, ns_name
示例#5
0
 def get_inst_name(self, inst_id):
     """获取实例名称
     """
     inst_info = InstanceConfig.objects.filter(id=inst_id, is_deleted=False)
     if not inst_info:
         raise error_codes.CheckFailed(_("实例不存在,请确认!"))
     return inst_info[0].name
示例#6
0
 def check_project_muster(self, project_id, muster_id):
     """判断项目和集群
     """
     if not Template.objects.filter(project_id=project_id,
                                    id=muster_id).exists():
         raise error_codes.CheckFailed(
             _("项目:{},模板集: {} 不存在!").format(project_id, muster_id))
示例#7
0
 def get_muster_name(self, muster_id):
     """获取模板名称
     """
     muster_name_list = Template.objects.filter(id=muster_id).values("name")
     if not muster_name_list:
         raise error_codes.CheckFailed(_("模板集ID: {} 不存在").format(muster_id))
     return muster_name_list[0]["name"]
示例#8
0
 def delete_all(self, request, data, project_id, muster_id, show_version_name, res_name, muster_name):
     """删除所有类型"""
     ns_id_list = data.get("namespace_list")
     id_list = data.get("id_list")
     if not (ns_id_list and id_list):
         raise error_codes.CheckFailed(_("参数不能为空!"))
     # 获取项目信息
     flag, project_kind = self.get_project_kind(request, project_id)
     if not flag:
         return project_kind
     # 获取所有模板名称
     tmpl_category_name_map = {}
     for info in id_list:
         category_name = info["id"]
         tmpl_category_name_map[category_name] = info["category"]
     # 获取要删除的实例信息
     inst_info = self.get_instance_info(ns_id_list, tmpl_category_name_map.keys())
     # instance_version_ids = [val["info"].instance_id for key, val in inst_info.items()]
     with client.ContextActivityLogClient(
         project_id=project_id,
         user=request.user.username,
         resource_type="instance",
         resource=muster_name,
         resource_id=muster_id,
         extra=json.dumps(
             {
                 "muster_id": muster_id,
                 "show_version_name": show_version_name,
                 "tmpl_category_name_map": tmpl_category_name_map,
             }
         ),
         description=_("删除模板集实例"),
     ).log_delete():
         resp = self.delete_handler(request, inst_info, project_id, project_kind)
         return resp
示例#9
0
    def get(self, request, project_id, muster_id):
        """获取命名空间
        """
        # 获取参数
        group_by = request.GET.get('group_by') or "env_type"
        category = request.GET.get("category")
        show_version_name = request.GET.get('show_version_name')
        res_name = request.GET.get('res_name')
        perm_can_use = request.GET.get('perm_can_use')
        if perm_can_use == '1':
            perm_can_use = True
        else:
            perm_can_use = False

        # 前端的category转换为后台需要的类型
        if category != 'ALL':
            project_kind = request.project.kind
            category = to_bcs_res_name(project_kind, category)

        if category != 'ALL' and category not in MODULE_DICT:
            raise error_codes.CheckFailed(
                f'category: {category} does not exist')
        # 获取被占用的ns,没有处于删除中和已删除
        ns_id_list = self.get_active_ns(muster_id, show_version_name, category,
                                        res_name)
        # 查询ns信息
        results = self.get_ns_info(request, project_id, ns_id_list)
        # 解析&排序
        cluster_env_map = self.get_cluster_env_map(request, project_id)
        results = filter(lambda x: x["id"] in ns_id_list, results)
        results = [{
            'name':
            k,
            'cluster_name':
            cluster_env_map.get(k, {}).get('cluster_name', k),
            'environment_name':
            "正式" if cluster_env_map.get(k, {}).get('cluster_env_str', '')
            == 'prod' else "测试",
            'results':
            sorted(list(v), key=lambda x: x['id'], reverse=True)
        } for k, v in groupby(sorted(results, key=lambda x: x[group_by]),
                              key=lambda x: x[group_by])]
        # ordering = [i.value for i in constants.EnvType]
        # results = sorted(results, key=lambda x: ordering.index(x['name']))
        ret_data = []
        for info in results:
            for item in (info["results"] or []):
                item["muster_id"] = muster_id
                item["environment"] = cluster_env_map.get(
                    item["cluster_id"], {}).get("cluster_env_str")
            info["results"] = self.bcs_perm_handler(request,
                                                    project_id,
                                                    info["results"],
                                                    filter_use=perm_can_use,
                                                    ns_id_flag="id",
                                                    ns_name_flag="name")
            if info["results"]:
                ret_data.append(info)
        return APIResponse({"data": ret_data})
示例#10
0
 def get_template_name(self, template_id, category):
     """获取模板名称
     """
     info = MODULE_DICT[category].objects.filter(
         id=template_id).values("name")
     if not info:
         raise error_codes.CheckFailed(
             _("模板ID: {} 不存在").format(template_id))
     return info[0]["name"]
示例#11
0
 def get_namespace_id(self, request, project_id, ns_id, ns_name):
     if ns_id:
         return ns_id
     elif ns_name:
         name_id_map = self.get_namespace_name_id(request, project_id)
         ns_id = name_id_map.get(ns_name)
         if not ns_id:
             raise error_codes.CheckFailed(_("命名空间: {} 不存在").format(ns_name))
         return ns_id
     else:
         return None
示例#12
0
 def get(self, request, project_id):
     """获取项目下的所有命名空间
     """
     # 获取过滤参数
     cluster_type, app_status, app_id, ns_id = self.get_filter_params(
         request, project_id)
     exist_app = request.GET.get("exist_app")
     # 获取项目类型
     project_kind = self.project_kind(request)
     # 获取项目下集群类型
     cluster_list, cluster_env_map = self.get_cluster_id_env(
         request, project_id)
     if not cluster_list:
         return APIResponse({"data": []})
     # 获取项目下面的namespace
     ns_list = self.get_namespace(request, project_id)
     if not ns_list:
         return APIResponse({"data": []})
     # 组装命名空间数据、命名空间ID、项目下集群信息
     ns_map, ns_id_list, cluster_id_list, ns_name_list = self.get_cluster_ns(
         ns_list, cluster_type, ns_id, cluster_env_map)
     # 匹配集群的环境
     cluster_env = {
         info["cluster_id"]: {
             'env_type': CLUSTER_ENV_MAP.get(info["environment"], "stag"),
             'name': info['name']
         }
         for info in cluster_list
     }
     inst_name = None
     if app_id:
         inst_name = self.get_inst_name(app_id)
     if project_kind == 1:
         category = request.GET.get("category")
         if not category or category not in CATEGORY_MAP.keys():
             raise error_codes.CheckFailed(_("类型不正确"))
         client = k8s_views.GetNamespace()
         ns_app, ns_inst_error_count, create_error, all_ns_inst_count = client.get(
             request, ns_id_list, category, ns_map, project_id,
             project_kind, self.get_app_deploy_with_post, inst_name,
             ns_name_list, cluster_id_list)
     else:
         client = mesos_views.GetNamespace()
         ns_app, ns_inst_error_count, create_error, all_ns_inst_count = client.get(
             request, ns_id_list, ns_map, project_id, project_kind,
             self.get_app_deploy_with_post, inst_name, ns_name_list,
             cluster_id_list)
     # 匹配数据
     self.compose_data(ns_map, cluster_env, ns_app, exist_app,
                       ns_inst_error_count, create_error, app_status,
                       all_ns_inst_count)
     ret_data = ns_map.values()
     return APIResponse({"data": ret_data})
示例#13
0
 def get_muster_id(self, project_id, muster_id, muster_name):
     """获取模板集ID
     """
     if muster_id:
         return muster_id
     elif muster_name:
         musters = Template.objects.filter(project_id=project_id, is_deleted=False)
         musters = musters.filter(name=muster_name)
         if not musters:
             raise error_codes.CheckFailed(_("模板集: {} 不存在").format(muster_name))
         return musters[0].id
     else:
         return None
示例#14
0
 def get(self, request, project_id, ns_id):
     cluster_type, app_status, app_id, filter_ns_id = self.get_filter_params(
         request, project_id)
     if filter_ns_id and str(ns_id) != str(filter_ns_id):
         return APIResponse({"data": {}})
     # 获取项目类型
     project_kind = self.project_kind(request)
     # 获取项目下集群类型
     cluster_env_map = self.get_cluster_id_env(request, project_id)
     # 检查命名空间属于项目
     cluster_id, ns_name = self.check_ns_with_project(
         request, project_id, ns_id, cluster_type, cluster_env_map)
     inst_name = None
     if app_id:
         inst_name = self.get_inst_name(app_id)
     ns_name_id = self.get_namespace_name_id(request, project_id)
     # 根据类型进行过滤数据
     if project_kind == 1:
         category = request.GET.get("category")
         if not category or category not in CATEGORY_MAP.keys():
             raise error_codes.CheckFailed(_("类型不正确"))
         client = k8s_views.GetInstances()
         ret_data = client.get(request, project_id, ns_id, category,
                               inst_name, app_status, cluster_env_map,
                               cluster_id, ns_name, ns_name_id)
     else:
         func_app = self.get_application_deploy_status
         func_deploy = self.get_application_deploy_info
         client = mesos_views.GetInstances()
         ret_data = client.get(request, project_id, ns_id, project_kind,
                               func_app, func_deploy, inst_name, app_status,
                               cluster_env_map, cluster_id, ns_name,
                               ns_name_id)
     # 拆分需要处理权限和默认权限
     auth_instance_list = []
     default_auth_instance_list = []
     for info in ret_data["instance_list"]:
         if info["from_platform"]:
             auth_instance_list.append(info)
         else:
             # info["permissions"] = {"create": True, "delete": True, "view": True, "edit": True, "use": True}
             default_auth_instance_list.append(info)
     # 添加权限
     ret_instance_list = self.bcs_perm_handler(request, project_id,
                                               auth_instance_list)
     # 针对非模板集的权限解析
     default_ret_instance_list = self.bcs_perm_handler(
         request, project_id, default_auth_instance_list, tmpl_view=False)
     ret_instance_list.extend(default_ret_instance_list)
     ret_data["instance_list"] = ret_instance_list
     return APIResponse({"data": ret_data})
示例#15
0
 def get_app_id(self, request, project_id, app_id, app_name):
     """获取应用ID
     """
     if app_id:
         return app_id
     elif app_name:
         tmpl_id_list = Template.objects.filter(project_id=project_id).values_list("id", flat=True)
         version_inst_list = VersionInstance.objects.filter(
             template_id__in=tmpl_id_list).values_list("id", flat=True)
         insts = InstanceConfig.objects.filter(name=app_name, instance_id__in=version_inst_list)
         category = request.GET.get('category')
         if category:
             category_list = self.get_category(request, request.project['kind'])
             insts = insts.filter(category__in=category_list)
         if not insts:
             raise error_codes.CheckFailed(_("应用: {} 不存在").format(app_name))
         return insts[0].id
     return None
示例#16
0
    def get_tmpl_name(self, instance_entity):
        all_tmpl_name_dict = {}
        for category, tmpl_id_list in instance_entity.items():
            # 需要单独处理 Metric, 不需要轮询Metric 的状态
            # 非标准日志采集相关的 configmap\K8sConfigMap 不需要轮询状态
            # secret 相关的也不需要轮询状态
            if category in [
                    'metric', 'configmap', 'K8sConfigMap', 'secret',
                    'K8sSecret'
            ]:
                continue

            if category not in MODULE_DICT:
                raise error_codes.CheckFailed(
                    _("类型只能为{}").format(";".join(MODULE_DICT.keys())))
            tmpl_name = MODULE_DICT[category].objects.filter(
                id__in=tmpl_id_list).values_list("name", flat=True)
            if category in all_tmpl_name_dict:
                all_tmpl_name_dict[category].extend(list(tmpl_name))
            else:
                all_tmpl_name_dict = {category: list(tmpl_name)}
        return all_tmpl_name_dict