From 8cf1918ad15abc3b6b04688370780c27a32518cc Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Thu, 22 Jul 2021 19:10:20 +0200 Subject: [PATCH 1/6] Make objectTypes configurable from app-config.yaml Signed-off-by: Miklos Kiss --- plugins/kubernetes-backend/schema.d.ts | 9 +++++++ .../src/service/KubernetesFanOutHandler.ts | 26 +++++++++---------- .../kubernetes-backend/src/service/router.ts | 10 ++++--- 3 files changed, 29 insertions(+), 16 deletions(-) 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/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 3039560aad..94e84440b6 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([ +const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [ 'pods', 'services', 'configmaps', @@ -34,44 +34,44 @@ const DEFAULT_OBJECTS = new Set([ 'replicasets', 'horizontalpodautoscalers', 'ingresses', -]); +]; 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[], + objectTypesToFetch: KubernetesObjectTypes[] = DEFAULT_OBJECTS, ) { 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' ] || requestBody.entity?.metadata?.name; - const clusterDetails: ClusterDetails[] = await this.serviceLocator.getClustersByServiceId( - entityName, - ); + const clusterDetails: ClusterDetails[] = + await this.serviceLocator.getClustersByServiceId(entityName); // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them const promises: Promise[] = clusterDetails.map(cd => { - const kubernetesAuthTranslator: KubernetesAuthTranslator = KubernetesAuthTranslatorGenerator.getKubernetesAuthTranslatorInstance( - cd.authProvider, - ); + const kubernetesAuthTranslator: KubernetesAuthTranslator = + KubernetesAuthTranslatorGenerator.getKubernetesAuthTranslatorInstance( + cd.authProvider, + ); return kubernetesAuthTranslator.decorateClusterDetailsWithAuth( cd, requestBody, @@ -98,7 +98,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..027faf03ae 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, @@ -70,9 +71,8 @@ export const makeRouter = ( const serviceId = req.params.serviceId; const requestBody: KubernetesRequestBody = req.body; try { - const response = await kubernetesFanOutHandler.getKubernetesObjectsByEntity( - requestBody, - ); + const response = + await kubernetesFanOutHandler.getKubernetesObjectsByEntity(requestBody); res.json(response); } catch (e) { logger.error( @@ -133,12 +133,16 @@ export async function createRouter( ); const serviceLocator = getServiceLocator(options.config, clusterDetails); + const objectTypes = options.config.getOptionalStringArray( + 'kubernetes.objectTypes', + ) as KubernetesObjectTypes[]; const kubernetesFanOutHandler = new KubernetesFanOutHandler( logger, fetcher, serviceLocator, customResources, + objectTypes, ); return makeRouter(logger, kubernetesFanOutHandler, clusterDetails); From a0a8d357176c98d68f4d43852ea2943657ee5d8a Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Fri, 23 Jul 2021 09:31:33 +0200 Subject: [PATCH 2/6] add changeset Signed-off-by: Miklos Kiss --- .changeset/purple-comics-fold.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/purple-comics-fold.md 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'] From 638a376f5360dfe97921b1c822061cd410b108ec Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Fri, 23 Jul 2021 10:03:30 +0200 Subject: [PATCH 3/6] use the correct prettier config Signed-off-by: Miklos Kiss --- .../src/service/KubernetesFanOutHandler.ts | 12 ++++++------ plugins/kubernetes-backend/src/service/router.ts | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 94e84440b6..5e27dac770 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -63,15 +63,15 @@ export class KubernetesFanOutHandler { 'backstage.io/kubernetes-id' ] || requestBody.entity?.metadata?.name; - const clusterDetails: ClusterDetails[] = - await this.serviceLocator.getClustersByServiceId(entityName); + const clusterDetails: ClusterDetails[] = await this.serviceLocator.getClustersByServiceId( + entityName, + ); // Execute all of these async actions simultaneously/without blocking sequentially as no common object is modified by them const promises: Promise[] = clusterDetails.map(cd => { - const kubernetesAuthTranslator: KubernetesAuthTranslator = - KubernetesAuthTranslatorGenerator.getKubernetesAuthTranslatorInstance( - cd.authProvider, - ); + const kubernetesAuthTranslator: KubernetesAuthTranslator = KubernetesAuthTranslatorGenerator.getKubernetesAuthTranslatorInstance( + cd.authProvider, + ); return kubernetesAuthTranslator.decorateClusterDetailsWithAuth( cd, requestBody, diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 027faf03ae..13094cf6ed 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -71,8 +71,9 @@ export const makeRouter = ( const serviceId = req.params.serviceId; const requestBody: KubernetesRequestBody = req.body; try { - const response = - await kubernetesFanOutHandler.getKubernetesObjectsByEntity(requestBody); + const response = await kubernetesFanOutHandler.getKubernetesObjectsByEntity( + requestBody, + ); res.json(response); } catch (e) { logger.error( From 07410d1e9b4bcaa07c2922dfdaf04810827b41c3 Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Tue, 27 Jul 2021 11:38:25 +0200 Subject: [PATCH 4/6] make KubernetesFanOutHandler params an object Signed-off-by: Miklos Kiss --- plugins/kubernetes-backend/src/index.ts | 2 ++ .../src/service/KubernetesFanOutHandler.ts | 24 ++++++++++++------- .../kubernetes-backend/src/service/router.ts | 8 +++---- 3 files changed, 22 insertions(+), 12 deletions(-) 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.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 5e27dac770..0774a015a1 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: KubernetesObjectTypes[] = [ +export const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [ 'pods', 'services', 'configmaps', @@ -36,6 +36,14 @@ const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [ '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; @@ -43,13 +51,13 @@ export class KubernetesFanOutHandler { private readonly customResources: CustomResource[]; private readonly objectTypesToFetch: KubernetesObjectTypes[]; - constructor( - logger: Logger, - fetcher: KubernetesFetcher, - serviceLocator: KubernetesServiceLocator, - customResources: CustomResource[], - objectTypesToFetch: KubernetesObjectTypes[] = DEFAULT_OBJECTS, - ) { + constructor({ + logger, + fetcher, + serviceLocator, + customResources, + objectTypesToFetch = DEFAULT_OBJECTS, + }: KubernetesFanOutHandlerOptions) { this.logger = logger; this.fetcher = fetcher; this.serviceLocator = serviceLocator; diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 13094cf6ed..8a1f2fe627 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -134,17 +134,17 @@ export async function createRouter( ); const serviceLocator = getServiceLocator(options.config, clusterDetails); - const objectTypes = options.config.getOptionalStringArray( + const objectTypesToFetch = options.config.getOptionalStringArray( 'kubernetes.objectTypes', ) as KubernetesObjectTypes[]; - const kubernetesFanOutHandler = new KubernetesFanOutHandler( + const kubernetesFanOutHandler = new KubernetesFanOutHandler({ logger, fetcher, serviceLocator, customResources, - objectTypes, - ); + objectTypesToFetch, + }); return makeRouter(logger, kubernetesFanOutHandler, clusterDetails); } From 7b46caff47ce9fc90d2c4a385402bc5563c10669 Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Fri, 30 Jul 2021 12:08:28 +0200 Subject: [PATCH 5/6] use object as params Signed-off-by: Miklos Kiss --- .../service/KubernetesFanOutHandler.test.ts | 48 +++++++++---------- .../src/service/KubernetesFanOutHandler.ts | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) 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 0774a015a1..0931d775d3 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -41,7 +41,7 @@ export interface KubernetesFanOutHandlerOptions { fetcher: KubernetesFetcher; serviceLocator: KubernetesServiceLocator; customResources: CustomResource[]; - objectTypesToFetch: KubernetesObjectTypes[]; + objectTypesToFetch?: KubernetesObjectTypes[]; } export class KubernetesFanOutHandler { From 12174412923256ac9dc39c8f2b358cb4f1b75229 Mon Sep 17 00:00:00 2001 From: Miklos Kiss Date: Fri, 30 Jul 2021 12:28:30 +0200 Subject: [PATCH 6/6] update api-report Signed-off-by: Miklos Kiss --- plugins/kubernetes-backend/api-report.md | 5 +++++ 1 file changed, 5 insertions(+) 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)