webview-ui/src/InspektorGadget/helpers/clusterResources.ts (92 lines of code) (raw):
import { replaceItem } from "../../utilities/array";
import { Lazy, map as lazyMap, newLoaded, newLoading, newNotLoaded } from "../../utilities/lazy";
export interface LazyParent<TChild> {
name: string;
children: Lazy<TChild[]>;
}
export type Nodes = Lazy<string[]>;
export type ContainerName = string;
export type PodResources = LazyParent<ContainerName>;
export type NamespaceResources = LazyParent<PodResources>;
export type ClusterResources = Lazy<NamespaceResources[]>;
function updateContainersForPod(podResources: PodResources, containers: string[]): PodResources {
return { ...podResources, children: newLoaded(containers) };
}
function updateContainersForNamespace(
namespaceResource: NamespaceResources,
podName: string,
containers: string[],
): NamespaceResources {
const children = lazyMap(namespaceResource.children, (pods) =>
replaceItem(
pods,
(pod) => pod.name === podName,
(pod) => updateContainersForPod(pod, containers),
),
);
return { ...namespaceResource, children };
}
function setContainersLoadingForPod(podResources: PodResources): PodResources {
return { ...podResources, children: newNotLoaded() };
}
function setContainersLoadingForNamespace(namespaceResource: NamespaceResources, podName: string): NamespaceResources {
const children = lazyMap(namespaceResource.children, (pods) =>
replaceItem(pods, (pod) => pod.name === podName, setContainersLoadingForPod),
);
return { ...namespaceResource, children };
}
export function updateContainersForCluster(
resources: ClusterResources,
namespace: string,
podName: string,
containers: string[],
): ClusterResources {
return lazyMap(resources, (nsItems) =>
replaceItem(
nsItems,
(ns) => ns.name === namespace,
(ns) => updateContainersForNamespace(ns, podName, containers),
),
);
}
function updatePodsForNamespace(namespaceResource: NamespaceResources, podNames: string[]): NamespaceResources {
const children = newLoaded(podNames.map((p) => ({ name: p, children: newNotLoaded() })));
return { ...namespaceResource, children };
}
function setPodsLoadingForNamespace(namespaceResource: NamespaceResources): NamespaceResources {
return { ...namespaceResource, children: newLoading() };
}
export function updatePodsForCluster(
resources: ClusterResources,
namespace: string,
podNames: string[],
): ClusterResources {
return lazyMap(resources, (nsItems) =>
replaceItem(
nsItems,
(ns) => ns.name === namespace,
(ns) => updatePodsForNamespace(ns, podNames),
),
);
}
export function updateNamespacesForCluster(namespaces: string[]): ClusterResources {
const namespaceList = namespaces.map((ns) => ({ name: ns, children: newNotLoaded() }));
return newLoaded(namespaceList);
}
export function updateNodesForCluster(nodes: string[]): Nodes {
return newLoaded(nodes);
}
export function setPodsLoading(resources: ClusterResources, namespace: string): ClusterResources {
return lazyMap(resources, (nsItems) =>
replaceItem(nsItems, (ns) => ns.name === namespace, setPodsLoadingForNamespace),
);
}
export function setContainersLoading(resources: ClusterResources, namespace: string, podName: string) {
return lazyMap(resources, (nsItems) =>
replaceItem(
nsItems,
(ns) => ns.name === namespace,
(ns) => setContainersLoadingForNamespace(ns, podName),
),
);
}