From 0dcd1dd64f5df9cebdfbe4e77bd982c329c33308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 21 Dec 2021 15:00:47 +0100 Subject: [PATCH] Introduce TaskScheduler into backends MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/slimy-snakes-drop.md | 41 +++++++++++++++++++ packages/backend/package.json | 1 + packages/backend/src/index.ts | 9 ++-- packages/backend/src/types.ts | 2 + packages/create-app/package.json | 1 + packages/create-app/src/lib/versions.ts | 2 + .../packages/backend/package.json.hbs | 1 + .../default-app/packages/backend/src/index.ts | 19 +++++++-- .../default-app/packages/backend/src/types.ts | 2 + 9 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 .changeset/slimy-snakes-drop.md diff --git a/.changeset/slimy-snakes-drop.md b/.changeset/slimy-snakes-drop.md new file mode 100644 index 0000000000..0e1d378454 --- /dev/null +++ b/.changeset/slimy-snakes-drop.md @@ -0,0 +1,41 @@ +--- +'@backstage/create-app': patch +--- + +Add a `scheduler` to the plugin environment, which can schedule collaborative tasks across backends. To apply the same change in your backend, follow the steps below. + +First install the package: + +```shell +# From the Backstage repository root +cd packages/backend +yarn add @backstage/backend-tasks +``` + +Add the scheduler to your plugin environment type: + +```diff + // In packages/backend/src/types.ts ++import { PluginTaskScheduler } from '@backstage/backend-tasks'; + + export type PluginEnvironment = { ++ scheduler: PluginTaskScheduler; +``` + +And finally make sure to add such an instance to each plugin's environment: + +```diff + // In packages/backend/src/index.ts ++import { TaskScheduler } from '@backstage/backend-tasks'; + + function makeCreateEnv(config: Config) { + // ... ++ const taskScheduler = TaskScheduler.fromConfig(config); + + return (plugin: string): PluginEnvironment => { + // ... ++ const scheduler = taskScheduler.forPlugin(plugin); + return { ++ scheduler, + // ... +``` diff --git a/packages/backend/package.json b/packages/backend/package.json index 279c19e7b6..4bdcad58f7 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@backstage/backend-common": "^0.10.0", + "@backstage/backend-tasks": "^0.1.0", "@backstage/catalog-client": "^0.5.3", "@backstage/catalog-model": "^0.9.8", "@backstage/config": "^0.1.10", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 94c2d88012..1942c36ad1 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -35,6 +35,7 @@ import { useHotMemoize, ServerTokenManager, } from '@backstage/backend-common'; +import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; import { metricsInit, metricsHandler } from './metrics'; @@ -68,16 +69,17 @@ function makeCreateEnv(config: Config) { discovery, tokenManager, }); - - root.info(`Created UrlReader ${reader}`); - const databaseManager = DatabaseManager.fromConfig(config); const cacheManager = CacheManager.fromConfig(config); + const taskScheduler = TaskScheduler.fromConfig(config); + + root.info(`Created UrlReader ${reader}`); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); const database = databaseManager.forPlugin(plugin); const cache = cacheManager.forPlugin(plugin); + const scheduler = taskScheduler.forPlugin(plugin); return { logger, cache, @@ -87,6 +89,7 @@ function makeCreateEnv(config: Config) { discovery, tokenManager, permissions, + scheduler, }; }; } diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index e3826d69ae..0b2543c4f5 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -24,6 +24,7 @@ import { UrlReader, } from '@backstage/backend-common'; import { ServerPermissionClient } from '@backstage/plugin-permission-node'; +import { PluginTaskScheduler } from '@backstage/backend-tasks'; export type PluginEnvironment = { logger: Logger; @@ -34,4 +35,5 @@ export type PluginEnvironment = { discovery: PluginEndpointDiscovery; tokenManager: TokenManager; permissions: ServerPermissionClient; + scheduler: PluginTaskScheduler; }; diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 3c4f403703..810df43f47 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -49,6 +49,7 @@ }, "peerDependencies": { "@backstage/backend-common": "*", + "@backstage/backend-tasks": "*", "@backstage/catalog-client": "*", "@backstage/catalog-model": "*", "@backstage/cli": "*", diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 6c85652c64..3765422923 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -32,6 +32,7 @@ leaving any imports in place. import { version as appDefaults } from '../../../app-defaults/package.json'; import { version as backendCommon } from '../../../backend-common/package.json'; +import { version as backendTasks } from '../../../backend-tasks/package.json'; import { version as catalogClient } from '../../../catalog-client/package.json'; import { version as catalogModel } from '../../../catalog-model/package.json'; import { version as cli } from '../../../cli/package.json'; @@ -71,6 +72,7 @@ import { version as pluginUserSettings } from '../../../../plugins/user-settings export const packageVersions = { '@backstage/app-defaults': appDefaults, '@backstage/backend-common': backendCommon, + '@backstage/backend-tasks': backendTasks, '@backstage/catalog-client': catalogClient, '@backstage/catalog-model': catalogModel, '@backstage/cli': cli, diff --git a/packages/create-app/templates/default-app/packages/backend/package.json.hbs b/packages/create-app/templates/default-app/packages/backend/package.json.hbs index 6f0726b0f8..a2ee89c546 100644 --- a/packages/create-app/templates/default-app/packages/backend/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/backend/package.json.hbs @@ -16,6 +16,7 @@ "dependencies": { "app": "0.0.0", "@backstage/backend-common": "^{{version '@backstage/backend-common'}}", + "@backstage/backend-tasks": "^{{version '@backstage/backend-tasks'}}", "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}", "@backstage/catalog-client": "^{{version '@backstage/catalog-client'}}", "@backstage/config": "^{{version '@backstage/config'}}", diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 3f12122a3f..fbeabcff36 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -19,6 +19,7 @@ import { UrlReaders, ServerTokenManager, } from '@backstage/backend-common'; +import { TaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import app from './plugins/app'; import auth from './plugins/auth'; @@ -33,18 +34,28 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - - root.info(`Created UrlReader ${reader}`); - const cacheManager = CacheManager.fromConfig(config); const databaseManager = DatabaseManager.fromConfig(config); const tokenManager = ServerTokenManager.noop(); + const taskScheduler = TaskScheduler.fromConfig(config); + + root.info(`Created UrlReader ${reader}`); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); const database = databaseManager.forPlugin(plugin); const cache = cacheManager.forPlugin(plugin); - return { logger, database, cache, config, reader, discovery, tokenManager }; + const scheduler = taskScheduler.forPlugin(plugin); + return { + logger, + database, + cache, + config, + reader, + discovery, + tokenManager, + scheduler, + }; }; } diff --git a/packages/create-app/templates/default-app/packages/backend/src/types.ts b/packages/create-app/templates/default-app/packages/backend/src/types.ts index b1e2e0a1df..c3d0158dc6 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/types.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/types.ts @@ -7,6 +7,7 @@ import { TokenManager, UrlReader, } from '@backstage/backend-common'; +import { PluginTaskScheduler } from '@backstage/backend-tasks'; export type PluginEnvironment = { logger: Logger; @@ -16,4 +17,5 @@ export type PluginEnvironment = { reader: UrlReader; discovery: PluginEndpointDiscovery; tokenManager: TokenManager; + scheduler: PluginTaskScheduler; };