diff --git a/.changeset/purple-comics-fold.md b/.changeset/purple-comics-fold.md new file mode 100644 index 0000000000..f5e02d64db --- /dev/null +++ b/.changeset/purple-comics-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Add configuration option to the kubernetes object types. Config option is under `kubernetes.resources`. Defaults to ['pods', 'services', 'configmaps', 'deployments', 'replicasets', 'horizontalpodautoscalers', 'ingresses'] diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index 72d80050d8..899f1fff00 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -51,6 +51,11 @@ export interface CustomResource { plural: string; } +// Warning: (ae-missing-release-tag) "DEFAULT_OBJECTS" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const DEFAULT_OBJECTS: KubernetesObjectTypes[]; + // Warning: (ae-missing-release-tag) "FetchResponseWrapper" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/plugins/kubernetes-backend/schema.d.ts b/plugins/kubernetes-backend/schema.d.ts index 9d002670b9..8b96d5ceca 100644 --- a/plugins/kubernetes-backend/schema.d.ts +++ b/plugins/kubernetes-backend/schema.d.ts @@ -16,6 +16,15 @@ export interface Config { kubernetes?: { + objectTypes?: Array< + | 'pods' + | 'services' + | 'configmaps' + | 'deployments' + | 'replicasets' + | 'horizontalpodautoscalers' + | 'ingresses' + >; serviceLocatorMethod: { type: 'multiTenant'; }; diff --git a/plugins/kubernetes-backend/src/index.ts b/plugins/kubernetes-backend/src/index.ts index 155c4967d5..e5eb5e7c62 100644 --- a/plugins/kubernetes-backend/src/index.ts +++ b/plugins/kubernetes-backend/src/index.ts @@ -16,3 +16,5 @@ export * from './service/router'; export * from './types/types'; + +export { DEFAULT_OBJECTS } from './service/KubernetesFanOutHandler'; diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts index 666b441226..a867efaaee 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.test.ts @@ -129,16 +129,16 @@ describe('handleGetKubernetesObjectsForService', () => { mockFetch(fetchObjectsForService); - const sut = new KubernetesFanOutHandler( - getVoidLogger(), - { + const sut = new KubernetesFanOutHandler({ + logger: getVoidLogger(), + fetcher: { fetchObjectsForService, }, - { + serviceLocator: { getClustersByServiceId, }, - [], - ); + customResources: [], + }); const result = await sut.getKubernetesObjectsByEntity({ entity: { @@ -221,16 +221,16 @@ describe('handleGetKubernetesObjectsForService', () => { mockFetch(fetchObjectsForService); - const sut = new KubernetesFanOutHandler( - getVoidLogger(), - { + const sut = new KubernetesFanOutHandler({ + logger: getVoidLogger(), + fetcher: { fetchObjectsForService, }, - { + serviceLocator: { getClustersByServiceId, }, - [], - ); + customResources: [], + }); const result = await sut.getKubernetesObjectsByEntity({ auth: { @@ -357,16 +357,16 @@ describe('handleGetKubernetesObjectsForService', () => { mockFetch(fetchObjectsForService); - const sut = new KubernetesFanOutHandler( - getVoidLogger(), - { + const sut = new KubernetesFanOutHandler({ + logger: getVoidLogger(), + fetcher: { fetchObjectsForService, }, - { + serviceLocator: { getClustersByServiceId, }, - [], - ); + customResources: [], + }); const result = await sut.getKubernetesObjectsByEntity({ auth: { @@ -497,16 +497,16 @@ describe('handleGetKubernetesObjectsForService', () => { mockFetch(fetchObjectsForService); - const sut = new KubernetesFanOutHandler( - getVoidLogger(), - { + const sut = new KubernetesFanOutHandler({ + logger: getVoidLogger(), + fetcher: { fetchObjectsForService, }, - { + serviceLocator: { getClustersByServiceId, }, - [], - ); + customResources: [], + }); const result = await sut.getKubernetesObjectsByEntity({ auth: { diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 3039560aad..0931d775d3 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -26,7 +26,7 @@ import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { KubernetesAuthTranslator } from '../kubernetes-auth-translator/types'; import { KubernetesAuthTranslatorGenerator } from '../kubernetes-auth-translator/KubernetesAuthTranslatorGenerator'; -const DEFAULT_OBJECTS = new Set([ +export const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [ 'pods', 'services', 'configmaps', @@ -34,30 +34,38 @@ const DEFAULT_OBJECTS = new Set([ 'replicasets', 'horizontalpodautoscalers', 'ingresses', -]); +]; + +export interface KubernetesFanOutHandlerOptions { + logger: Logger; + fetcher: KubernetesFetcher; + serviceLocator: KubernetesServiceLocator; + customResources: CustomResource[]; + objectTypesToFetch?: KubernetesObjectTypes[]; +} export class KubernetesFanOutHandler { private readonly logger: Logger; private readonly fetcher: KubernetesFetcher; private readonly serviceLocator: KubernetesServiceLocator; private readonly customResources: CustomResource[]; + private readonly objectTypesToFetch: KubernetesObjectTypes[]; - constructor( - logger: Logger, - fetcher: KubernetesFetcher, - serviceLocator: KubernetesServiceLocator, - customResources: CustomResource[], - ) { + constructor({ + logger, + fetcher, + serviceLocator, + customResources, + objectTypesToFetch = DEFAULT_OBJECTS, + }: KubernetesFanOutHandlerOptions) { this.logger = logger; this.fetcher = fetcher; this.serviceLocator = serviceLocator; this.customResources = customResources; + this.objectTypesToFetch = objectTypesToFetch; } - async getKubernetesObjectsByEntity( - requestBody: KubernetesRequestBody, - objectTypesToFetch: Set = DEFAULT_OBJECTS, - ) { + async getKubernetesObjectsByEntity(requestBody: KubernetesRequestBody) { const entityName = requestBody.entity?.metadata?.annotations?.[ 'backstage.io/kubernetes-id' @@ -98,7 +106,7 @@ export class KubernetesFanOutHandler { .fetchObjectsForService({ serviceId: entityName, clusterDetails: clusterDetailsItem, - objectTypesToFetch, + objectTypesToFetch: new Set(this.objectTypesToFetch), labelSelector, customResources: this.customResources, }) diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 984b3f14a0..8a1f2fe627 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -23,6 +23,7 @@ import { MultiTenantServiceLocator } from '../service-locator/MultiTenantService import { ClusterDetails, KubernetesClustersSupplier, + KubernetesObjectTypes, KubernetesServiceLocator, ServiceLocatorMethod, CustomResource, @@ -133,13 +134,17 @@ export async function createRouter( ); const serviceLocator = getServiceLocator(options.config, clusterDetails); + const objectTypesToFetch = options.config.getOptionalStringArray( + 'kubernetes.objectTypes', + ) as KubernetesObjectTypes[]; - const kubernetesFanOutHandler = new KubernetesFanOutHandler( + const kubernetesFanOutHandler = new KubernetesFanOutHandler({ logger, fetcher, serviceLocator, customResources, - ); + objectTypesToFetch, + }); return makeRouter(logger, kubernetesFanOutHandler, clusterDetails); }