def get_cluster_summaries( clusters: list, cluster_registry: str, kubeconfig_path: Path, kubeconfig_contexts: set, include_clusters: str, exclude_clusters: str, system_namespaces: set, notifications: list, additional_cost_per_cluster: float, no_ingress_status: bool, node_label: str, ): cluster_summaries = {} if cluster_registry: discoverer = cluster_discovery.ClusterRegistryDiscoverer(cluster_registry) elif clusters or not kubeconfig_path.exists(): api_server_urls = clusters or [] discoverer = cluster_discovery.StaticClusterDiscoverer(api_server_urls) else: discoverer = cluster_discovery.KubeconfigDiscoverer( kubeconfig_path, kubeconfig_contexts ) include_pattern = include_clusters and re.compile(include_clusters) exclude_pattern = exclude_clusters and re.compile(exclude_clusters) with ThreadPoolExecutor(max_workers=4) as executor: future_to_cluster = {} for cluster in discoverer.get_clusters(): if (not include_pattern or include_pattern.match(cluster.id)) and ( not exclude_pattern or not exclude_pattern.match(cluster.id) ): future_to_cluster[ executor.submit( query_cluster, cluster, executor, system_namespaces, additional_cost_per_cluster, no_ingress_status, node_label, ) ] = cluster for future in concurrent.futures.as_completed(future_to_cluster): cluster = future_to_cluster[future] try: summary = future.result() cluster_summaries[cluster.id] = summary except Exception as e: notifications.append( ["error", f"Failed to query cluster {cluster.id}: {e}"] ) logger.exception(e) sorted_by_name = sorted(cluster_summaries.values(), key=lambda summary: summary["cluster"].name) return {summary["cluster"].id: summary for summary in sorted_by_name}
def get_cluster_summaries( clusters: list, cluster_registry: str, kubeconfig_path: Path, kubeconfig_contexts: set, include_clusters: str, exclude_clusters: str, system_namespaces: set, notifications: list, additional_cost_per_cluster: float, alpha_ema: float, prev_cluster_summaries: dict, no_ingress_status: bool, enable_routegroups: bool, node_labels: list, data_path: Path, map_node_hook=None, map_pod_hook=None, ): cluster_summaries = {} discoverer: Any if cluster_registry: discoverer = cluster_discovery.ClusterRegistryDiscoverer( cluster_registry) elif clusters or not kubeconfig_path.exists(): api_server_urls = clusters or [] discoverer = cluster_discovery.StaticClusterDiscoverer(api_server_urls) else: discoverer = cluster_discovery.KubeconfigDiscoverer( kubeconfig_path, kubeconfig_contexts) include_pattern = include_clusters and re.compile(include_clusters) exclude_pattern = exclude_clusters and re.compile(exclude_clusters) with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: future_to_cluster = {} for cluster in discoverer.get_clusters(): if (not include_pattern or include_pattern.match(cluster.id)) and ( not exclude_pattern or not exclude_pattern.match(cluster.id)): cluster_data_path = data_path / cluster.id cluster_data_path.mkdir(parents=True, exist_ok=True) future_to_cluster[executor.submit( query_cluster, cluster, executor, system_namespaces, additional_cost_per_cluster, alpha_ema, prev_cluster_summaries.get(cluster.id, {}), no_ingress_status, enable_routegroups, node_labels, cluster_data_path, map_node_hook, map_pod_hook, )] = cluster for future in concurrent.futures.as_completed(future_to_cluster): cluster = future_to_cluster[future] try: summary = future.result() cluster_summaries[cluster.id] = summary except Exception as e: notifications.append( ["error", f"Failed to query cluster {cluster.id}: {e}"]) logger.exception(e) sorted_by_name = sorted(cluster_summaries.values(), key=lambda summary: summary["cluster"].name) return {summary["cluster"].id: summary for summary in sorted_by_name}