diff --git a/plugins/kubernetes-backend/src/auth/buildDefaultAuthStrategyMap.ts b/plugins/kubernetes-backend/src/auth/buildDefaultAuthStrategyMap.ts index 918cb759c3..4bd5cf97f3 100644 --- a/plugins/kubernetes-backend/src/auth/buildDefaultAuthStrategyMap.ts +++ b/plugins/kubernetes-backend/src/auth/buildDefaultAuthStrategyMap.ts @@ -39,7 +39,7 @@ export const buildDefaultAuthStrategyMap = ({ ['aws', new AwsIamStrategy({ config })], ['azure', new AzureIdentityStrategy(logger)], ['google', new GoogleStrategy()], - ['googleServiceAccount', new GoogleServiceAccountStrategy()], + ['googleServiceAccount', new GoogleServiceAccountStrategy({ config })], ['localKubectlProxy', new AnonymousStrategy()], ['oidc', new OidcStrategy()], ['serviceAccount', new ServiceAccountStrategy()], diff --git a/plugins/kubernetes-backend/src/plugin.ts b/plugins/kubernetes-backend/src/plugin.ts index f787f52f4a..7b2d157911 100644 --- a/plugins/kubernetes-backend/src/plugin.ts +++ b/plugins/kubernetes-backend/src/plugin.ts @@ -28,16 +28,20 @@ import { type KubernetesClustersSupplier, kubernetesClusterSupplierExtensionPoint, type KubernetesClusterSupplierExtensionPoint, + KubernetesClusterSupplierFactory, type KubernetesFetcher, kubernetesFetcherExtensionPoint, type KubernetesFetcherExtensionPoint, + KubernetesFetcherFactory, type KubernetesObjectsProvider, kubernetesObjectsProviderExtensionPoint, type KubernetesObjectsProviderExtensionPoint, + KubernetesObjectsProviderFactory, KubernetesObjectTypes, type KubernetesServiceLocator, kubernetesServiceLocatorExtensionPoint, type KubernetesServiceLocatorExtensionPoint, + KubernetesServiceLocatorFactory, ObjectToFetch, } from '@backstage/plugin-kubernetes-node'; import { KubernetesBuilder } from './service/KubernetesBuilder'; @@ -54,36 +58,22 @@ import { } from './service/KubernetesFanOutHandler'; class ObjectsProvider implements KubernetesObjectsProviderExtensionPoint { - private objectsProvider: - | (({ - getDefault, - clusterSupplier, - serviceLocator, - customResources, - objectTypesToFetch, - authStrategy, - }: { - getDefault: () => KubernetesObjectsProvider; - clusterSupplier: KubernetesClustersSupplier; - serviceLocator: KubernetesServiceLocator; - customResources: CustomResource[]; - objectTypesToFetch?: ObjectToFetch[]; - authStrategy: AuthenticationStrategy; - }) => KubernetesObjectsProvider) - | undefined; + private objectsProvider: KubernetesObjectsProviderFactory | undefined; getObjectsProvider() { return this.objectsProvider; } - addObjectsProvider(provider: KubernetesObjectsProvider) { + addObjectsProvider( + provider: KubernetesObjectsProvider | KubernetesObjectsProviderFactory, + ) { if (this.objectsProvider) { throw new Error( 'Multiple Kubernetes objects provider is not supported at this time', ); } if (typeof provider !== 'function') { - this.objectsProvider = () => provider; + this.objectsProvider = async () => provider; } else { this.objectsProvider = provider; } @@ -91,26 +81,24 @@ class ObjectsProvider implements KubernetesObjectsProviderExtensionPoint { } class ClusterSuplier implements KubernetesClusterSupplierExtensionPoint { - private clusterSupplier: - | (({ - getDefault, - }: { - getDefault: () => KubernetesClustersSupplier; - }) => KubernetesClustersSupplier) - | undefined; + private clusterSupplier: KubernetesClusterSupplierFactory | undefined; getClusterSupplier() { return this.clusterSupplier; } - addClusterSupplier(clusterSupplier: KubernetesClustersSupplier) { + addClusterSupplier( + clusterSupplier: + | KubernetesClustersSupplier + | KubernetesClusterSupplierFactory, + ) { if (this.clusterSupplier) { throw new Error( 'Multiple Kubernetes Cluster Suppliers is not supported at this time', ); } if (typeof clusterSupplier !== 'function') { - this.clusterSupplier = () => clusterSupplier; + this.clusterSupplier = async () => clusterSupplier; } else { this.clusterSupplier = clusterSupplier; } @@ -118,34 +106,20 @@ class ClusterSuplier implements KubernetesClusterSupplierExtensionPoint { } class Fetcher implements KubernetesFetcherExtensionPoint { - private fetcher: - | (({ - getDefault, - }: { - getDefault: () => KubernetesFetcher; - }) => KubernetesFetcher) - | undefined; + private fetcher: KubernetesFetcherFactory | undefined; getFetcher() { return this.fetcher; } - addFetcher( - fetcher: - | KubernetesFetcher - | (({ - getDefault, - }: { - getDefault: () => KubernetesFetcher; - }) => KubernetesFetcher), - ) { + addFetcher(fetcher: KubernetesFetcher | KubernetesFetcherFactory) { if (this.fetcher) { throw new Error( 'Multiple Kubernetes Fetchers is not supported at this time', ); } if (typeof fetcher !== 'function') { - this.fetcher = () => fetcher; + this.fetcher = async () => fetcher; } else { this.fetcher = fetcher; } @@ -153,21 +127,15 @@ class Fetcher implements KubernetesFetcherExtensionPoint { } class ServiceLocator implements KubernetesServiceLocatorExtensionPoint { - private serviceLocator: - | (({ - getDefault, - clusterSupplier, - }: { - getDefault: () => KubernetesServiceLocator; - clusterSupplier: KubernetesClustersSupplier; - }) => KubernetesServiceLocator) - | undefined; + private serviceLocator: KubernetesServiceLocatorFactory | undefined; getServiceLocator() { return this.serviceLocator; } - addServiceLocator(serviceLocator: KubernetesServiceLocator) { + addServiceLocator( + serviceLocator: KubernetesServiceLocator | KubernetesServiceLocatorFactory, + ) { if (this.serviceLocator) { throw new Error( 'Multiple Kubernetes Service Locators is not supported at this time', @@ -175,7 +143,7 @@ class ServiceLocator implements KubernetesServiceLocatorExtensionPoint { } if (typeof serviceLocator !== 'function') { - this.serviceLocator = () => serviceLocator; + this.serviceLocator = async () => serviceLocator; } else { this.serviceLocator = serviceLocator; } @@ -256,9 +224,9 @@ export const kubernetesPlugin = createBackendPlugin({ auth, httpAuth, }) { + // TODO: this could do with a cleanup and push some of this initalization somewhere else if (config.has('kubernetes')) { - // TODO: expose all of the customization & extension points of the builder here - const defaultFetcherFactory = () => + const defaultFetcherFactory = async () => new KubernetesClientBasedFetcher({ logger, }); @@ -280,7 +248,7 @@ export const kubernetesPlugin = createBackendPlugin({ minutes: 60, }); - const defaultClusterSupplierFactory = () => + const defaultClusterSupplierFactory = async () => getCombinedClusterSupplier( config, catalog, @@ -297,16 +265,16 @@ export const kubernetesPlugin = createBackendPlugin({ getDefault: defaultClusterSupplierFactory, }) ?? defaultClusterSupplierFactory(); - const defaultServiceLocatorFactory = () => + const defaultServiceLocatorFactory = async () => buildDefaultServiceLocator({ config, - clusterSupplier, + clusterSupplier: await clusterSupplier, }); const serviceLocator = extPointServiceLocator.getServiceLocator()?.({ getDefault: defaultServiceLocatorFactory, - clusterSupplier: clusterSupplier, + clusterSupplier: await clusterSupplier, }) ?? defaultServiceLocatorFactory(); const objectTypesToFetchStrings = config.getOptionalStringArray( @@ -347,12 +315,12 @@ export const kubernetesPlugin = createBackendPlugin({ } as CustomResource), ); - const defaultObjectsProviderFactory = () => + const defaultObjectsProviderFactory = async () => new KubernetesFanOutHandler({ logger, config, - fetcher, - serviceLocator, + fetcher: await fetcher, + serviceLocator: await serviceLocator, customResources, objectTypesToFetch, authStrategy: new DispatchStrategy({ @@ -362,9 +330,9 @@ export const kubernetesPlugin = createBackendPlugin({ const objectsProvider = extPointObjectsProvider.getObjectsProvider()?.({ - clusterSupplier, + clusterSupplier: await clusterSupplier, getDefault: defaultObjectsProviderFactory, - serviceLocator, + serviceLocator: await serviceLocator, customResources, objectTypesToFetch, authStrategy: new DispatchStrategy({ @@ -381,10 +349,10 @@ export const kubernetesPlugin = createBackendPlugin({ auth, httpAuth, authStrategyMap: Object.fromEntries(authStrategyMap.entries()), - fetcher, - clusterSupplier, - serviceLocator, - objectsProvider, + fetcher: await fetcher, + clusterSupplier: await clusterSupplier, + serviceLocator: await serviceLocator, + objectsProvider: await objectsProvider, }); const { router } = await builder.build(); diff --git a/plugins/kubernetes-node/report.api.md b/plugins/kubernetes-node/report.api.md index 74b462dea4..2e96057be8 100644 --- a/plugins/kubernetes-node/report.api.md +++ b/plugins/kubernetes-node/report.api.md @@ -100,17 +100,18 @@ export interface KubernetesClusterSupplierExtensionPoint { addClusterSupplier( clusterSupplier: | KubernetesClustersSupplier_2 - | (({ - getDefault, - }: { - getDefault: () => KubernetesClustersSupplier_2; - }) => KubernetesClustersSupplier_2), + | KubernetesClusterSupplierFactory, ): void; } // @public export const kubernetesClusterSupplierExtensionPoint: ExtensionPoint; +// @public +export type KubernetesClusterSupplierFactory = (opts: { + getDefault: () => Promise; +}) => Promise; + // @public export type KubernetesCredential = | { @@ -144,20 +145,17 @@ export interface KubernetesFetcher { // @public export interface KubernetesFetcherExtensionPoint { // (undocumented) - addFetcher( - fetcher: - | KubernetesFetcher_2 - | (({ - getDefault, - }: { - getDefault: () => KubernetesFetcher_2; - }) => KubernetesFetcher_2), - ): void; + addFetcher(fetcher: KubernetesFetcher_2 | KubernetesFetcherFactory): void; } // @public export const kubernetesFetcherExtensionPoint: ExtensionPoint; +// @public +export type KubernetesFetcherFactory = (opts: { + getDefault: () => Promise; +}) => Promise; + // @public (undocumented) export interface KubernetesObjectsByEntity { // (undocumented) @@ -188,29 +186,23 @@ export interface KubernetesObjectsProvider { export interface KubernetesObjectsProviderExtensionPoint { // (undocumented) addObjectsProvider( - provider: - | KubernetesObjectsProvider_2 - | (({ - getDefault, - clusterSupplier, - serviceLocator, - customResources, - objectTypesToFetch, - authStrategy, - }: { - getDefault: () => KubernetesObjectsProvider_2; - clusterSupplier: KubernetesClustersSupplier_2; - serviceLocator: KubernetesServiceLocator_2; - customResources: CustomResource_2[]; - objectTypesToFetch?: ObjectToFetch_2[]; - authStrategy: AuthenticationStrategy_2; - }) => KubernetesObjectsProvider_2), + provider: KubernetesObjectsProvider_2 | KubernetesObjectsProviderFactory, ): void; } // @public export const kubernetesObjectsProviderExtensionPoint: ExtensionPoint; +// @public +export type KubernetesObjectsProviderFactory = (opts: { + getDefault: () => Promise; + clusterSupplier: KubernetesClustersSupplier_2; + serviceLocator: KubernetesServiceLocator_2; + customResources: CustomResource_2[]; + objectTypesToFetch?: ObjectToFetch_2[]; + authStrategy: AuthenticationStrategy_2; +}) => Promise; + // @public (undocumented) export type KubernetesObjectTypes = | 'pods' @@ -246,19 +238,19 @@ export interface KubernetesServiceLocatorExtensionPoint { addServiceLocator( serviceLocator: | KubernetesServiceLocator_2 - | (({ - getDefault, - clusterSupplier, - }: { - getDefault: () => KubernetesServiceLocator_2; - clusterSupplier: KubernetesClustersSupplier_2; - }) => KubernetesServiceLocator_2), + | KubernetesServiceLocatorFactory, ): void; } // @public export const kubernetesServiceLocatorExtensionPoint: ExtensionPoint; +// @public +export type KubernetesServiceLocatorFactory = (opts: { + getDefault: () => Promise; + clusterSupplier: KubernetesClustersSupplier_2; +}) => Promise; + // @public (undocumented) export interface ObjectFetchParams { // (undocumented) diff --git a/plugins/kubernetes-node/src/extensions.ts b/plugins/kubernetes-node/src/extensions.ts index 86f5d0970b..6f112ece23 100644 --- a/plugins/kubernetes-node/src/extensions.ts +++ b/plugins/kubernetes-node/src/extensions.ts @@ -24,6 +24,20 @@ import { KubernetesServiceLocator, } from '@backstage/plugin-kubernetes-node'; +/** + * A factory function for creating a KubernetesObjectsProvider. + * + * @public + */ +export type KubernetesObjectsProviderFactory = (opts: { + getDefault: () => Promise; + clusterSupplier: KubernetesClustersSupplier; + serviceLocator: KubernetesServiceLocator; + customResources: CustomResource[]; + objectTypesToFetch?: ObjectToFetch[]; + authStrategy: AuthenticationStrategy; +}) => Promise; + /** * The interface for {@link kubernetesObjectsProviderExtensionPoint}. * @@ -31,23 +45,7 @@ import { */ export interface KubernetesObjectsProviderExtensionPoint { addObjectsProvider( - provider: - | KubernetesObjectsProvider - | (({ - getDefault, - clusterSupplier, - serviceLocator, - customResources, - objectTypesToFetch, - authStrategy, - }: { - getDefault: () => KubernetesObjectsProvider; - clusterSupplier: KubernetesClustersSupplier; - serviceLocator: KubernetesServiceLocator; - customResources: CustomResource[]; - objectTypesToFetch?: ObjectToFetch[]; - authStrategy: AuthenticationStrategy; - }) => KubernetesObjectsProvider), + provider: KubernetesObjectsProvider | KubernetesObjectsProviderFactory, ): void; } @@ -61,6 +59,15 @@ export const kubernetesObjectsProviderExtensionPoint = id: 'kubernetes.objects-provider', }); +/** + * A factory function for creating a KubernetesClustersSupplier. + * + * @public + */ +export type KubernetesClusterSupplierFactory = (opts: { + getDefault: () => Promise; +}) => Promise; + /** * The interface for {@link kubernetesClusterSupplierExtensionPoint}. * @@ -70,11 +77,7 @@ export interface KubernetesClusterSupplierExtensionPoint { addClusterSupplier( clusterSupplier: | KubernetesClustersSupplier - | (({ - getDefault, - }: { - getDefault: () => KubernetesClustersSupplier; - }) => KubernetesClustersSupplier), + | KubernetesClusterSupplierFactory, ): void; } @@ -107,21 +110,22 @@ export const kubernetesAuthStrategyExtensionPoint = id: 'kubernetes.auth-strategy', }); +/** + * A factory function for creating a KubernetesFetcher. + * + * @public + */ +export type KubernetesFetcherFactory = (opts: { + getDefault: () => Promise; +}) => Promise; + /** * The interface for {@link kubernetesFetcherExtensionPoint}. * * @public */ export interface KubernetesFetcherExtensionPoint { - addFetcher( - fetcher: - | KubernetesFetcher - | (({ - getDefault, - }: { - getDefault: () => KubernetesFetcher; - }) => KubernetesFetcher), - ): void; + addFetcher(fetcher: KubernetesFetcher | KubernetesFetcherFactory): void; } /** @@ -134,6 +138,16 @@ export const kubernetesFetcherExtensionPoint = id: 'kubernetes.fetcher', }); +/** + * A factory function for creating a KubernetesServiceLocator. + * + * @public + */ +export type KubernetesServiceLocatorFactory = (opts: { + getDefault: () => Promise; + clusterSupplier: KubernetesClustersSupplier; +}) => Promise; + /** * The interface for {@link kubernetesServiceLocatorExtensionPoint}. * @@ -141,15 +155,7 @@ export const kubernetesFetcherExtensionPoint = */ export interface KubernetesServiceLocatorExtensionPoint { addServiceLocator( - serviceLocator: - | KubernetesServiceLocator - | (({ - getDefault, - clusterSupplier, - }: { - getDefault: () => KubernetesServiceLocator; - clusterSupplier: KubernetesClustersSupplier; - }) => KubernetesServiceLocator), + serviceLocator: KubernetesServiceLocator | KubernetesServiceLocatorFactory, ): void; }