示例#1
0
    def _delete_show_version(self, delete_data):
        project_id = delete_data['project_id']
        template = delete_data['template']
        show_version_id = delete_data['show_version_id']
        username = delete_data['username']

        if show_version_id == '-1':
            models.Template.objects.filter(id=template.id).update(
                draft='', draft_time=None, draft_updator='', draft_version=0)
            client.ContextActivityLogClient(project_id=project_id,
                                            user=username,
                                            resource_type="template",
                                            resource=template.name,
                                            resource_id=template.id,
                                            extra='',
                                            description="删除草稿").log_modify()
        else:
            show_version = models.ShowVersion.objects.get(
                template_id=template.id, id=show_version_id)
            version_name = show_version.name
            show_version.delete()

            client.ContextActivityLogClient(
                project_id=project_id,
                user=username,
                resource_type="template",
                resource=template.name,
                resource_id=template.id,
                extra=show_version_id,
                description=f"删除版本[{version_name}]").log_modify()
示例#2
0
    def _delete_show_version(self, delete_data):
        project_id = delete_data["project_id"]
        template = delete_data["template"]
        show_version_id = delete_data["show_version_id"]
        username = delete_data["username"]

        if show_version_id == "-1":
            models.Template.objects.filter(id=template.id).update(
                draft="", draft_time=None, draft_updator="", draft_version=0
            )
            client.ContextActivityLogClient(
                project_id=project_id,
                user=username,
                resource_type="template",
                resource=template.name,
                resource_id=template.id,
                extra="",
                description=_("删除草稿"),
            ).log_modify()
        else:
            show_version = models.ShowVersion.objects.get(template_id=template.id, id=show_version_id)
            version_name = show_version.name
            show_version.delete()

            client.ContextActivityLogClient(
                project_id=project_id,
                user=username,
                resource_type="template",
                resource=template.name,
                resource_id=template.id,
                extra=show_version_id,
                description=_("删除版本[{}]").format(version_name),
            ).log_modify()
示例#3
0
    def create_release(self, release_data):
        release_result = instantiate_resources(self.access_token,
                                               self.username,
                                               release_data,
                                               project_kind=self.project_kind)

        template_name = release_data["template_name"]

        log_params = {
            "project_id":
            release_data["project_id"],
            "user":
            self.username,
            "resource_type":
            "template",
            "resource":
            template_name,
            "resource_id":
            release_data["template_id"],
            "extra":
            json.dumps({
                "variable_info": release_data["variable_info"],
                "instance_entity": release_data["instance_entity"],
                "ns_list": release_data["ns_list"],
            }),
        }

        # only one namespace
        if release_result["success"]:
            ret = release_result["success"][0]
            release_id = ret["instance_id"]
            log_params["description"] = "实例化模板集[{}]到命名空间[{}]".format(
                template_name, ret["ns_name"])
            client.ContextActivityLogClient(**log_params).log_add(
                activity_status="succeed")
            return release_id

        ret = release_result["failed"][0]
        release_id = ret["instance_id"]
        if ret["res_type"]:
            description = "实例化模板集[{template_name}]到命名空间[{namespace}]时,实例化{res_name}失败," "错误消息:{err_msg}".format(
                template_name=template_name,
                namespace=ret["ns_name"],
                res_name=ret["res_type"],
                err_msg=ret["err_msg"])
        else:
            description = "实例化模板集[{template_name}]到命名空间[{namespace}]失败,错误消息:{err_msg}".format(
                template_name=template_name,
                namespace=ret["ns_name"],
                err_msg=ret["err_msg"])

        log_params["description"] = description
        client.ContextActivityLogClient(**log_params).log_add(
            activity_status="failed")
        return release_id
示例#4
0
    def update_release(self, release_data):
        project_id = release_data["project_id"]
        namespace_id = release_data["namespace_id"]
        namespace_info = get_namespace_by_id(self.access_token, project_id,
                                             namespace_id)

        release_id = release_data["release_id"]
        log_params = {
            "project_id":
            project_id,
            "user":
            self.username,
            "resource_type":
            "instance",
            "resource":
            release_data["name"],
            "resource_id":
            release_id,
            "extra":
            json.dumps({
                "namespace": namespace_info["name"],
                "variable_info": release_data["variable_info"]
            }),
        }
        try:
            update_resources(self.access_token, self.username, release_data,
                             namespace_info)
        except Exception as e:
            log_params["description"] = f"rollupdate failed: {e}"
            client.ContextActivityLogClient(**log_params).log_modify(
                activity_status="failed")
            update_inst_params = {"ins_state": InsState.UPDATE_FAILED.value}
        else:
            log_params["description"] = f"rollupdate success"
            client.ContextActivityLogClient(**log_params).log_modify(
                activity_status="succeed")
            update_inst_params = {"ins_state": InsState.UPDATE_SUCCESS.value}

        update_inst_params.update({
            "oper_type": ROLLING_UPDATE_INSTANCE,
            "variables": release_data["variable_info"].get(namespace_id) or {}
        })

        InstanceConfig.objects.filter(
            instance_id=release_id,
            category=release_data["resource_name"],
            name=release_data["name"],
            namespace=namespace_id,
        ).update(**update_inst_params)

        return release_id
示例#5
0
 def delete(self):
     """删除节点
     1. 检查节点状态
     2. 查询容器数量
     3. 调用ops删除节点
     """
     self.check_perm()
     # 查询节点
     node_info = self.get_node_ip()
     # 检查操作
     self.check_host_removing(node_info)
     self.check_host_stop_scheduler(node_info)
     self.node_ip = node_info.get('inner_ip')
     # 检测容器是否存在
     self.check_host_exist_container()
     # 调用BCS
     with client.ContextActivityLogClient(
         project_id=self.project_id,
         user=self.username,
         resource_type=ACTIVITY_RESOURCE_TYPE,
         resource=self.node_ip,
         resource_id=self.node_id
     ).log_delete():
         # 更新状态
         self.update_nodes([self.node_ip], status=CommonStatus.Removing)
         # 删除节点上的label
         self.delete_node_labels()
         log = self.delete_node_via_bcs()
         if not log.is_finished and log.is_polling:
             log.polling_task()
     return Response({})
示例#6
0
 def update(self, request, project_id, cluster_id, namespace, name):
     namespace_id = self.get_namespace_id(request, project_id, cluster_id,
                                          namespace, name)
     # 校验查看权限
     self.can_use(request, project_id, cluster_id, namespace_id)
     config = request.data['config']
     # 下发配置
     with log_client.ContextActivityLogClient(
             project_id=project_id,
             user=request.user.username,
             resource_type='ingress',
             resource=name,
             description=_("集群:{}, 更新mesos ingress:{}").format(
                 cluster_id, name),
     ).log_modify():
         client = mesos.MesosClient(request.user.token.access_token,
                                    project_id,
                                    cluster_id,
                                    env=None)
         client.update_custom_resource(name, namespace, config)
     # 集群,命名空间,ingress确定唯一
     InstanceConfig.objects.filter(namespace=namespace_id,
                                   category='ingress',
                                   name=name,
                                   is_deleted=False).update(
                                       updator=request.user.username,
                                       updated=timezone.now(),
                                       is_bcs_success=True,
                                       config=config)
     return response.Response()
示例#7
0
    def create(self, request, project_id):
        slz = serializers.CreateCLBSLZ(data=request.data)
        slz.is_valid(raise_exception=True)
        data = slz.validated_data
        # 校验集群权限
        clb_utils.can_use_cluster(request, project_id, data['cluster_id'])

        # 通过clb_name渲染deployment
        # 替换clb中的'_'为'-', 后缀使用6位随机字符,并且长度限制为253以内,以满足后台的限制
        # resource_name包含: clb_name[:246] + '-' + random(6)
        replaced_name = data['clb_name'].replace('_', '-')
        data['resource_name'] = f'{replaced_name[:246]}-{get_random_string(6).lower()}'
        data['creator'] = data['updator'] = request.user.username
        data['project_id'] = request.project.project_id
        data['vpc_id'] = self.get_vpc_id(request, data['region'], data['clb_name'])

        # 创建并返回记录
        with client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type='lb',
            resource=data['clb_name'],
            description=_("集群:{}, 创建云lb controler").format(data['cluster_id']),
        ).log_add():
            record = CloudLoadBlancer.objects.create(data)
            data = CloudLoadBlancer.objects.parse_record(record)

        return response.Response(data)
示例#8
0
    def batch_delete(self, request, project_id):
        self.slz = serializers.VariableDeleteSLZ(data=request.GET)
        self.slz.is_valid(raise_exception=True)
        id_list = self.slz.data['id_list']

        query_sets = Variable.objects.filter(project_id=project_id,
                                             category='custom',
                                             id__in=id_list)
        name_list = query_sets.values_list('name', flat=True)
        del_id_list = list(query_sets.values_list('id', flat=True))

        deled_id_list = []
        with client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type="variable",
                resource=','.join(name_list),
                resource_id=json.dumps(del_id_list),
                description=_("删除变量")).log_delete():
            for _s in query_sets:
                # 删除后KEY添加 [deleted]前缀
                _del_prefix = '[deleted_%s]' % int(time.time())
                _s.key = "%s%s" % (_del_prefix, _s.key)
                _s.is_deleted = True
                _s.deleted_time = timezone.now()
                _s.save()
                deled_id_list.append(_s.id)
        return Response({
            "code": 0,
            "message": "OK",
            "data": {
                "deled_id_list": deled_id_list
            }
        })
示例#9
0
    def put(self, request, project_id, pk):
        """复制模板
        """
        self.request = request
        # 验证用户是否使用权限
        template = validate_template_id(project_id, pk, is_return_tempalte=True)
        perm = bcs_perm.Templates(request, project_id, pk, template.name)
        perm.can_edit(raise_exception=True)

        self.project_id = project_id
        self.pk = pk
        data = request.data
        data['project_id'] = project_id
        self.slz = TemplateCreateSLZ(data=data)
        self.slz.is_valid(raise_exception=True)
        new_template_name = self.slz.data['name']
        # 验证模板名是否已经存在
        is_exist = Template.default_objects.filter(
            name=new_template_name, project_id=project_id).exists()
        if is_exist:
            detail = {
                'field': ['{prefix_msg}[{tmpl_name}]{suffix_msg}'.format(
                    prefix_msg=_("模板集名称"),
                    tmpl_name=new_template_name,
                    suffix_msg=_("已经存在")
                )]
            }
            raise ValidationError(detail=detail)
        # 验证 old模板集id 是否正确
        old_tems = self.get_queryset()
        if not old_tems.exists():
            detail = {
                'field': [_("要复制的模板集不存在")]
            }
            raise ValidationError(detail=detail)
        old_tem = old_tems.first()

        username = request.user.username
        template_id, version_id, show_version_id = old_tem.copy_tempalte(
            project_id, new_template_name, username)
        # 注册资源到权限中心
        perm.register(template_id, new_template_name)
        # 记录操作日志
        client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type="template",
            resource=new_template_name,
            resource_id=template_id,
            description=_("复制模板集")
        ).log_add()
        return Response({
            "code": 0,
            "message": "OK",
            "data": {
                "template_id": template_id,
                "version_id": version_id,
                "show_version_id": show_version_id,
            }
        })
示例#10
0
    def create(self, request, project_id):
        """创建lb
        1. 下发service
        2. 下发deployment
        """
        slz = lb_slz.CreateOrUpdateMesosLBSLZ(data=request.data)
        slz.is_valid(raise_exception=True)
        data = slz.data

        # 保存数据,便于后续下发时,组装下发配置
        with activity_client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type="lb",
                resource=data["name"],
                extra=json.dumps(data),
        ).log_add():
            MesosLoadBalancer.objects.create(
                project_id=project_id,
                cluster_id=data["cluster_id"],
                name=data["name"],
                ip_list=json.dumps(data["ip_list"]),
                data_dict=json.dumps(data),
                status=mesos_lb_constants.MESOS_LB_STATUS.NOT_DEPLOYED.value,
                namespace=data["namespace"],
            )

        return Response()
示例#11
0
    def update_record(self, request, project_id, cluster_id, namespace, name):
        """更新执行集群+namespace+name的lb记录"""
        lb_queryset = self.get_lb_queryset(project_id, cluster_id, namespace,
                                           name)
        # 仅允许LB处于未部署状态时,才允许编辑
        if lb_queryset.first().status not in [
                mesos_lb_constants.MESOS_LB_STATUS.NOT_DEPLOYED.value,
                mesos_lb_constants.MESOS_LB_STATUS.STOPPED.value,
        ]:
            raise ValidationError(_("LB必须处于未部署状态或停用状态,当前状态不允许更新"))

        # 获取数据
        slz = lb_slz.CreateOrUpdateMesosLBSLZ(data=request.data)
        slz.is_valid(raise_exception=True)
        data = slz.data

        # 更新属性
        with activity_client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type="lb",
                resource=name,
                extra=json.dumps(data),
                description=_("更新Mesos LB, 集群: {},命名空间: {},名称: {}").format(
                    cluster_id, namespace, name),
        ).log_modify():
            lb_queryset.update(ip_list=json.dumps(data["ip_list"]),
                               data_dict=json.dumps(data))

        return Response()
示例#12
0
    def reinstall(self):
        self.ratelimit()
        # 校验集群编辑权限
        self.check_perm()
        # 通过node id获取Ip信息
        node_info = self.get_node_ip()
        log = self.get_node_last_log()
        node_ip = node_info.get('inner_ip')
        params = json.loads(log.params)
        # 校验权限
        if node_info.get('status') not in [NodeStatus.Removed, NodeStatus.InitialFailed]:
            raise error_codes.CheckFailed(_("IP: {}正在操作中,请勿重复操作").format(node_ip))
        with client.ContextActivityLogClient(
            project_id=self.project_id,
            user=self.username,
            resource_type=ACTIVITY_RESOURCE_TYPE,
            resource=node_ip,
            resource_id=self.node_id,
        ).log_modify():
            self.update_nodes([node_ip])
            # 调用OPS api
            self.need_nat = params['need_nat']
            self.master_ip_list = params['master_ip_list']
            self.module_id_list = params['module_id_list']
            self.ip_list = [node_ip]
            log = self.create_node_by_bcs(
                [node_info], control_ip=params['control_ip'], config=params['config'], websvr=params['websvr']
            )
            if not log.is_finished and log.is_polling:
                log.polling_task()

        return Response({})
示例#13
0
    def post(self, request, project_id, template_id):
        if is_create_template(template_id):
            # template dict like {'desc': '', 'name': ''}
            tpl_args = request.data.get('template', {})
            template = create_template_with_perm_check(request, project_id,
                                                       tpl_args)
        else:
            template = get_template_by_project_and_id(project_id, template_id)

        self.can_edit_template(request, template)

        serializer = serializers_new.TemplateDraftSLZ(
            template, data=request.data, context={'template_id': template.id})
        serializer.is_valid(raise_exception=True)
        serializer.save(draft_updator=request.user.username)

        validated_data = serializer.validated_data
        # 记录操作日志
        client.ContextActivityLogClient(project_id=template.project_id,
                                        user=request.user.username,
                                        resource_type='template',
                                        resource=template.name,
                                        resource_id=template.id,
                                        extra=json.dumps(validated_data),
                                        description=_("保存草稿")).log_modify()

        return Response({
            'template_id': template.id,
            'show_version_id': -1,
            'real_version_id': validated_data['real_version_id'],
        })
示例#14
0
    def delete(self):
        # 添加权限限制
        self.check_cluster_perm()
        # 针对导入/纳管的集群,需要删除节点记录
        cluster = cluster_utils.get_cluster(self.access_token, self.project_id, self.cluster_id)
        if cluster["state"] == ClusterState.Existing.value:
            self.delete_cluster_nodes(self.access_token, self.project_id, self.cluster_id)
        # 更新集群状态为删除中
        data = self.update_cluster_status(status=CommonStatus.Removing)
        # 删除平台数据库记录的已经实例化,但是没有删除的实例信息
        ns_id_list = self.get_cluster_ns_list()
        self.clean_instance(ns_id_list)
        self.delete_namespaces()
        self.delete_helm_release()
        # 下发删除任务
        with client.ContextActivityLogClient(
            project_id=self.project_id,
            user=self.username,
            resource_type=ACTIVITY_RESOURCE_TYPE,
            resource=data['name'],
            resource_id=self.cluster_id
        ).log_delete():
            snapshot = self.get_cluster_snapshot()
            self.config = json.loads(snapshot.get('configure', '{}'))
            self.control_ip = self.config.pop('control_ip', [])
            self.websvr = self.config.pop('websvr', [])
            task = self.delete_cluster_via_bcs()
            if task and not task.is_finished and task.is_polling:
                task.polling_task()

        return Response({})
示例#15
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.f(u"参数不能为空!")

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

        if category not in MODULE_DICT:
            raise error_codes.CheckFailed.f(u"category: %s 不存在!" % category)
        # 获取要删除的实例的信息
        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=u"删除模板集实例"
        ).log_delete():
            return self.delete_handler(request, inst_info, project_id, project_kind)
示例#16
0
    def _log_activity(self, status, msg=''):
        show_version = self.release_data.show_version
        template = show_version.related_template

        if status == 'succeed':
            description = f'deploy template [{template.name}] in ns [{self.namespace}] success'
        else:
            description = f'deploy template [{template.name}] in ns [{self.namespace}] failed: {msg}'

        extra = {}
        for res_file in self.release_data.template_files:
            files_ids = [str(f['id']) for f in res_file['files']]
            extra[res_file['resource_name']] = ','.join(files_ids)

        log_params = {
            'project_id': self.release_data.project_id,
            'user': self.username,
            'resource_type': 'template',
            'resource': template.name,
            'resource_id': template.id,
            'extra': json.dumps(extra),
            'description': description,
        }
        client.ContextActivityLogClient(**log_params).log_add(
            activity_status=status)
示例#17
0
    def destroy(self, request, project_id, pk):
        """删除nginx ingress
        1. 标识LB配置
        2. 删除节点标签nodetype
        3. 删除helm记录
        """
        lb_conf = self.get_object()

        # 标识LB被删除
        self.delete_lb_conf(lb_conf)
        # 删除节点标签
        delete_node_id_list = [
            node_id for node_id in json.loads(lb_conf.ip_info)
        ]
        self.delete_node_label(request, delete_node_id_list, project_id,
                               lb_conf)
        # 删除helm release
        release = self.get_helm_release(lb_conf.cluster_id,
                                        K8S_LB_CHART_NAME,
                                        namespace_id=lb_conf.namespace_id,
                                        namespace=lb_conf.namespace)
        if not release:
            return Response()

        user_log = log_client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type='lb',
            resource="%s:%s" % (lb_conf.cluster_id, lb_conf.namespace_id),
            resource_id=pk)
        release.destroy(username=request.user.username,
                        access_token=request.user.token.access_token)

        user_log.log_delete(activity_status="succeed")
        return Response()
示例#18
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
示例#19
0
    def upgrade_by_ops(self, request, params):

        with client.ContextActivityLogClient(
            project_id=params["project_id"],
            user=request.user.username,
            resource_type="cluster",
            resource_id=params["cluster_id"],
            description=_("升级集群版本"),
        ).log_modify():
            ops_client = ops.OPSClient(
                request.user.token.access_token,
                params["project_id"],
                params["cluster_id"],
                params.get("coes") or params.get("coes_name"),
                params["platform"],
                request.user.username,
            )
            task_info = ops_client.upgrade_cluster(
                {
                    "master_ip_list": params["master_ip_list"],
                    "control_ip": params["control_ip"],
                    "node_ip_list": params["node_ip_list"],
                    "update_type": params["update_type"],
                }
            )
        return task_info
示例#20
0
    def delete_services(self, request, project_id, cluster_id, namespace, name):
        username = request.user.username
        # 检查用户是否有命名空间的使用权限
        namespace_dict = self.check_namespace_use_perm(request, project_id, [namespace])
        namespace_id = namespace_dict.get(namespace)

        flag, project_kind = self.get_project_kind(request, project_id)
        if not flag:
            return project_kind

        # 删除service
        resp = self.delete_single_service(request, project_id, project_kind, cluster_id, namespace, namespace_id, name)
        # 添加操作审计
        activity_client.ContextActivityLogClient(
            project_id=project_id,
            user=username,
            resource_type="instance",
            resource=name,
            resource_id=0,
            extra=json.dumps({}),
            description=u"删除Service[%s]命名空间[%s]" % (
                name, namespace)
        ).log_modify(activity_status="succeed" if resp.get("code") == ErrorCode.NoError else "failed")

        # 已经删除的,需要将错误信息翻译一下
        message = resp.get('message', '')
        is_delete_before = True if 'node does not exist' in message or 'not found' in message else False
        if is_delete_before:
            message = u"%s[命名空间:%s]已经被删除,请手动刷新数据" % (name, namespace)
        return Response({
            "code": resp.get("code"),
            "message": message,
            "data": {}
        })
示例#21
0
    def force_delete(self):
        """强制删除
        1. 检查状态
        2. 调用ops删除节点
        """
        self.check_perm()
        # 判断节点是否允许删除
        self.can_delete_node(self.request.user.token.access_token, self.project_id, self.cluster_id)
        # 查询节点
        node_info = self.get_node_ip()
        self.check_host_stop_scheduler(node_info)
        self.check_host_removing(node_info)

        # 调用BCS
        self.node_ip = node_info.get('inner_ip')
        with client.ContextActivityLogClient(
            project_id=self.project_id,
            user=self.username,
            resource_type=ACTIVITY_RESOURCE_TYPE,
            resource=self.node_ip,
            resource_id=self.node_id,
        ).log_delete():
            # 更新状态
            self.update_nodes([self.node_ip], status=CommonStatus.Removing)
            # 删除节点上的label
            self.delete_node_labels()
            log = self.delete_node_via_bcs()
            if not log.is_finished and log.is_polling:
                log.polling_task()
        return Response({})
示例#22
0
    def create(self, request, project_id):
        slz = LoadBalancesSLZ(data=request.data)
        slz.is_valid(raise_exception=True)
        data = slz.data
        creator = request.user.username

        # 针对mesos,权限相关放大到集群即可
        self.can_use_perm(request, project_id, data['cluster_id'])

        handled_data = self.handle_data(data)
        with activity_client.ContextActivityLogClient(
            project_id=project_id,
            user=creator,
            resource_type="lb",
            resource_id=data["cluster_id"],
            resource=data['name'],
            description=u"创建LoadBalance",
            extra=json.dumps(data),
        ).log_add() as ual_client:
            MesosLoadBlance.objects.create(
                project_id=project_id,
                cluster_id=data['cluster_id'],
                namespace_id=data['namespace_id'],
                namespace=data['namespace'],
                name=data['name'],
                creator=creator,
                updator=creator,
                ip_list=json.dumps(data['ip_list']),
                data=json.dumps(data['constraints']),
                data_dict=json.dumps(handled_data)
            )

            ual_client.update_log(activity_status='succeed')
        return Response({"code": 0, "message": "ok"})
示例#23
0
    def deploy(self, request, project_id, cluster_id, namespace, name):
        """部署LB到集群"""
        lb_queryset = self.get_lb_queryset(project_id, cluster_id, namespace,
                                           name)
        lb = lb_queryset.first()

        access_token = request.user.token.access_token
        # 组装下发配置
        lb_conf = lb_utils.MesosLBConfig(access_token, project_id, cluster_id,
                                         lb)
        svc_conf = lb_conf._service_config()
        deploy_conf = lb_conf._deployment_config()

        # 创建lb,包含service和deployment
        with activity_client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type="lb",
                resource=name,
                description=_("启动Mesos LoadBalancer"),
        ).log_start():
            lb_utils.deploy_mesos_lb(access_token, project_id, cluster_id,
                                     svc_conf, deploy_conf)
            lb_queryset.update(
                status=mesos_lb_constants.MESOS_LB_STATUS.DEPLOYING.value)
        return Response()
示例#24
0
    def update(self, request, project_id, lb_id):
        slz = UpdateLoadBalancesSLZ(data=request.data)
        slz.is_valid(raise_exception=True)
        data = slz.data
        updater = request.user.username

        # 检查是否有命名空间的使用权限
        self.can_use_perm(request, project_id, data['cluster_id'])

        handled_data = self.handle_data(data)
        with activity_client.ContextActivityLogClient(
            project_id=project_id,
            user=updater,
            resource_type="lb",
            resource=data['name'],
            resource_id=data['cluster_id'],
            description=u"更新LoadBalance",
            extra=json.dumps(data),
        ).log_modify() as ual_client:
            MesosLoadBlance.objects.filter(id=lb_id).update(
                project_id=project_id,
                cluster_id=data['cluster_id'],
                namespace_id=data['namespace_id'],
                namespace=data['namespace'],
                name=data['name'],
                updator=updater,
                ip_list=json.dumps(data['ip_list']),
                data=json.dumps(data['constraints']),
                data_dict=json.dumps(handled_data)
            )

            ual_client.update_log(activity_status="succeed")
        return Response({"code": 0, "message": "ok"})
示例#25
0
    def delete_services(self, request, project_id, cluster_id, namespace, name):
        username = request.user.username
        # 检查用户是否有命名空间的使用权限
        namespace_id = app_utils.get_namespace_id(
            request.user.token.access_token, project_id, (cluster_id, namespace), cluster_id=cluster_id
        )
        app_utils.can_use_namespace(request, project_id, namespace_id)

        flag, project_kind = self.get_project_kind(request, project_id)
        if not flag:
            return project_kind

        # 删除service
        resp = self.delete_single_service(request, project_id, project_kind, cluster_id, namespace, namespace_id, name)
        # 添加操作审计
        activity_client.ContextActivityLogClient(
            project_id=project_id,
            user=username,
            resource_type="instance",
            resource=name,
            resource_id=0,
            extra=json.dumps({}),
            description=_("删除Service[{}]命名空间[{}]").format(name, namespace),
        ).log_modify(activity_status="succeed" if resp.get("code") == ErrorCode.NoError else "failed")

        # 已经删除的,需要将错误信息翻译一下
        message = resp.get('message', '')
        is_delete_before = True if 'node does not exist' in message or 'not found' in message else False
        if is_delete_before:
            message = _("{}[命名空间:{}]已经被删除,请手动刷新数据").format(name, namespace)
        return Response({"code": resp.get("code"), "message": message, "data": {}})
示例#26
0
 def delete(self, request, project_id, lb_id):
     # 判断 lb 的状态
     validate_res, validate_msg = self.validate_lb(
         request, project_id, lb_id, "delete")
     if not validate_res:
         return Response(validate_msg)
     username = request.user.username
     with activity_client.ContextActivityLogClient(
         project_id=project_id,
         user=username,
         resource_type="lb",
         resource=lb_id,
         resource_id=lb_id,
     ).log_modify() as ual_client:
         lb_info = MesosLoadBlance.objects.filter(id=lb_id)
         lb_info.update(
             is_deleted=True,
             deleted_time=datetime.datetime.now(),
             name="%s:deleted:%s" % (lb_id, lb_info[0].name)
         )
         ual_client.update_log(
             activity_status='succeed',
             description=u"LB[%s]删除成功" % lb_id,
         )
     return Response({
         "code": 0,
         "message": "删除成功!",
     })
示例#27
0
    def create(self, request, project_id, is_validate_perm=True):
        """新建命名空间
        k8s 流程:新建namespace配置文件并下发 -> 新建包含仓库账号信息的sercret配置文件并下发 -> 在paas-cc上注册
        mesos流程:新建包含仓库账号信息的sercret配置文件并下发 -> 在paas-cc上注册
        """
        serializer = CreateNamespaceSLZ(data=request.data,
                                        context={
                                            'request': request,
                                            'project_id': project_id
                                        })
        serializer.is_valid(raise_exception=True)

        data = serializer.data

        # 判断权限
        cluster_id = data['cluster_id']
        perm = bcs_perm.Namespace(request, project_id, bcs_perm.NO_RES,
                                  cluster_id)
        perm.can_create(raise_exception=is_validate_perm)

        data = serializer.data
        description = _('集群: {}, 创建命名空间: 命名空间[{}]').format(
            cluster_id, data["name"])
        with client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type='namespace',
                resource=data['name'],
                description=description).log_add():
            result = self.create_flow(request, project_id, data, perm)

        return response.Response(result)
示例#28
0
    def delete(self, request, project_id, cluster_id, namespace, name):
        namespace_id = self.get_namespace_id(request, project_id, cluster_id,
                                             namespace, name)
        # 校验查看权限
        self.can_use(request, project_id, cluster_id, namespace_id)
        with log_client.ContextActivityLogClient(
                project_id=project_id,
                user=request.user.username,
                resource_type='ingress',
                resource=name,
                description=_("集群:{}, 删除mesos ingress:{}").format(
                    cluster_id, name),
        ).log_delete():
            client = mesos.MesosClient(request.user.token.access_token,
                                       project_id,
                                       cluster_id,
                                       env=None)
            client.delete_custom_resource(name, namespace)
        # 删除成功则更新记录
        now_time = timezone.now()
        InstanceConfig.objects.filter(namespace=namespace_id,
                                      category='ingress',
                                      name=name).update(
                                          updator=request.user.username,
                                          updated=now_time,
                                          deleted_time=now_time,
                                          is_deleted=True,
                                          is_bcs_success=True,
                                      )

        return response.Response()
示例#29
0
    def delete(self):
        # 添加权限限制
        self.check_cluster_perm()
        # 更新集群状态为删除中
        data = self.update_cluster_status(status=CommonStatus.Removing)
        # 删除平台数据库记录的已经实例化,但是没有删除的实例信息
        ns_id_list = self.get_cluster_ns_list()
        self.clean_instance(ns_id_list)
        self.delete_namespaces()
        self.delete_helm_release()
        # 下发删除任务
        with client.ContextActivityLogClient(
                project_id=self.project_id,
                user=self.username,
                resource_type=ACTIVITY_RESOURCE_TYPE,
                resource=data['name'],
                resource_id=self.cluster_id).log_delete():
            snapshot = self.get_cluster_snapshot()
            self.config = json.loads(snapshot.get('configure', '{}'))
            self.control_ip = self.config.pop('control_ip', [])
            self.websvr = self.config.pop('websvr', [])
            log = self.delete_cluster_via_bcs()
            if not log.is_finished and log.is_polling:
                log.polling_task()

        return Response({})
示例#30
0
    def post(self, request, project_id, clb_id):
        # 获取配置
        record = CloudLoadBlancer.objects.retrieve_record(clb_id)
        # 校验使用集群权限
        clb_utils.can_use_cluster(request, project_id, record['cluster_id'])
        # 获取 repo 地址
        repo_domain = paas_cc.get_jfrog_domain(request.user.token.access_token, project_id, record['cluster_id'])
        if not repo_domain:
            repo_domain = settings.DEFAUT_MESOS_LB_JFROG_DOMAIN
        record['repo_domain'] = repo_domain
        mesos_json = json.loads(render_to_string('mesos.json', record))

        with client.ContextActivityLogClient(
            project_id=project_id,
            user=request.user.username,
            resource_type='lb',
            resource=record['resource_name'],
            description=_("集群:{}, 创建clb关联deployment:{}").format(record['cluster_id'], record['resource_name']),
        ).log_add():
            clb_utils.create_mesos_deployment(
                request.user.token.access_token, project_id, record['cluster_id'], record['namespace'], mesos_json
            )
        # 更改状态
        self.update_clb_status(clb_id, clb_constants.CLB_CREATED_STATUS)

        return response.Response()