def set_labels_for_multi_nodes(self, node_labels: List[Dict]): """设置标签 :param node_labels: 要设置的标签信息,格式: [{"node_name": "", "labels": {"key": "val"}}] NOTE: 如果要删除某个label时,不建议使用replace,可以把要删除的label的值设置为None """ filter_labels = self.filter_nodes_field_data( "labels", [label["node_name"] for label in node_labels], node_id_field="name", default_data={}) # 比对数据,当label在集群节点中存在,而变更的数据中不存在,则需要在变更的数据中设置为None for node in node_labels: labels = filter_labels.get(node["node_name"]) # 设置要删除key的值为None for key in set(labels) - set(node["labels"]): node["labels"][key] = None # 下发的body格式: {"metadata": {"labels": {"demo": "demo"}}} tasks = [ functools.partial(self.patch, {"metadata": { "labels": l["labels"] }}, l["node_name"]) for l in node_labels ] # 当有操作失败的,抛出异常 async_run(tasks)
def _delete(self, operator: str, app_release_id: int): res_mgr = ReleaseResourceManager(self.dynamic_client, app_release_id) tasks = [ functools.partial(res_mgr.delete, operator, resource_inst.id) for resource_inst in models.ResourceInstance.objects.filter( app_release_id=app_release_id) ] async_run(tasks)
def _deploy(self, operator: str, app_release_id: int, resource_list: List[models.ResourceData]): res_mgr = ReleaseResourceManager(self.dynamic_client, app_release_id) tasks = [ functools.partial(res_mgr.update_or_create, operator, resource) for resource in resource_list ] async_run(tasks)
def batch_delete_chart_versions(chart_data: ChartData, repo_auth: RepoAuth, versions: List[str]): """批量删除chart版本""" # 组装并发任务 client = BkRepoClient(repo_auth.username, password=repo_auth.password) delete_version = functools.partial(delete_chart_version, chart_data, client) tasks = [ functools.partial(delete_version, version) for version in versions ] async_run(tasks)
def set_taints_for_multi_nodes(self, node_taints: List[Dict]): """设置污点 :param node_taints: 要设置的污点信息,格式: [{"node_name": "", "taints": [{"key": "", "value": "", "effect": ""}]}] """ # 下发的body格式: {"spec": {"taints": [{"key": xxx, "value": xxx, "effect": xxx}]}} tasks = [ functools.partial(self.patch, {"spec": { "taints": t["taints"] }}, t["node_name"]) for t in node_taints ] # 当有操作失败的,抛出异常 async_run(tasks)
def set_labels(ctx_cluster: CtxCluster, label_list: List): """节点设置标签 ctx_cluster: 集群模型数据 taint_list: 节点的污点内容,格式: [{"node_name": "demo", "labels": {"key1": "value1", "key2": "value2"}] """ client = Node(ctx_cluster) # 下发的body格式: {"metadata": {"labels": {"demo": "demo"}}} tasks = [ functools.partial(client.patch, {"metadata": { "labels": l["labels"] }}, l["node_name"]) for l in label_list ] # 当有操作失败的,抛出异常 async_run(tasks)
def set_nodes_schedule_status(self, unschedulable: bool, node_names: List[str]): """设置节点调度状态 unschedulable: 节点是否可以调度 node_names: 节点名称, 允许多个, 格式[节点名称] """ tasks = [ functools.partial(self.patch, {"spec": { "unschedulable": unschedulable }}, n) for n in node_names ] # 如有失败, 则抛出异常 async_run(tasks)
def set_taints(ctx_cluster: CtxCluster, taint_list: List): """节点设置污点,因为可能有多个节点分别调用接口完成打污点,使用asyncio处理,减少耗时 ctx_cluster: 集群模型数据 taint_list: 节点的污点内容,格式: [{"node_name": "demo", "taints": [{"key": xxx, "value": xxx, "effect": xxx}]] """ client = Node(ctx_cluster) # 下发的body格式: {"spec": {"taints": [{"key": xxx, "value": xxx, "effect": xxx}]}} tasks = [ functools.partial(client.patch, {"spec": { "taints": t["taints"] }}, t["node_name"]) for t in taint_list ] # 当有操作失败的,抛出异常 async_run(tasks)
def fetch_all(self) -> List[Dict]: """并发查询 CMDB,获取符合条件的全量业务信息""" total = self._fetch_count() tasks = [] for start in range(constants.DEFAULT_START_AT, total, constants.CMDB_MAX_LIMIT): # 组装并行任务配置信息 tasks.append( functools.partial( self.cc_client.search_business, PageData(start=start, limit=constants.CMDB_MAX_LIMIT), self.fields, self.condition, self.bk_supplier_account, )) try: results = async_run(tasks) except AsyncRunException as e: raise CompParseBkCommonResponseError( None, _('根据条件查询全量业务失败:{}').format(e)) # 所有的请求结果合并,即为全量数据 return [app for r in results for app in r.ret['info']]
def fetch_all(self) -> List[Dict]: """ 并发查询 CMDB,获取符合条件的全量主机信息 :return: 主机列表 """ total = self._fetch_count() tasks = [] for start in range(constants.DEFAULT_START_AT, total, constants.CMDB_LIST_HOSTS_MAX_LIMIT): # 组装并行任务配置信息 tasks.append( functools.partial( self.cc_client.list_biz_hosts, self.bk_biz_id, PageData( start=start, limit=constants.CMDB_LIST_HOSTS_MAX_LIMIT, ), self.bk_set_ids, self.bk_module_ids, constants.DEFAULT_HOST_FIELDS, self.host_property_filter, self.bk_supplier_account, )) try: results = async_run(tasks) except AsyncRunException as e: raise CompParseBkCommonResponseError( None, _('根据条件查询业务全量主机失败:{}').format(e)) # 所有的请求结果合并,即为全量数据 return [host for r in results for host in r.ret['info']]
def reschedule_pods(self, ctx_cluster: CtxCluster, pods: List[Dict[str, str]]) -> List[AsyncResult]: task_groups = [] client = Pod(ctx_cluster) # 组装任务 for i in range(0, len(pods), self.MAX_TASK_POD_NUM): # 记录组内任务,用于并行处理 tasks = [] for pod in pods[i:i + self.MAX_TASK_POD_NUM]: tasks.append( functools.partial(client.delete_ignore_nonexistent, pod["name"], pod["namespace"])) task_groups.append(tasks) # 执行任务 results = [] for t in task_groups: results.extend(async_run(t, raise_exception=False)) return results