Expose DefaultSchedulerService from backend-defaults

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2024-06-04 13:55:27 +02:00
parent 72fde4db9a
commit 18971698c4
10 changed files with 104 additions and 120 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-defaults': patch
---
Exposed `DefaultSchedulerService`
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-tasks': patch
---
More detailed deprecation messages
@@ -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,
@@ -14,4 +14,5 @@
* limitations under the License.
*/
export { DefaultSchedulerService } from './lib/DefaultSchedulerService';
export { schedulerServiceFactory } from './schedulerServiceFactory';
@@ -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<DatabaseManager> {
): Promise<DatabaseService> {
const knex = await databases.init(databaseId);
const databaseManager: Partial<DatabaseManager> = {
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({
@@ -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);
}
}
@@ -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);
}
}
@@ -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 });
},
});
+2 -1
View File
@@ -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;
@@ -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;