Expose types to handle Database management

This implements several types to own and manage databases on a database
server. The current SimpleDatabase* classes preserve the present
behaviour; future implementations can segregate databases to be owned by
different roles.
This commit is contained in:
Joel Low
2020-10-01 17:38:12 +08:00
parent af85ba3198
commit e277c5dfa5
10 changed files with 203 additions and 43 deletions
+12 -20
View File
@@ -24,17 +24,17 @@
import Router from 'express-promise-router';
import {
ensureDatabaseExists,
createDatabaseClient,
createServiceBuilder,
loadBackendConfig,
getRootLogger,
useHotMemoize,
notFoundHandler,
SingleDatabaseConfiguration,
SingleDatabaseManager,
SingleHostDiscovery,
UrlReaders,
} from '@backstage/backend-common';
import { ConfigReader, AppConfig } from '@backstage/config';
import { ConfigReader } from '@backstage/config';
import healthcheck from './plugins/healthcheck';
import auth from './plugins/auth';
import catalog from './plugins/catalog';
@@ -48,37 +48,29 @@ import graphql from './plugins/graphql';
import app from './plugins/app';
import { PluginEnvironment } from './types';
function makeCreateEnv(loadedConfigs: AppConfig[]) {
const config = ConfigReader.fromConfigs(loadedConfigs);
function makeCreateEnv(config: ConfigReader) {
const root = getRootLogger();
const reader = UrlReaders.default({ logger: root, config });
const discovery = SingleHostDiscovery.fromConfig(config);
root.info(`Created UrlReader ${reader}`);
const databaseConfig = new SingleDatabaseConfiguration(
config.getConfig('backend.database'),
);
const databaseManager = new SingleDatabaseManager(databaseConfig);
return (plugin: string): PluginEnvironment => {
const logger = root.child({ type: 'plugin', plugin });
const database = createDatabaseClient(
config.getConfig('backend.database'),
{
connection: {
database: `backstage_plugin_${plugin}`,
},
},
);
return { logger, database, config, reader, discovery };
const databaseFactory = databaseManager.getDatabaseFactory(plugin);
return { logger, database: databaseFactory, config, reader, discovery };
};
}
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 createEnv = makeCreateEnv(configReader);
const healthcheckEnv = useHotMemoize(module, () => createEnv('healthcheck'));
const catalogEnv = useHotMemoize(module, () => createEnv('catalog'));
+4 -1
View File
@@ -34,7 +34,10 @@ export default async function createPlugin({
}: PluginEnvironment) {
const locationReader = new LocationReaders({ logger, reader, config });
const db = await DatabaseManager.createDatabase(database, { logger });
const db = await DatabaseManager.createDatabase(
await database.getDatabase(),
{ logger },
);
const entitiesCatalog = new DatabaseEntitiesCatalog(db);
const locationsCatalog = new DatabaseLocationsCatalog(db);
const higherOrderOperation = new HigherOrderOperations(
+6 -3
View File
@@ -14,14 +14,17 @@
* limitations under the License.
*/
import Knex from 'knex';
import { Logger } from 'winston';
import { Config } from '@backstage/config';
import { PluginEndpointDiscovery, UrlReader } from '@backstage/backend-common';
import {
PluginDatabaseFactory,
PluginEndpointDiscovery,
UrlReader
} from '@backstage/backend-common';
export type PluginEnvironment = {
logger: Logger;
database: Knex;
database: PluginDatabaseFactory;
config: Config;
reader: UrlReader;
discovery: PluginEndpointDiscovery;