Merge pull request #6589 from kissmikijr/make-object-types-configurable

Kubernetes: Make objectTypes configurable from app-config.yaml
This commit is contained in:
Ben Lambert
2021-07-30 13:18:51 +02:00
committed by GitHub
7 changed files with 73 additions and 39 deletions
+5
View File
@@ -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']
+5
View File
@@ -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)
+9
View File
@@ -16,6 +16,15 @@
export interface Config {
kubernetes?: {
objectTypes?: Array<
| 'pods'
| 'services'
| 'configmaps'
| 'deployments'
| 'replicasets'
| 'horizontalpodautoscalers'
| 'ingresses'
>;
serviceLocatorMethod: {
type: 'multiTenant';
};
+2
View File
@@ -16,3 +16,5 @@
export * from './service/router';
export * from './types/types';
export { DEFAULT_OBJECTS } from './service/KubernetesFanOutHandler';
@@ -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: {
@@ -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<KubernetesObjectTypes>([
export const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [
'pods',
'services',
'configmaps',
@@ -34,30 +34,38 @@ const DEFAULT_OBJECTS = new Set<KubernetesObjectTypes>([
'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<KubernetesObjectTypes> = 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,
})
@@ -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);
}