Пример #1
0
    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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
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)
Пример #5
0
    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)
Пример #6
0
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)
Пример #7
0
    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)
Пример #8
0
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)
Пример #9
0
    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']]
Пример #10
0
    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']]
Пример #11
0
 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