mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import { observable } from "mobx";
|
|
import { ClusterMetadata } from "../../common/cluster-store";
|
|
import { Cluster } from "../cluster";
|
|
import { BaseClusterDetector, ClusterDetectionResult } from "./base-cluster-detector";
|
|
import { ClusterIdDetector } from "./cluster-id-detector";
|
|
import { DistributionDetector } from "./distribution-detector";
|
|
import { LastSeenDetector } from "./last-seen-detector";
|
|
import { NodesCountDetector } from "./nodes-count-detector";
|
|
import { VersionDetector } from "./version-detector";
|
|
|
|
export class DetectorRegistry {
|
|
registry = observable.array<typeof BaseClusterDetector>([], { deep: false });
|
|
|
|
add(detectorClass: typeof BaseClusterDetector) {
|
|
this.registry.push(detectorClass);
|
|
}
|
|
|
|
async detectForCluster(cluster: Cluster): Promise<ClusterMetadata> {
|
|
const results: {[key: string]: ClusterDetectionResult } = {};
|
|
|
|
for (const detectorClass of this.registry) {
|
|
const detector = new detectorClass(cluster);
|
|
|
|
try {
|
|
const data = await detector.detect();
|
|
|
|
if (!data) continue;
|
|
const existingValue = results[detector.key];
|
|
|
|
if (existingValue && existingValue.accuracy > data.accuracy) continue; // previous value exists and is more accurate
|
|
results[detector.key] = data;
|
|
} catch (e) {
|
|
// detector raised error, do nothing
|
|
}
|
|
}
|
|
const metadata: ClusterMetadata = {};
|
|
|
|
for (const [key, result] of Object.entries(results)) {
|
|
metadata[key] = result.value;
|
|
}
|
|
|
|
return metadata;
|
|
}
|
|
}
|
|
|
|
export const detectorRegistry = new DetectorRegistry();
|
|
detectorRegistry.add(ClusterIdDetector);
|
|
detectorRegistry.add(LastSeenDetector);
|
|
detectorRegistry.add(VersionDetector);
|
|
detectorRegistry.add(DistributionDetector);
|
|
detectorRegistry.add(NodesCountDetector);
|