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})
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'))
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))
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)
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})