Esempio n. 1
0
    def delete_instance(
        self,
        request,
        project_id,
        cluster_id,
        ns,
        instance_name,
        category="application",
        kind=2,
        inst_id_list=None,
        enforce=0,
    ):
        """删除instance"""
        if kind == 2:
            client = MesosClient(request.user.token.access_token, project_id, cluster_id, None)
            if category == "application":
                resp = client.delete_mesos_app_instance(ns, instance_name, enforce=enforce)
            elif category == "deployment":
                resp = client.delete_deployment(ns, instance_name, enforce=enforce)
            elif category == "secret":
                resp = client.delete_secret(ns, instance_name)
            elif category == "configmap":
                resp = client.delete_configmap(ns, instance_name)
            else:
                resp = client.delete_service(ns, instance_name)
            if inst_id_list:
                delete_instance_task.delay(request.user.token.access_token, inst_id_list, kind)
        else:
            client = K8SClient(request.user.token.access_token, project_id, cluster_id, None)
            # deployment 需要级联删除 res\pod; daemonset/job/statefulset 需要级联删除 pod
            if FUNC_MAP[category] in ['%s_deployment', '%s_daemonset', '%s_job', '%s_statefulset']:
                fun_prefix = 'deep_delete'
            else:
                fun_prefix = 'delete'
            curr_func = getattr(client, FUNC_MAP[category] % fun_prefix)

            resp = curr_func(ns, instance_name)
        # 级联删除,会返回空
        if resp is None:
            # 启动后台任务,轮训任务状态
            if inst_id_list:
                delete_instance_task.delay(request.user.token.access_token, inst_id_list, kind)
            return APIResponse({"code": ErrorCode.NoError, "message": _("删除成功")})

        # response
        msg = resp.get("message")
        # message中有not found或者node does not exist时,认为已经删除成功
        # 状态码为正常或者满足不存在条件时,认为已经删除成功
        if (
            (
                resp.get("code")
                in [ErrorCode.NoError, ErrorCode.MesosDeploymentNotFound, ErrorCode.MesosApplicationNotFound]
            )
            or ("not found" in msg)
            or ("node does not exist" in msg)
        ):
            return APIResponse({"code": ErrorCode.NoError, "message": _("删除成功")})

        return APIResponse({"code": resp.get("code"), "message": msg})
Esempio n. 2
0
    def init_mesos_ns_by_bcs(self, access_token, project_id, project_code,
                             cluster_id, ns_name):
        """新建包含仓库账号信息的sercret配置文件并下发
        """
        # 获取镜像仓库地址
        jfrog_domain = paas_cc.get_jfrog_domain(access_token, project_id,
                                                cluster_id)
        # 按项目申请仓库的账号信息

        # 判断是否为研发仓库,正式环境分为:研发仓库、生产仓库,这2个仓库的账号要分开申请
        if jfrog_domain.startswith(settings.BK_JFROG_ACCOUNT_DOMAIN):
            is_bk_jfrog = True
        else:
            is_bk_jfrog = False
        jfrog_account = get_jfrog_account(access_token, project_code,
                                          project_id, is_bk_jfrog)
        _user = jfrog_account.get('user', '')
        _pwd = jfrog_account.get('password', '')
        jfrog_config = {
            "kind": "secret",
            "metadata": {
                "name": MESOS_IMAGE_SECRET,
                "namespace": ns_name
            },
            "datas": {
                "user": {
                    "content":
                    base64.b64encode(_user.encode(encoding="utf-8")).decode()
                },
                "pwd": {
                    "content":
                    base64.b64encode(_pwd.encode(encoding="utf-8")).decode()
                }
            },
            "apiVersion": "v4"
        }

        # 下发secret配置文件
        client = MesosClient(access_token, project_id, cluster_id, env=None)
        result = client.create_secret(ns_name, jfrog_config)
        if result.get('code') != 0:
            client.delete_secret(ns_name, MESOS_IMAGE_SECRET)
            raise error_codes.ComponentError.f(
                "创建jforg secret失败,%s, 请联系管理员解决" % result.get('message'))
Esempio n. 3
0
def delete(access_token, project_id, cluster_id, ns_name):
    # 删除平台创建的secret,用于拉取image
    # TODO: 后续多次使用时,可以放置到resources中
    client = MesosClient(access_token, project_id, cluster_id, env=None)
    # 兼容ZK和etcd存储的不同的secret名称
    for secret_name in [MESOS_IMAGE_SECRET, OLD_MESOS_IMAGE_SECRET]:
        resp = client.delete_secret(ns_name, secret_name)
        if resp.get("code") == ErrorCode.NoError:
            continue
        msg = resp.get("message") or ""
        # TODO: 现阶段只能通过message判断secret不存在,并且忽略不存在的情况
        if ("not found" in msg) or ("not exist" in msg):
            continue
        raise error_codes.APIError(_("删除secret异常,{}").format(msg))
Esempio n. 4
0
 def delete_secret_for_mesos(self, access_token, project_id, cluster_id,
                             ns_name):
     client = MesosClient(access_token, project_id, cluster_id, env=None)
     client.delete_secret(ns_name, MESOS_IMAGE_SECRET)
Esempio n. 5
0
    def delete_instance(self,
                        request,
                        project_id,
                        cluster_id,
                        ns,
                        instance_name,
                        category="application",
                        kind=2,
                        inst_id_list=None,
                        enforce=0):
        """删除instance
        """
        if kind == 2:
            client = MesosClient(request.user.token.access_token, project_id,
                                 cluster_id, None)
            if category == "application":
                resp = client.delete_mesos_app_instance(ns,
                                                        instance_name,
                                                        enforce=enforce)
            elif category == "deployment":
                resp = client.delete_deployment(ns,
                                                instance_name,
                                                enforce=enforce)
            elif category == "secret":
                resp = client.delete_secret(ns, instance_name)
            elif category == "configmap":
                resp = client.delete_configmap(ns, instance_name)
            else:
                resp = client.delete_service(ns, instance_name)
            if inst_id_list:
                delete_instance_task.delay(request.user.token.access_token,
                                           inst_id_list, kind)
        else:
            client = K8SClient(request.user.token.access_token, project_id,
                               cluster_id, None)
            # deployment 需要级联删除 res\pod; daemonset/job/statefulset 需要级联删除 pod
            if FUNC_MAP[category] in [
                    '%s_deployment', '%s_daemonset', '%s_job', '%s_statefulset'
            ]:
                fun_prefix = 'deep_delete'
            else:
                fun_prefix = 'delete'
            curr_func = getattr(client, FUNC_MAP[category] % fun_prefix)

            resp = curr_func(ns, instance_name)
        # 级联删除,会返回空
        if resp is None:
            # 启动后台任务,轮训任务状态
            if inst_id_list:
                delete_instance_task.delay(request.user.token.access_token,
                                           inst_id_list, kind)
            return APIResponse({
                "code": ErrorCode.NoError,
                "message": _("删除成功")
            })
        curr_msg = resp.get("message")
        if "not found" in curr_msg or "node does not exist" in curr_msg:
            return APIResponse({
                "code": ErrorCode.NoError,
                "message": _("删除成功")
            })
        if resp.get("code") != ErrorCode.NoError:
            return APIResponse({
                "code": resp.get("code") or DEFAULT_ERROR_CODE,
                "message": curr_msg
            })
        return APIResponse({"code": resp.get("code"), "message": curr_msg})