UNPKG

@gorizond/catalog-backend-module-fleet

Version:

Backstage catalog backend module for Rancher Fleet GitOps entities

113 lines (112 loc) 5.44 kB
"use strict"; /** * 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;