Make objectTypes configurable from app-config.yaml

Signed-off-by: Miklos Kiss <miklos.kiss@prezi.com>
This commit is contained in:
Miklos Kiss
2021-07-22 19:10:20 +02:00
parent 6d6ea89e81
commit 8cf1918ad1
3 changed files with 29 additions and 16 deletions
+9
View File
@@ -16,6 +16,15 @@
export interface Config {
kubernetes?: {
objectTypes?: Array<
| 'pods'
| 'services'
| 'configmaps'
| 'deployments'
| 'replicasets'
| 'horizontalpodautoscalers'
| 'ingresses'
>;
serviceLocatorMethod: {
type: 'multiTenant';
};
@@ -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>([
const DEFAULT_OBJECTS: KubernetesObjectTypes[] = [
'pods',
'services',
'configmaps',
@@ -34,44 +34,44 @@ const DEFAULT_OBJECTS = new Set<KubernetesObjectTypes>([
'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<KubernetesObjectTypes> = 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>[] = 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,
})
@@ -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);