techdocs-backend: use endpoint discovery to look up catalog url

This commit is contained in:
Patrik Oldsberg
2020-09-24 23:59:38 +02:00
parent 0e76ab7873
commit 2a443ce68d
3 changed files with 25 additions and 9 deletions
+2
View File
@@ -29,6 +29,7 @@ import Docker from 'dockerode';
export default async function createPlugin({
logger,
config,
discovery,
}: PluginEnvironment) {
const generators = new Generators();
const techdocsGenerator = new TechdocsGenerator(logger, config);
@@ -51,5 +52,6 @@ export default async function createPlugin({
dockerClient,
logger,
config,
discovery,
});
}
+17 -8
View File
@@ -26,7 +26,10 @@ import {
PublisherBase,
LocalPublish,
} from '../techdocs';
import { resolvePackagePath } from '@backstage/backend-common';
import {
PluginEndpointDiscovery,
resolvePackagePath,
} from '@backstage/backend-common';
import { Entity } from '@backstage/catalog-model';
import { DocsBuilder } from './helpers';
@@ -35,6 +38,7 @@ type RouterOptions = {
generators: GeneratorBuilder;
publisher: PublisherBase;
logger: Logger;
discovery: PluginEndpointDiscovery;
database?: Knex; // TODO: Make database required when we're implementing database stuff.
config: Config;
dockerClient: Docker;
@@ -52,20 +56,25 @@ export async function createRouter({
config,
dockerClient,
logger,
discovery,
}: RouterOptions): Promise<express.Router> {
const router = Router();
router.get('/docs/:kind/:namespace/:name/*', async (req, res) => {
const baseUrl = config.getString('backend.baseUrl');
const storageUrl = config.getString('techdocs.storageUrl');
const { kind, namespace, name } = req.params;
const entity = (await (
await fetch(
`${baseUrl}/api/catalog/entities/by-name/${kind}/${namespace}/${name}`,
)
).json()) as Entity;
const catalogUrl = await discovery.getBaseUrl('catalog');
const triple = [kind, namespace, name].map(encodeURIComponent).join('/');
const catalogRes = await fetch(`${catalogUrl}/entities/by-name/${triple}`);
if (!catalogRes.ok) {
catalogRes.body.pipe(res.status(catalogRes.status));
return;
}
const entity: Entity = await catalogRes.json();
const docsBuilder = new DocsBuilder({
preparers,
@@ -80,7 +89,7 @@ export async function createRouter({
await docsBuilder.build();
}
return res.redirect(`${storageUrl}${req.path.replace('/docs', '')}`);
res.redirect(`${storageUrl}${req.path.replace('/docs', '')}`);
});
if (publisher instanceof LocalPublish) {
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { createServiceBuilder } from '@backstage/backend-common';
import {
createServiceBuilder,
SingleHostDiscovery,
} from '@backstage/backend-common';
import { Server } from 'http';
import { Logger } from 'winston';
import { createRouter } from './router';
@@ -39,6 +42,7 @@ export async function startStandaloneServer(
): Promise<Server> {
const logger = options.logger.child({ service: 'techdocs-backend' });
const config = ConfigReader.fromConfigs([]);
const discovery = SingleHostDiscovery.fromConfig(config);
logger.debug('Creating application...');
const preparers = new Preparers();
@@ -61,6 +65,7 @@ export async function startStandaloneServer(
publisher,
dockerClient,
config,
discovery,
});
const service = createServiceBuilder(module)
.enableCors({ origin: 'http://localhost:3000' })