backend: add and use for external URL discovery

This commit is contained in:
Patrik Oldsberg
2020-09-24 23:43:08 +02:00
parent b0565777e9
commit 0e76ab7873
9 changed files with 44 additions and 29 deletions
+5 -3
View File
@@ -30,6 +30,7 @@ import {
getRootLogger,
useHotMemoize,
notFoundHandler,
SingleHostDiscovery,
} from '@backstage/backend-common';
import { ConfigReader, AppConfig } from '@backstage/config';
import healthcheck from './plugins/healthcheck';
@@ -59,7 +60,8 @@ function makeCreateEnv(loadedConfigs: AppConfig[]) {
},
},
);
return { logger, database, config };
const discovery = SingleHostDiscovery.fromConfig(config);
return { logger, database, config, discovery };
};
}
@@ -85,11 +87,11 @@ async function main() {
apiRouter.use('/rollbar', await rollbar(rollbarEnv));
apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv));
apiRouter.use('/sentry', await sentry(sentryEnv));
apiRouter.use('/auth', await auth(authEnv, '/api/auth'));
apiRouter.use('/auth', await auth(authEnv));
apiRouter.use('/identity', await identity(identityEnv));
apiRouter.use('/techdocs', await techdocs(techdocsEnv));
apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv));
apiRouter.use('/proxy', await proxy(proxyEnv, '/api/proxy'));
apiRouter.use('/proxy', await proxy(proxyEnv));
apiRouter.use('/graphql', await graphql(graphqlEnv));
apiRouter.use(notFoundHandler());
+7 -5
View File
@@ -17,9 +17,11 @@
import { createRouter } from '@backstage/plugin-auth-backend';
import { PluginEnvironment } from '../types';
export default async function createPlugin(
{ logger, database, config }: PluginEnvironment,
basePath: string,
) {
return await createRouter({ logger, config, database, basePath });
export default async function createPlugin({
logger,
database,
config,
discovery,
}: PluginEnvironment) {
return await createRouter({ logger, config, database, discovery });
}
+6 -5
View File
@@ -18,9 +18,10 @@
import { createRouter } from '@backstage/plugin-proxy-backend';
import { PluginEnvironment } from '../types';
export default async function createPlugin(
{ logger, config }: PluginEnvironment,
pathPrefix: string,
) {
return await createRouter({ logger, config, pathPrefix });
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment) {
return await createRouter({ logger, config, discovery });
}
+2
View File
@@ -17,9 +17,11 @@
import Knex from 'knex';
import { Logger } from 'winston';
import { Config } from '@backstage/config';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
export type PluginEnvironment = {
logger: Logger;
database: Knex;
config: Config;
discovery: PluginEndpointDiscovery;
};
+6 -5
View File
@@ -22,13 +22,16 @@ import { Logger } from 'winston';
import { createAuthProviderRouter } from '../providers';
import { Config } from '@backstage/config';
import { DatabaseKeyStore, TokenFactory, createOidcRouter } from '../identity';
import { NotFoundError } from '@backstage/backend-common';
import {
NotFoundError,
PluginEndpointDiscovery,
} from '@backstage/backend-common';
export interface RouterOptions {
logger: Logger;
database: Knex;
config: Config;
basePath?: string;
discovery: PluginEndpointDiscovery;
}
export async function createRouter(
@@ -38,9 +41,7 @@ export async function createRouter(
const logger = options.logger.child({ plugin: 'auth' });
const appUrl = options.config.getString('app.baseUrl');
const backendUrl = options.config.getString('backend.baseUrl');
// TODO(Rugvip): Replace with service discovery of external URL
const authUrl = backendUrl + (options.basePath ?? '/api/auth');
const authUrl = await options.discovery.getExternalBaseUrl('auth');
const keyDurationSeconds = 3600;
@@ -23,6 +23,7 @@ import {
createServiceBuilder,
useHotMemoize,
loadBackendConfig,
SingleHostDiscovery,
} from '@backstage/backend-common';
export interface ServerOptions {
@@ -34,6 +35,7 @@ export async function startStandaloneServer(
): Promise<Server> {
const logger = options.logger.child({ service: 'auth-backend' });
const config = ConfigReader.fromConfigs(await loadBackendConfig());
const discovery = SingleHostDiscovery.fromConfig(config);
const database = useHotMemoize(module, () => {
const knex = Knex({
@@ -52,6 +54,7 @@ export async function startStandaloneServer(
logger,
config,
database,
discovery,
});
const service = createServiceBuilder(module)
@@ -17,16 +17,20 @@
import { createRouter } from './router';
import * as winston from 'winston';
import { ConfigReader } from '@backstage/config';
import { loadBackendConfig } from '@backstage/backend-common';
import {
loadBackendConfig,
SingleHostDiscovery,
} from '@backstage/backend-common';
describe('createRouter', () => {
it('works', async () => {
const logger = winston.createLogger();
const config = ConfigReader.fromConfigs(await loadBackendConfig());
const discovery = SingleHostDiscovery.fromConfig(config);
const router = await createRouter({
config,
logger,
pathPrefix: '/proxy',
discovery,
});
expect(router).toBeDefined();
});
+6 -8
View File
@@ -23,12 +23,12 @@ import createProxyMiddleware, {
} from 'http-proxy-middleware';
import { Logger } from 'winston';
import http from 'http';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
export interface RouterOptions {
logger: Logger;
config: Config;
// The URL path prefix that the router itself is mounted as, commonly "/proxy"
pathPrefix: string;
discovery: PluginEndpointDiscovery;
}
export interface ProxyConfig extends ProxyMiddlewareConfig {
@@ -76,16 +76,14 @@ export async function createRouter(
): Promise<express.Router> {
const router = Router();
const externalUrl = await options.discovery.getExternalBaseUrl('proxy');
const { pathname: pathPrefix } = new URL(externalUrl);
const proxyConfig = options.config.getOptional('proxy') ?? {};
Object.entries(proxyConfig).forEach(([route, proxyRouteConfig]) => {
router.use(
route,
buildMiddleware(
options.pathPrefix,
options.logger,
route,
proxyRouteConfig,
),
buildMiddleware(pathPrefix, options.logger, route, proxyRouteConfig),
);
});
@@ -17,6 +17,7 @@
import {
createServiceBuilder,
loadBackendConfig,
SingleHostDiscovery,
} from '@backstage/backend-common';
import { Server } from 'http';
import { Logger } from 'winston';
@@ -37,10 +38,11 @@ export async function startStandaloneServer(
logger.debug('Creating application...');
const config = ConfigReader.fromConfigs(await loadBackendConfig());
const discovery = SingleHostDiscovery.fromConfig(config);
const router = await createRouter({
config,
logger,
pathPrefix: '/proxy',
discovery,
});
const service = createServiceBuilder(module)
.enableCors({ origin: 'http://localhost:3000' })