Merge pull request #31349 from IlyaSavich/kubernetes-router-extension
Add Kubernetes Router extension point, add fetcher to custom objects provider
This commit is contained in:
@@ -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,7 @@ export const kubernetesPlugin = createBackendPlugin({
|
||||
kubernetesServiceLocatorExtensionPoint,
|
||||
extPointServiceLocator,
|
||||
);
|
||||
env.registerExtensionPoint(kubernetesRouterExtensionPoint, extPointRouter);
|
||||
|
||||
env.registerInit({
|
||||
deps: {
|
||||
@@ -247,6 +270,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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -41,6 +41,7 @@ import {
|
||||
KubernetesClustersSupplier,
|
||||
KubernetesFetcher,
|
||||
KubernetesObjectsProvider,
|
||||
KubernetesRouterFactory,
|
||||
KubernetesServiceLocator,
|
||||
} from '@backstage/plugin-kubernetes-node';
|
||||
import { addResourceRoutesToRouter } from '../routes/resourcesRoutes';
|
||||
@@ -62,6 +63,7 @@ export interface KubernetesEnvironment {
|
||||
clusterSupplier: KubernetesClustersSupplier;
|
||||
serviceLocator: KubernetesServiceLocator;
|
||||
objectsProvider: KubernetesObjectsProvider;
|
||||
customRouter?: KubernetesRouterFactory;
|
||||
}
|
||||
|
||||
export class KubernetesRouter {
|
||||
@@ -86,6 +88,7 @@ export class KubernetesRouter {
|
||||
catalog,
|
||||
discovery,
|
||||
httpAuth,
|
||||
customRouter,
|
||||
} = this.env;
|
||||
|
||||
logger.info('Initializing Kubernetes backend');
|
||||
@@ -108,14 +111,31 @@ export class KubernetesRouter {
|
||||
authStrategyMap,
|
||||
);
|
||||
|
||||
return this.buildRouter(
|
||||
objectsProvider,
|
||||
clusterSupplier,
|
||||
catalog,
|
||||
proxy,
|
||||
permissions,
|
||||
httpAuth,
|
||||
authStrategyMap,
|
||||
return (
|
||||
customRouter?.({
|
||||
getDefault: () =>
|
||||
this.buildDefaultRouter(
|
||||
objectsProvider,
|
||||
clusterSupplier,
|
||||
catalog,
|
||||
proxy,
|
||||
permissions,
|
||||
httpAuth,
|
||||
authStrategyMap,
|
||||
),
|
||||
objectsProvider,
|
||||
clusterSupplier,
|
||||
authStrategyMap,
|
||||
}) ??
|
||||
this.buildDefaultRouter(
|
||||
objectsProvider,
|
||||
clusterSupplier,
|
||||
catalog,
|
||||
proxy,
|
||||
permissions,
|
||||
httpAuth,
|
||||
authStrategyMap,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -138,7 +158,7 @@ export class KubernetesRouter {
|
||||
});
|
||||
}
|
||||
|
||||
private buildRouter(
|
||||
private buildDefaultRouter(
|
||||
objectsProvider: KubernetesObjectsProvider,
|
||||
clusterSupplier: KubernetesClustersSupplier,
|
||||
catalog: CatalogService,
|
||||
|
||||
Reference in New Issue
Block a user