@gorizond/catalog-backend-module-fleet
Version:
Backstage catalog backend module for Rancher Fleet GitOps entities
113 lines (112 loc) • 5.44 kB
JavaScript
;
/**
* Backstage Kubernetes Backend Module for Fleet K8s Cluster Supplier
*
* This module provides a KubernetesClustersSupplier that dynamically discovers
* Rancher downstream clusters and injects them into the Kubernetes backend.
*
* @packageDocumentation
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.kubernetesModuleFleetClusterSupplier = void 0;
const backend_plugin_api_1 = require("@backstage/backend-plugin-api");
const plugin_kubernetes_node_1 = require("@backstage/plugin-kubernetes-node");
const k8sLocator_1 = require("./k8sLocator");
const luxon_1 = require("luxon");
/**
* Kubernetes backend module that provides Fleet-discovered clusters.
*
* @example
* ```ts
* // In packages/backend/src/index.ts
* import { createBackend } from '@backstage/backend-defaults';
*
* const backend = createBackend();
* backend.add(import('@backstage/plugin-kubernetes-backend'));
* backend.add(import('@gorizond/catalog-backend-module-fleet/kubernetes'));
* backend.start();
* ```
*
* @public
*/
exports.kubernetesModuleFleetClusterSupplier = (0, backend_plugin_api_1.createBackendModule)({
pluginId: "kubernetes",
moduleId: "fleet-cluster-supplier",
register(env) {
env.registerInit({
deps: {
config: backend_plugin_api_1.coreServices.rootConfig,
logger: backend_plugin_api_1.coreServices.logger,
scheduler: backend_plugin_api_1.coreServices.scheduler,
clusterSupplier: plugin_kubernetes_node_1.kubernetesClusterSupplierExtensionPoint,
},
async init({ config, logger, scheduler, clusterSupplier }) {
const k8sLocator = k8sLocator_1.FleetK8sLocator.fromConfig({ config, logger });
if (!k8sLocator) {
logger.info("FleetK8sLocator not configured. Skipping fleet cluster supplier.");
return;
}
// Cache for discovered clusters
let cachedClusters = [];
// Helper function to convert locator clusters to ClusterDetails
const convertToClusterDetails = (clusters) => {
return clusters.map((c) => ({
name: c.name,
url: c.url,
authMetadata: {
// The serviceAccount auth provider expects the token in this format
serviceAccountToken: c.serviceAccountToken,
},
caData: c.caData,
skipTLSVerify: c.skipTLSVerify,
skipMetricsLookup: false,
customResources: c.customResources,
}));
};
// Initial discovery
try {
const clusterMethods = await k8sLocator.asClusterLocatorMethods();
const clusters = clusterMethods.flatMap((m) => m.clusters);
cachedClusters = convertToClusterDetails(clusters);
logger.info(`FleetK8sLocator initially discovered ${cachedClusters.length} Kubernetes clusters`);
}
catch (error) {
logger.warn(`FleetK8sLocator initial discovery failed: ${error}`);
}
// Get refresh interval from config or default to 5 minutes
const refreshIntervalStr = config.getOptionalString("catalog.providers.fleetK8sLocator.refreshInterval");
const refreshInterval = refreshIntervalStr
? luxon_1.Duration.fromISO(refreshIntervalStr)
: luxon_1.Duration.fromObject({ minutes: 5 });
// Schedule periodic refresh
await scheduler.scheduleTask({
id: "fleet:k8sLocator:refresh",
frequency: refreshInterval,
timeout: { minutes: 2 },
initialDelay: { seconds: 15 },
fn: async () => {
try {
const clusterMethods = await k8sLocator.asClusterLocatorMethods();
const clusters = clusterMethods.flatMap((m) => m.clusters);
cachedClusters = convertToClusterDetails(clusters);
logger.info(`FleetK8sLocator refreshed ${cachedClusters.length} Kubernetes clusters for kubernetes backend`);
}
catch (error) {
logger.warn(`FleetK8sLocator refresh failed: ${error}`);
}
},
});
logger.info(`Scheduled FleetK8sLocator refresh every ${refreshInterval.toISO()} for kubernetes cluster supplier`);
// Register the cluster supplier with kubernetes backend
clusterSupplier.addClusterSupplier({
async getClusters() {
logger.debug(`action=loadClusterDetails numOfClustersLoaded=${cachedClusters.length}`);
return cachedClusters;
},
});
logger.info(`Registered FleetK8sLocator as kubernetes cluster supplier`);
},
});
},
});
exports.default = exports.kubernetesModuleFleetClusterSupplier;