Add Kubernetes Router extension point, add fetcher to custom objects provider

Signed-off-by: Ilya Savich <isavich@box.com>
This commit is contained in:
Ilya Savich
2025-10-07 18:06:10 +02:00
parent c16d83c70c
commit 7f9846fd55
6 changed files with 133 additions and 4 deletions
+27
View File
@@ -36,6 +36,9 @@ import {
kubernetesObjectsProviderExtensionPoint,
type KubernetesObjectsProviderExtensionPoint,
KubernetesObjectsProviderFactory,
KubernetesRouterExtensionPoint,
kubernetesRouterExtensionPoint,
KubernetesRouterFactory,
type KubernetesServiceLocator,
kubernetesServiceLocatorExtensionPoint,
type KubernetesServiceLocatorExtensionPoint,
@@ -157,6 +160,24 @@ class AuthStrategy implements KubernetesAuthStrategyExtensionPoint {
}
}
class CustomRouter implements KubernetesRouterExtensionPoint {
private router: KubernetesRouterFactory | undefined;
getRouter() {
return this.router;
}
addRouter(router: KubernetesRouterFactory) {
if (this.router) {
throw new Error(
'Multiple Kubernetes routers is not supported at this time',
);
}
this.router = router;
}
}
/**
* This is the backend plugin that provides the Kubernetes integration.
* @public
@@ -169,6 +190,7 @@ export const kubernetesPlugin = createBackendPlugin({
const extPointAuthStrategy = new AuthStrategy();
const extPointFetcher = new Fetcher();
const extPointServiceLocator = new ServiceLocator();
const extPointRouter = new CustomRouter()
env.registerExtensionPoint(
kubernetesObjectsProviderExtensionPoint,
@@ -190,6 +212,10 @@ export const kubernetesPlugin = createBackendPlugin({
kubernetesServiceLocatorExtensionPoint,
extPointServiceLocator,
);
env.registerExtensionPoint(
kubernetesRouterExtensionPoint,
extPointRouter,
);
env.registerInit({
deps: {
@@ -247,6 +273,7 @@ export const kubernetesPlugin = createBackendPlugin({
clusterSupplier,
serviceLocator,
objectsProvider,
customRouter: extPointRouter.getRouter(),
});
http.use(await router.getRouter());
@@ -209,6 +209,7 @@ export class KubernetesInitializer {
customResources,
objectTypesToFetch,
}),
fetcher,
clusterSupplier,
serviceLocator,
customResources,
@@ -28,6 +28,7 @@ import {
KubernetesFetcher,
KubernetesServiceLocator,
KubernetesCredential,
kubernetesRouterExtensionPoint,
} from '@backstage/plugin-kubernetes-node';
import {
HEADER_KUBERNETES_CLUSTER,
@@ -809,4 +810,39 @@ metadata:
'Unsupported kubernetes.serviceLocatorMethod "unsupported"',
);
});
it('custom router', async () => {
const { server } = await startTestBackend({
features: [
minimalValidConfigService,
import('@backstage/plugin-kubernetes-backend'),
createBackendModule({
pluginId: 'kubernetes',
moduleId: 'testRouter',
register(env) {
env.registerInit({
deps: { extension: kubernetesRouterExtensionPoint },
async init({ extension }) {
extension.addRouter(({ getDefault }) => {
const router = getDefault();
router.get('/test', (_req, res) => {
res.json({ status: 'ok' });
});
return router;
});
},
});
},
}),
],
});
app = server;
const response = await request(app).get('/api/kubernetes/test');
expect(response.body).toEqual({ status: 'ok' });
expect(response.status).toEqual(200);
});
});
@@ -40,7 +40,7 @@ import {
AuthMetadata,
KubernetesClustersSupplier,
KubernetesFetcher,
KubernetesObjectsProvider,
KubernetesObjectsProvider, KubernetesRouterFactory,
KubernetesServiceLocator,
} from '@backstage/plugin-kubernetes-node';
import { addResourceRoutesToRouter } from '../routes/resourcesRoutes';
@@ -62,6 +62,7 @@ export interface KubernetesEnvironment {
clusterSupplier: KubernetesClustersSupplier;
serviceLocator: KubernetesServiceLocator;
objectsProvider: KubernetesObjectsProvider;
customRouter?: KubernetesRouterFactory;
}
export class KubernetesRouter {
@@ -86,6 +87,7 @@ export class KubernetesRouter {
catalog,
discovery,
httpAuth,
customRouter,
} = this.env;
logger.info('Initializing Kubernetes backend');
@@ -108,7 +110,23 @@ export class KubernetesRouter {
authStrategyMap,
);
return this.buildRouter(
return customRouter?.({
getDefault: () => this.buildDefaultRouter(
objectsProvider,
clusterSupplier,
catalog,
proxy,
permissions,
httpAuth,
authStrategyMap,
),
objectsProvider,
clusterSupplier,
catalog,
permissions,
httpAuth,
authStrategyMap,
}) ?? this.buildDefaultRouter(
objectsProvider,
clusterSupplier,
catalog,
@@ -138,7 +156,7 @@ export class KubernetesRouter {
});
}
private buildRouter(
private buildDefaultRouter(
objectsProvider: KubernetesObjectsProvider,
clusterSupplier: KubernetesClustersSupplier,
catalog: CatalogService,