diff --git a/.changeset/great-clouds-hang.md b/.changeset/great-clouds-hang.md new file mode 100644 index 0000000000..4e8bf28d9d --- /dev/null +++ b/.changeset/great-clouds-hang.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Exposed `DefaultSchedulerService` diff --git a/.changeset/shaggy-mugs-kiss.md b/.changeset/shaggy-mugs-kiss.md new file mode 100644 index 0000000000..8f0e800acd --- /dev/null +++ b/.changeset/shaggy-mugs-kiss.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-tasks': patch +--- + +More detailed deprecation messages diff --git a/packages/backend-defaults/api-report-scheduler.md b/packages/backend-defaults/api-report-scheduler.md index a2dad43d60..58991ddca3 100644 --- a/packages/backend-defaults/api-report-scheduler.md +++ b/packages/backend-defaults/api-report-scheduler.md @@ -3,9 +3,20 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { DatabaseService } from '@backstage/backend-plugin-api'; +import { LoggerService } from '@backstage/backend-plugin-api'; import { SchedulerService } from '@backstage/backend-plugin-api'; import { ServiceFactory } from '@backstage/backend-plugin-api'; +// @public +export class DefaultSchedulerService { + // (undocumented) + static create(options: { + database: DatabaseService; + logger: LoggerService; + }): SchedulerService; +} + // @public export const schedulerServiceFactory: () => ServiceFactory< SchedulerService, diff --git a/packages/backend-defaults/src/entrypoints/scheduler/index.ts b/packages/backend-defaults/src/entrypoints/scheduler/index.ts index 77d4ea561d..dff53a19b4 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/index.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/index.ts @@ -14,4 +14,5 @@ * limitations under the License. */ +export { DefaultSchedulerService } from './lib/DefaultSchedulerService'; export { schedulerServiceFactory } from './schedulerServiceFactory'; diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.test.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.test.ts similarity index 77% rename from packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.test.ts rename to packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.test.ts index d286eaee38..63b900fab2 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.test.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.test.ts @@ -14,37 +14,38 @@ * limitations under the License. */ -import { DatabaseManager, getVoidLogger } from '@backstage/backend-common'; -import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; +import { + TestDatabaseId, + TestDatabases, + mockServices, +} from '@backstage/backend-test-utils'; import { Duration } from 'luxon'; import waitForExpect from 'wait-for-expect'; -import { TaskScheduler } from './TaskScheduler'; +import { DefaultSchedulerService } from './DefaultSchedulerService'; import { createTestScopedSignal } from './__testUtils__/createTestScopedSignal'; +import { DatabaseService } from '@backstage/backend-plugin-api'; jest.setTimeout(60_000); describe('TaskScheduler', () => { - const logger = getVoidLogger(); + const logger = mockServices.logger.mock(); const databases = TestDatabases.create(); const testScopedSignal = createTestScopedSignal(); async function createDatabase( databaseId: TestDatabaseId, - ): Promise { + ): Promise { const knex = await databases.init(databaseId); - const databaseManager: Partial = { - forPlugin: () => ({ - getClient: async () => knex, - }), + return { + getClient: async () => knex, }; - return databaseManager as DatabaseManager; } it.each(databases.eachSupportedId())( 'can return a working v1 plugin impl, %p', async databaseId => { const database = await createDatabase(databaseId); - const manager = new TaskScheduler(database, logger).forPlugin('test'); + const manager = DefaultSchedulerService.create({ database, logger }); const fn = jest.fn(); await manager.scheduleTask({ @@ -65,7 +66,7 @@ describe('TaskScheduler', () => { 'can return a working v2 plugin impl, %p', async databaseId => { const database = await createDatabase(databaseId); - const manager = new TaskScheduler(database, logger).forPlugin('test'); + const manager = DefaultSchedulerService.create({ database, logger }); const fn = jest.fn(); await manager.scheduleTask({ diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.ts new file mode 100644 index 0000000000..8e2ac5cd07 --- /dev/null +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/DefaultSchedulerService.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + DatabaseService, + LoggerService, + SchedulerService, +} from '@backstage/backend-plugin-api'; +import { once } from 'lodash'; +import { Duration } from 'luxon'; +import { migrateBackendTasks } from '../database/migrateBackendTasks'; +import { PluginTaskSchedulerImpl } from './PluginTaskSchedulerImpl'; +import { PluginTaskSchedulerJanitor } from './PluginTaskSchedulerJanitor'; + +/** + * Default implementation of the task scheduler service. + * + * @public + */ +export class DefaultSchedulerService { + static create(options: { + database: DatabaseService; + logger: LoggerService; + }): SchedulerService { + const databaseFactory = once(async () => { + const knex = await options.database.getClient(); + + if (!options.database.migrations?.skip) { + await migrateBackendTasks(knex); + } + + if (process.env.NODE_ENV !== 'test') { + const janitor = new PluginTaskSchedulerJanitor({ + knex, + waitBetweenRuns: Duration.fromObject({ minutes: 1 }), + logger: options.logger, + }); + janitor.start(); + } + + return knex; + }); + + return new PluginTaskSchedulerImpl(databaseFactory, options.logger); + } +} diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.ts deleted file mode 100644 index 21a19ce700..0000000000 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/TaskScheduler.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - DatabaseManager, - getRootLogger, - LegacyRootDatabaseService, - PluginDatabaseManager, -} from '@backstage/backend-common'; -import { - LoggerService, - RootConfigService, - SchedulerService, -} from '@backstage/backend-plugin-api'; -import { once } from 'lodash'; -import { Duration } from 'luxon'; -import { migrateBackendTasks } from '../database/migrateBackendTasks'; -import { PluginTaskSchedulerImpl } from './PluginTaskSchedulerImpl'; -import { PluginTaskSchedulerJanitor } from './PluginTaskSchedulerJanitor'; - -/** - * Deals with the scheduling of distributed tasks. - */ -export class TaskScheduler { - static fromConfig( - config: RootConfigService, - options?: { - databaseManager?: LegacyRootDatabaseService; - logger?: LoggerService; - }, - ): TaskScheduler { - const databaseManager = - options?.databaseManager ?? DatabaseManager.fromConfig(config); - const logger = (options?.logger || getRootLogger()).child({ - type: 'taskManager', - }); - return new TaskScheduler(databaseManager, logger); - } - - constructor( - private readonly databaseManager: LegacyRootDatabaseService, - private readonly logger: LoggerService, - ) {} - - /** - * Instantiates a task manager instance for the given plugin. - * - * @param pluginId - The unique ID of the plugin, for example "catalog" - * @returns A {@link SchedulerService} instance - */ - forPlugin(pluginId: string): SchedulerService { - return TaskScheduler.forPlugin({ - pluginId, - databaseManager: this.databaseManager.forPlugin(pluginId), - logger: this.logger, - }); - } - - static forPlugin(opts: { - pluginId: string; - databaseManager: PluginDatabaseManager; - logger: LoggerService; - }): SchedulerService { - const databaseFactory = once(async () => { - const knex = await opts.databaseManager.getClient(); - - if (!opts.databaseManager.migrations?.skip) { - await migrateBackendTasks(knex); - } - - if (process.env.NODE_ENV !== 'test') { - const janitor = new PluginTaskSchedulerJanitor({ - knex, - waitBetweenRuns: Duration.fromObject({ minutes: 1 }), - logger: opts.logger, - }); - janitor.start(); - } - - return knex; - }); - - return new PluginTaskSchedulerImpl(databaseFactory, opts.logger); - } -} diff --git a/packages/backend-defaults/src/entrypoints/scheduler/schedulerServiceFactory.ts b/packages/backend-defaults/src/entrypoints/scheduler/schedulerServiceFactory.ts index 55c0d58e7b..1105c86332 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/schedulerServiceFactory.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/schedulerServiceFactory.ts @@ -18,7 +18,7 @@ import { coreServices, createServiceFactory, } from '@backstage/backend-plugin-api'; -import { TaskScheduler } from './lib/TaskScheduler'; +import { DefaultSchedulerService } from './lib/DefaultSchedulerService'; /** * The default service factory for {@link @backstage/backend-plugin-api#coreServices.scheduler}. @@ -28,15 +28,10 @@ import { TaskScheduler } from './lib/TaskScheduler'; export const schedulerServiceFactory = createServiceFactory({ service: coreServices.scheduler, deps: { - plugin: coreServices.pluginMetadata, database: coreServices.database, logger: coreServices.logger, }, - async factory({ plugin, database, logger }) { - return TaskScheduler.forPlugin({ - pluginId: plugin.getId(), - databaseManager: database, - logger, - }); + async factory({ database, logger }) { + return DefaultSchedulerService.create({ database, logger }); }, }); diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md index 6e8d6eeb2f..0d5ced044a 100644 --- a/packages/backend-tasks/api-report.md +++ b/packages/backend-tasks/api-report.md @@ -87,8 +87,9 @@ export class TaskScheduler { databaseManager: LegacyRootDatabaseService, logger: LoggerService, ); + // @deprecated forPlugin(pluginId: string): PluginTaskScheduler; - // (undocumented) + // @deprecated (undocumented) static forPlugin(opts: { pluginId: string; databaseManager: PluginDatabaseManager; diff --git a/packages/backend-tasks/src/tasks/TaskScheduler.ts b/packages/backend-tasks/src/tasks/TaskScheduler.ts index 6608ba8e84..ff6fd12017 100644 --- a/packages/backend-tasks/src/tasks/TaskScheduler.ts +++ b/packages/backend-tasks/src/tasks/TaskScheduler.ts @@ -33,7 +33,7 @@ import { LoggerService } from '@backstage/backend-plugin-api'; * Deals with the scheduling of distributed tasks. * * @public - * @deprecated Please migrate to the new backend system, and depend on `coreServices.scheduler` from `@backstage/backend-plugin-api` instead. + * @deprecated Please migrate to the new backend system, and depend on `coreServices.scheduler` from `@backstage/backend-plugin-api` instead, or use `DefaultSchedulerService` from `@backstage/backend-defaults` */ export class TaskScheduler { /** @@ -65,6 +65,7 @@ export class TaskScheduler { * * @param pluginId - The unique ID of the plugin, for example "catalog" * @returns A {@link PluginTaskScheduler} instance + * @deprecated Please migrate to the new backend system, and depend on `coreServices.scheduler` from `@backstage/backend-plugin-api` instead, or use `DefaultSchedulerService` from `@backstage/backend-defaults` */ forPlugin(pluginId: string): PluginTaskScheduler { return TaskScheduler.forPlugin({ @@ -74,6 +75,9 @@ export class TaskScheduler { }); } + /** + * @deprecated Please migrate to the new backend system, and depend on `coreServices.scheduler` from `@backstage/backend-plugin-api` instead, or use `DefaultSchedulerService` from `@backstage/backend-defaults` + */ static forPlugin(opts: { pluginId: string; databaseManager: PluginDatabaseManager;