Merge pull request #2674 from lowjoel/postgres-create-database

Auto-create plugin databases
This commit is contained in:
Fredrik Adelöw
2020-10-01 11:17:11 +02:00
committed by GitHub
4 changed files with 66 additions and 1 deletions
@@ -17,7 +17,7 @@
import knex from 'knex';
import { Config } from '@backstage/config';
import { mergeDatabaseConfig } from './config';
import { createPgDatabaseClient } from './postgres';
import { createPgDatabaseClient, ensurePgDatabaseExists } from './postgres';
import { createSqliteDatabaseClient } from './sqlite3';
type DatabaseClient = 'pg' | 'sqlite3' | string;
@@ -48,3 +48,19 @@ export function createDatabaseClient(
* @deprecated Use createDatabaseClient instead
*/
export const createDatabase = createDatabaseClient;
/**
* Ensures that the given databases all exist, creating them if they do not.
*/
export async function ensureDatabaseExists(
dbConfig: Config,
...databases: Array<string>
) {
const client: DatabaseClient = dbConfig.getString('client');
if (client === 'pg') {
return ensurePgDatabaseExists(dbConfig, ...databases);
}
return undefined;
}
@@ -95,3 +95,39 @@ function requirePgConnectionString() {
throw new Error(`${message}\n${e.message}`);
}
}
/**
* Creates the missing Postgres database if it does not exist
*
* @param dbConfig The database config
* @param databases The name of the databases to create
*/
export async function ensurePgDatabaseExists(
dbConfig: Config,
...databases: Array<string>
) {
const admin = createPgDatabaseClient(dbConfig, {
connection: {
database: 'postgres',
},
});
try {
const ensureDatabase = async (database: string) => {
const result = await admin
.from('pg_database')
.where('datname', database)
.count<Record<string, { count: string }>>();
if (parseInt(result[0].count, 10) > 0) {
return;
}
await admin.raw(`CREATE DATABASE ??`, [database]);
};
await Promise.all(databases.map(ensureDatabase));
} finally {
await admin.destroy();
}
}
+7
View File
@@ -24,6 +24,7 @@
import Router from 'express-promise-router';
import {
ensureDatabaseExists,
createDatabaseClient,
createServiceBuilder,
loadBackendConfig,
@@ -68,6 +69,12 @@ async function main() {
const configs = await loadBackendConfig();
const configReader = ConfigReader.fromConfigs(configs);
const createEnv = makeCreateEnv(configs);
await ensureDatabaseExists(
configReader.getConfig('backend.database'),
'backstage_plugin_catalog',
'backstage_plugin_auth',
);
const healthcheckEnv = useHotMemoize(module, () => createEnv('healthcheck'));
const catalogEnv = useHotMemoize(module, () => createEnv('catalog'));
const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder'));
@@ -8,6 +8,7 @@
import Router from 'express-promise-router';
import {
ensureDatabaseExists,
createDatabaseClient,
createServiceBuilder,
loadBackendConfig,
@@ -46,6 +47,11 @@ async function main() {
const configs = await loadBackendConfig();
const configReader = ConfigReader.fromConfigs(configs);
const createEnv = makeCreateEnv(configs);
await ensureDatabaseExists(
configReader.getConfig('backend.database'),
'backstage_plugin_catalog',
'backstage_plugin_auth',
);
const catalogEnv = useHotMemoize(module, () => createEnv('catalog'));
const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder'));