Make objectTypes configurable from app-config.yaml
Signed-off-by: Miklos Kiss <miklos.kiss@prezi.com>
This commit is contained in:
+9
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user