Ejemplo n.º 1
0
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}
Ejemplo n.º 2
0
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}