@backstage/plugin-catalog-backend-module-incremental-ingestion 0.6.1-next.2 → 0.6.2-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # @backstage/plugin-catalog-backend-module-incremental-ingestion
2
2
 
3
+ ## 0.6.2-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - ec547b8: Remove the error handler middleware, since that is now provided by the framework
8
+ - Updated dependencies
9
+ - @backstage/backend-defaults@0.7.0-next.0
10
+ - @backstage/plugin-catalog-backend@1.30.0-next.0
11
+ - @backstage/backend-plugin-api@1.1.1-next.0
12
+ - @backstage/catalog-model@1.7.2
13
+ - @backstage/config@1.3.1
14
+ - @backstage/errors@1.2.6
15
+ - @backstage/types@1.2.0
16
+ - @backstage/plugin-catalog-node@1.15.1-next.0
17
+ - @backstage/plugin-events-node@0.4.7-next.0
18
+ - @backstage/plugin-permission-common@0.8.3
19
+
20
+ ## 0.6.1
21
+
22
+ ### Patch Changes
23
+
24
+ - dfc8b41: Updated dependency `@opentelemetry/api` to `^1.9.0`.
25
+ - cce9cae: Deprecate old-backend-system `IncrementalCatalogBuilder`
26
+ - fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds.
27
+ - 5aa44d2: Wire up the events together in the new backend system
28
+ - d42ecb0: Remove backend-common package from incremental-ingestion plugin and update related code
29
+ - cbfc69e: Create a `dev/index.ts` entrypoint for `yarn start`
30
+ - 3ca5f70: Ensure that the scheduled worker task doesn't run at an unreasonably high frequency
31
+ - Updated dependencies
32
+ - @backstage/backend-defaults@0.6.0
33
+ - @backstage/plugin-catalog-backend@1.29.0
34
+ - @backstage/backend-plugin-api@1.1.0
35
+ - @backstage/plugin-catalog-node@1.15.0
36
+ - @backstage/plugin-events-node@0.4.6
37
+ - @backstage/errors@1.2.6
38
+ - @backstage/catalog-model@1.7.2
39
+ - @backstage/config@1.3.1
40
+ - @backstage/types@1.2.0
41
+ - @backstage/plugin-permission-common@0.8.3
42
+
3
43
  ## 0.6.1-next.2
4
44
 
5
45
  ### Patch Changes
@@ -31,8 +31,7 @@ class WrapperProviders {
31
31
  adminRouter() {
32
32
  return new routes.IncrementalProviderRouter(
33
33
  new IncrementalIngestionDatabaseManager.IncrementalIngestionDatabaseManager({ client: this.options.client }),
34
- this.options.logger,
35
- this.options.config
34
+ this.options.logger
36
35
  ).createRouter();
37
36
  }
38
37
  async startProvider(provider, providerOptions, connection) {
@@ -1 +1 @@
1
- {"version":3,"file":"WrapperProviders.cjs.js","sources":["../../src/module/WrapperProviders.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n LoggerService,\n RootConfigService,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport { stringifyError } from '@backstage/errors';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport { createDeferred } from '@backstage/types';\nimport express from 'express';\nimport { Knex } from 'knex';\nimport { Duration } from 'luxon';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n} from '../types';\nimport { EventsService } from '@backstage/plugin-events-node';\n\n/**\n * Helps in the creation of the catalog entity providers that wrap the\n * incremental ones.\n */\nexport class WrapperProviders {\n private migrate: Promise<void> | undefined;\n private numberOfProvidersToConnect = 0;\n private readonly readySignal = createDeferred();\n\n constructor(\n private readonly options: {\n config: RootConfigService;\n logger: LoggerService;\n client: Knex;\n scheduler: SchedulerService;\n applyDatabaseMigrations?: typeof applyDatabaseMigrations;\n events: EventsService;\n },\n ) {}\n\n wrap(\n provider: IncrementalEntityProvider<unknown, unknown>,\n options: IncrementalEntityProviderOptions,\n ): EntityProvider {\n this.numberOfProvidersToConnect += 1;\n return {\n getProviderName: () => provider.getProviderName(),\n connect: async connection => {\n await this.startProvider(provider, options, connection);\n this.numberOfProvidersToConnect -= 1;\n if (this.numberOfProvidersToConnect === 0) {\n this.readySignal.resolve();\n }\n },\n };\n }\n\n adminRouter(): express.Router {\n return new IncrementalProviderRouter(\n new IncrementalIngestionDatabaseManager({ client: this.options.client }),\n this.options.logger,\n this.options.config,\n ).createRouter();\n }\n\n private async startProvider(\n provider: IncrementalEntityProvider<unknown, unknown>,\n providerOptions: IncrementalEntityProviderOptions,\n connection: EntityProviderConnection,\n ) {\n const logger = this.options.logger.child({\n entityProvider: provider.getProviderName(),\n });\n\n try {\n if (!this.migrate) {\n this.migrate = Promise.resolve().then(async () => {\n const apply =\n this.options.applyDatabaseMigrations ?? applyDatabaseMigrations;\n await apply(this.options.client);\n });\n }\n\n await this.migrate;\n\n const { burstInterval, burstLength, restLength } = providerOptions;\n\n logger.info(`Connecting`);\n\n const manager = new IncrementalIngestionDatabaseManager({\n client: this.options.client,\n });\n const engine = new IncrementalIngestionEngine({\n ...providerOptions,\n ready: this.readySignal,\n manager,\n logger,\n provider,\n restLength,\n connection,\n });\n\n let frequency = Duration.isDuration(burstInterval)\n ? burstInterval\n : Duration.fromObject(burstInterval);\n if (frequency.as('milliseconds') < 5000) {\n frequency = Duration.fromObject({ seconds: 5 }); // don't let it be silly low, to not overload the scheduler\n }\n\n let length = Duration.isDuration(burstLength)\n ? burstLength\n : Duration.fromObject(burstLength);\n length = length.plus(Duration.fromObject({ minutes: 1 })); // some margin from the actual completion\n\n await this.options.scheduler.scheduleTask({\n id: provider.getProviderName(),\n fn: engine.taskFn.bind(engine),\n frequency,\n timeout: length,\n });\n\n const topics = engine.supportsEventTopics();\n if (topics.length > 0) {\n logger.info(\n `Provider ${provider.getProviderName()} subscribing to events for topics: ${topics.join(\n ',',\n )}`,\n );\n await this.options.events.subscribe({\n topics,\n id: `catalog-backend-module-incremental-ingestion:${provider.getProviderName()}`,\n onEvent: evt => engine.onEvent(evt),\n });\n }\n } catch (error) {\n logger.warn(\n `Failed to initialize incremental ingestion provider ${provider.getProviderName()}, ${stringifyError(\n error,\n )}`,\n );\n throw error;\n }\n }\n}\n"],"names":["createDeferred","IncrementalProviderRouter","IncrementalIngestionDatabaseManager","applyDatabaseMigrations","IncrementalIngestionEngine","Duration","stringifyError"],"mappings":"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"}
1
+ {"version":3,"file":"WrapperProviders.cjs.js","sources":["../../src/module/WrapperProviders.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n LoggerService,\n RootConfigService,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport { stringifyError } from '@backstage/errors';\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\nimport { createDeferred } from '@backstage/types';\nimport express from 'express';\nimport { Knex } from 'knex';\nimport { Duration } from 'luxon';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n} from '../types';\nimport { EventsService } from '@backstage/plugin-events-node';\n\n/**\n * Helps in the creation of the catalog entity providers that wrap the\n * incremental ones.\n */\nexport class WrapperProviders {\n private migrate: Promise<void> | undefined;\n private numberOfProvidersToConnect = 0;\n private readonly readySignal = createDeferred();\n\n constructor(\n private readonly options: {\n config: RootConfigService;\n logger: LoggerService;\n client: Knex;\n scheduler: SchedulerService;\n applyDatabaseMigrations?: typeof applyDatabaseMigrations;\n events: EventsService;\n },\n ) {}\n\n wrap(\n provider: IncrementalEntityProvider<unknown, unknown>,\n options: IncrementalEntityProviderOptions,\n ): EntityProvider {\n this.numberOfProvidersToConnect += 1;\n return {\n getProviderName: () => provider.getProviderName(),\n connect: async connection => {\n await this.startProvider(provider, options, connection);\n this.numberOfProvidersToConnect -= 1;\n if (this.numberOfProvidersToConnect === 0) {\n this.readySignal.resolve();\n }\n },\n };\n }\n\n adminRouter(): express.Router {\n return new IncrementalProviderRouter(\n new IncrementalIngestionDatabaseManager({ client: this.options.client }),\n this.options.logger,\n ).createRouter();\n }\n\n private async startProvider(\n provider: IncrementalEntityProvider<unknown, unknown>,\n providerOptions: IncrementalEntityProviderOptions,\n connection: EntityProviderConnection,\n ) {\n const logger = this.options.logger.child({\n entityProvider: provider.getProviderName(),\n });\n\n try {\n if (!this.migrate) {\n this.migrate = Promise.resolve().then(async () => {\n const apply =\n this.options.applyDatabaseMigrations ?? applyDatabaseMigrations;\n await apply(this.options.client);\n });\n }\n\n await this.migrate;\n\n const { burstInterval, burstLength, restLength } = providerOptions;\n\n logger.info(`Connecting`);\n\n const manager = new IncrementalIngestionDatabaseManager({\n client: this.options.client,\n });\n const engine = new IncrementalIngestionEngine({\n ...providerOptions,\n ready: this.readySignal,\n manager,\n logger,\n provider,\n restLength,\n connection,\n });\n\n let frequency = Duration.isDuration(burstInterval)\n ? burstInterval\n : Duration.fromObject(burstInterval);\n if (frequency.as('milliseconds') < 5000) {\n frequency = Duration.fromObject({ seconds: 5 }); // don't let it be silly low, to not overload the scheduler\n }\n\n let length = Duration.isDuration(burstLength)\n ? burstLength\n : Duration.fromObject(burstLength);\n length = length.plus(Duration.fromObject({ minutes: 1 })); // some margin from the actual completion\n\n await this.options.scheduler.scheduleTask({\n id: provider.getProviderName(),\n fn: engine.taskFn.bind(engine),\n frequency,\n timeout: length,\n });\n\n const topics = engine.supportsEventTopics();\n if (topics.length > 0) {\n logger.info(\n `Provider ${provider.getProviderName()} subscribing to events for topics: ${topics.join(\n ',',\n )}`,\n );\n await this.options.events.subscribe({\n topics,\n id: `catalog-backend-module-incremental-ingestion:${provider.getProviderName()}`,\n onEvent: evt => engine.onEvent(evt),\n });\n }\n } catch (error) {\n logger.warn(\n `Failed to initialize incremental ingestion provider ${provider.getProviderName()}, ${stringifyError(\n error,\n )}`,\n );\n throw error;\n }\n }\n}\n"],"names":["createDeferred","IncrementalProviderRouter","IncrementalIngestionDatabaseManager","applyDatabaseMigrations","IncrementalIngestionEngine","Duration","stringifyError"],"mappings":"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"}
@@ -2,7 +2,6 @@
2
2
 
3
3
  var express = require('express');
4
4
  var Router = require('express-promise-router');
5
- var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
6
5
 
7
6
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
7
 
@@ -12,11 +11,9 @@ var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
12
11
  class IncrementalProviderRouter {
13
12
  manager;
14
13
  logger;
15
- config;
16
- constructor(manager, logger, config) {
14
+ constructor(manager, logger) {
17
15
  this.manager = manager;
18
16
  this.logger = logger;
19
- this.config = config;
20
17
  }
21
18
  createRouter() {
22
19
  const router = Router__default.default();
@@ -211,11 +208,6 @@ class IncrementalProviderRouter {
211
208
  });
212
209
  }
213
210
  );
214
- const middleware = rootHttpRouter.MiddlewareFactory.create({
215
- logger: this.logger,
216
- config: this.config
217
- });
218
- router.use(middleware.error());
219
211
  return router;
220
212
  }
221
213
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.cjs.js","sources":["../../src/router/routes.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { Config } from '@backstage/config';\n\nexport class IncrementalProviderRouter {\n private manager: IncrementalIngestionDatabaseManager;\n private logger: LoggerService;\n private config: Config;\n\n constructor(\n manager: IncrementalIngestionDatabaseManager,\n logger: LoggerService,\n config: Config,\n ) {\n this.manager = manager;\n this.logger = logger;\n this.config = config;\n }\n\n createRouter(): express.Router {\n const router = Router();\n router.use(express.json());\n\n // Get the overall health of all incremental providers\n router.get('/incremental/health', async (_, res) => {\n const records = await this.manager.healthcheck();\n const providers = records.map(record => record.provider_name);\n const duplicates = [\n ...new Set(providers.filter((e, i, a) => a.indexOf(e) !== i)),\n ];\n\n if (duplicates.length > 0) {\n res.json({ healthy: false, duplicateIngestions: duplicates });\n } else {\n res.json({ healthy: true });\n }\n });\n\n // Clean up and pause all providers\n router.post('/incremental/cleanup', async (_, res) => {\n const result = await this.manager.cleanupProviders();\n res.json(result);\n });\n\n // Get basic status of the provider\n router.get('/incremental/providers/:provider', async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n res.json({\n success: true,\n status: {\n current_action: record.status,\n next_action_at: new Date(record.next_action_at),\n },\n last_error: record.last_error,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n res.json({\n success: true,\n status: {\n current_action: 'rest complete, waiting to start',\n },\n });\n } else {\n this.logger.error(\n `${provider} - No ingestion record found in the database!`,\n );\n res.status(404).json({\n success: false,\n status: {},\n last_error: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n // Trigger the provider's next action\n router.post(\n `/incremental/providers/:provider/trigger`,\n async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n await this.manager.triggerNextProviderAction(provider);\n res.json({\n success: true,\n message: `${provider}: Next action triggered.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Unable to trigger next action (provider is restarting)',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n },\n );\n\n // Start a brand-new ingestion cycle for the provider.\n // (Cancel's the current run if active, or marks it complete if resting)\n router.post(`/incremental/providers/:provider/start`, async (req, res) => {\n const { provider } = req.params;\n\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const ingestionId = record.id;\n if (record.status === 'resting') {\n await this.manager.setProviderComplete(ingestionId);\n } else {\n await this.manager.setProviderCanceling(ingestionId);\n }\n res.json({\n success: true,\n message: `${provider}: Next cycle triggered.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Provider is already restarting',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n router.get(`/incremental/providers`, async (_req, res) => {\n const providers = await this.manager.listProviders();\n\n res.json({\n success: true,\n providers,\n });\n });\n\n // Stop the provider and pause it for 24 hours\n router.post(`/incremental/providers/:provider/cancel`, async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const next_action_at = new Date();\n next_action_at.setTime(next_action_at.getTime() + 24 * 60 * 60 * 1000);\n await this.manager.updateByName(provider, {\n next_action: 'nothing (done)',\n ingestion_completed_at: new Date(),\n next_action_at,\n status: 'resting',\n });\n res.json({\n success: true,\n message: `${provider}: Current ingestion canceled.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Provider is currently restarting, please wait.',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n // Wipe out all ingestion records for the provider and pause for 24 hours\n router.delete('/incremental/providers/:provider', async (req, res) => {\n const { provider } = req.params;\n const result = await this.manager.purgeAndResetProvider(provider);\n res.json(result);\n });\n\n // Get the ingestion marks for the current cycle\n router.get(`/incremental/providers/:provider/marks`, async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const id = record.id;\n const records = await this.manager.getAllMarks(id);\n res.json({ success: true, records });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'No records yet (provider is restarting)',\n });\n } else {\n this.logger.error(\n `${provider} - No ingestion record found in the database!`,\n );\n res.status(404).json({\n success: false,\n status: {},\n last_error: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n router.delete(\n `/incremental/providers/:provider/marks`,\n async (req, res) => {\n const { provider } = req.params;\n const deletions = await this.manager.clearFinishedIngestions(provider);\n\n res.json({\n success: true,\n message: `Expired marks for provider '${provider}' removed.`,\n deletions,\n });\n },\n );\n\n const middleware = MiddlewareFactory.create({\n logger: this.logger,\n config: this.config,\n });\n router.use(middleware.error());\n\n return router;\n }\n}\n"],"names":["Router","express","MiddlewareFactory"],"mappings":"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"}
1
+ {"version":3,"file":"routes.cjs.js","sources":["../../src/router/routes.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport class IncrementalProviderRouter {\n private manager: IncrementalIngestionDatabaseManager;\n private logger: LoggerService;\n\n constructor(\n manager: IncrementalIngestionDatabaseManager,\n logger: LoggerService,\n ) {\n this.manager = manager;\n this.logger = logger;\n }\n\n createRouter(): express.Router {\n const router = Router();\n router.use(express.json());\n\n // Get the overall health of all incremental providers\n router.get('/incremental/health', async (_, res) => {\n const records = await this.manager.healthcheck();\n const providers = records.map(record => record.provider_name);\n const duplicates = [\n ...new Set(providers.filter((e, i, a) => a.indexOf(e) !== i)),\n ];\n\n if (duplicates.length > 0) {\n res.json({ healthy: false, duplicateIngestions: duplicates });\n } else {\n res.json({ healthy: true });\n }\n });\n\n // Clean up and pause all providers\n router.post('/incremental/cleanup', async (_, res) => {\n const result = await this.manager.cleanupProviders();\n res.json(result);\n });\n\n // Get basic status of the provider\n router.get('/incremental/providers/:provider', async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n res.json({\n success: true,\n status: {\n current_action: record.status,\n next_action_at: new Date(record.next_action_at),\n },\n last_error: record.last_error,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n res.json({\n success: true,\n status: {\n current_action: 'rest complete, waiting to start',\n },\n });\n } else {\n this.logger.error(\n `${provider} - No ingestion record found in the database!`,\n );\n res.status(404).json({\n success: false,\n status: {},\n last_error: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n // Trigger the provider's next action\n router.post(\n `/incremental/providers/:provider/trigger`,\n async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n await this.manager.triggerNextProviderAction(provider);\n res.json({\n success: true,\n message: `${provider}: Next action triggered.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Unable to trigger next action (provider is restarting)',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n },\n );\n\n // Start a brand-new ingestion cycle for the provider.\n // (Cancel's the current run if active, or marks it complete if resting)\n router.post(`/incremental/providers/:provider/start`, async (req, res) => {\n const { provider } = req.params;\n\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const ingestionId = record.id;\n if (record.status === 'resting') {\n await this.manager.setProviderComplete(ingestionId);\n } else {\n await this.manager.setProviderCanceling(ingestionId);\n }\n res.json({\n success: true,\n message: `${provider}: Next cycle triggered.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Provider is already restarting',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n router.get(`/incremental/providers`, async (_req, res) => {\n const providers = await this.manager.listProviders();\n\n res.json({\n success: true,\n providers,\n });\n });\n\n // Stop the provider and pause it for 24 hours\n router.post(`/incremental/providers/:provider/cancel`, async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const next_action_at = new Date();\n next_action_at.setTime(next_action_at.getTime() + 24 * 60 * 60 * 1000);\n await this.manager.updateByName(provider, {\n next_action: 'nothing (done)',\n ingestion_completed_at: new Date(),\n next_action_at,\n status: 'resting',\n });\n res.json({\n success: true,\n message: `${provider}: Current ingestion canceled.`,\n });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'Provider is currently restarting, please wait.',\n });\n } else {\n res.status(404).json({\n success: false,\n message: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n // Wipe out all ingestion records for the provider and pause for 24 hours\n router.delete('/incremental/providers/:provider', async (req, res) => {\n const { provider } = req.params;\n const result = await this.manager.purgeAndResetProvider(provider);\n res.json(result);\n });\n\n // Get the ingestion marks for the current cycle\n router.get(`/incremental/providers/:provider/marks`, async (req, res) => {\n const { provider } = req.params;\n const record = await this.manager.getCurrentIngestionRecord(provider);\n if (record) {\n const id = record.id;\n const records = await this.manager.getAllMarks(id);\n res.json({ success: true, records });\n } else {\n const providers: string[] = await this.manager.listProviders();\n if (providers.includes(provider)) {\n this.logger.debug(`${provider} - Ingestion record found`);\n res.json({\n success: true,\n message: 'No records yet (provider is restarting)',\n });\n } else {\n this.logger.error(\n `${provider} - No ingestion record found in the database!`,\n );\n res.status(404).json({\n success: false,\n status: {},\n last_error: `Provider '${provider}' not found`,\n });\n }\n }\n });\n\n router.delete(\n `/incremental/providers/:provider/marks`,\n async (req, res) => {\n const { provider } = req.params;\n const deletions = await this.manager.clearFinishedIngestions(provider);\n\n res.json({\n success: true,\n message: `Expired marks for provider '${provider}' removed.`,\n deletions,\n });\n },\n );\n\n return router;\n }\n}\n"],"names":["Router","express"],"mappings":";;;;;;;;;;AAqBO,MAAM,yBAA0B,CAAA;AAAA,EAC7B,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CACE,SACA,MACA,EAAA;AACA,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AAChB,EAEA,YAA+B,GAAA;AAC7B,IAAA,MAAM,SAASA,uBAAO,EAAA;AACtB,IAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA;AAGzB,IAAA,MAAA,CAAO,GAAI,CAAA,qBAAA,EAAuB,OAAO,CAAA,EAAG,GAAQ,KAAA;AAClD,MAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,WAAY,EAAA;AAC/C,MAAA,MAAM,SAAY,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,MAAA,KAAU,OAAO,aAAa,CAAA;AAC5D,MAAA,MAAM,UAAa,GAAA;AAAA,QACjB,GAAG,IAAI,GAAI,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC;AAAA,OAC9D;AAEA,MAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACzB,QAAA,GAAA,CAAI,KAAK,EAAE,OAAA,EAAS,KAAO,EAAA,mBAAA,EAAqB,YAAY,CAAA;AAAA,OACvD,MAAA;AACL,QAAA,GAAA,CAAI,IAAK,CAAA,EAAE,OAAS,EAAA,IAAA,EAAM,CAAA;AAAA;AAC5B,KACD,CAAA;AAGD,IAAA,MAAA,CAAO,IAAK,CAAA,sBAAA,EAAwB,OAAO,CAAA,EAAG,GAAQ,KAAA;AACpD,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,gBAAiB,EAAA;AACnD,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,KAChB,CAAA;AAGD,IAAA,MAAA,CAAO,GAAI,CAAA,kCAAA,EAAoC,OAAO,GAAA,EAAK,GAAQ,KAAA;AACjE,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,0BAA0B,QAAQ,CAAA;AACpE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,GAAA,CAAI,IAAK,CAAA;AAAA,UACP,OAAS,EAAA,IAAA;AAAA,UACT,MAAQ,EAAA;AAAA,YACN,gBAAgB,MAAO,CAAA,MAAA;AAAA,YACvB,cAAgB,EAAA,IAAI,IAAK,CAAA,MAAA,CAAO,cAAc;AAAA,WAChD;AAAA,UACA,YAAY,MAAO,CAAA;AAAA,SACpB,CAAA;AAAA,OACI,MAAA;AACL,QAAA,MAAM,SAAsB,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAC7D,QAAI,IAAA,SAAA,CAAU,QAAS,CAAA,QAAQ,CAAG,EAAA;AAChC,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,OAAS,EAAA,IAAA;AAAA,YACT,MAAQ,EAAA;AAAA,cACN,cAAgB,EAAA;AAAA;AAClB,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,YACV,GAAG,QAAQ,CAAA,6CAAA;AAAA,WACb;AACA,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,YACnB,OAAS,EAAA,KAAA;AAAA,YACT,QAAQ,EAAC;AAAA,YACT,UAAA,EAAY,aAAa,QAAQ,CAAA,WAAA;AAAA,WAClC,CAAA;AAAA;AACH;AACF,KACD,CAAA;AAGD,IAAO,MAAA,CAAA,IAAA;AAAA,MACL,CAAA,wCAAA,CAAA;AAAA,MACA,OAAO,KAAK,GAAQ,KAAA;AAClB,QAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,QAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,0BAA0B,QAAQ,CAAA;AACpE,QAAA,IAAI,MAAQ,EAAA;AACV,UAAM,MAAA,IAAA,CAAK,OAAQ,CAAA,yBAAA,CAA0B,QAAQ,CAAA;AACrD,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,OAAS,EAAA,IAAA;AAAA,YACT,OAAA,EAAS,GAAG,QAAQ,CAAA,wBAAA;AAAA,WACrB,CAAA;AAAA,SACI,MAAA;AACL,UAAA,MAAM,SAAsB,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAC7D,UAAI,IAAA,SAAA,CAAU,QAAS,CAAA,QAAQ,CAAG,EAAA;AAChC,YAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAAG,EAAA,QAAQ,CAA2B,yBAAA,CAAA,CAAA;AACxD,YAAA,GAAA,CAAI,IAAK,CAAA;AAAA,cACP,OAAS,EAAA,IAAA;AAAA,cACT,OAAS,EAAA;AAAA,aACV,CAAA;AAAA,WACI,MAAA;AACL,YAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,cACnB,OAAS,EAAA,KAAA;AAAA,cACT,OAAA,EAAS,aAAa,QAAQ,CAAA,WAAA;AAAA,aAC/B,CAAA;AAAA;AACH;AACF;AACF,KACF;AAIA,IAAA,MAAA,CAAO,IAAK,CAAA,CAAA,sCAAA,CAAA,EAA0C,OAAO,GAAA,EAAK,GAAQ,KAAA;AACxE,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AAEzB,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,0BAA0B,QAAQ,CAAA;AACpE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,cAAc,MAAO,CAAA,EAAA;AAC3B,QAAI,IAAA,MAAA,CAAO,WAAW,SAAW,EAAA;AAC/B,UAAM,MAAA,IAAA,CAAK,OAAQ,CAAA,mBAAA,CAAoB,WAAW,CAAA;AAAA,SAC7C,MAAA;AACL,UAAM,MAAA,IAAA,CAAK,OAAQ,CAAA,oBAAA,CAAqB,WAAW,CAAA;AAAA;AAErD,QAAA,GAAA,CAAI,IAAK,CAAA;AAAA,UACP,OAAS,EAAA,IAAA;AAAA,UACT,OAAA,EAAS,GAAG,QAAQ,CAAA,uBAAA;AAAA,SACrB,CAAA;AAAA,OACI,MAAA;AACL,QAAA,MAAM,SAAsB,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAC7D,QAAI,IAAA,SAAA,CAAU,QAAS,CAAA,QAAQ,CAAG,EAAA;AAChC,UAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAAG,EAAA,QAAQ,CAA2B,yBAAA,CAAA,CAAA;AACxD,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,OAAS,EAAA,IAAA;AAAA,YACT,OAAS,EAAA;AAAA,WACV,CAAA;AAAA,SACI,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,YACnB,OAAS,EAAA,KAAA;AAAA,YACT,OAAA,EAAS,aAAa,QAAQ,CAAA,WAAA;AAAA,WAC/B,CAAA;AAAA;AACH;AACF,KACD,CAAA;AAED,IAAA,MAAA,CAAO,GAAI,CAAA,CAAA,sBAAA,CAAA,EAA0B,OAAO,IAAA,EAAM,GAAQ,KAAA;AACxD,MAAA,MAAM,SAAY,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAEnD,MAAA,GAAA,CAAI,IAAK,CAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,KACF,CAAA;AAGD,IAAA,MAAA,CAAO,IAAK,CAAA,CAAA,uCAAA,CAAA,EAA2C,OAAO,GAAA,EAAK,GAAQ,KAAA;AACzE,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,0BAA0B,QAAQ,CAAA;AACpE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAM,MAAA,cAAA,uBAAqB,IAAK,EAAA;AAChC,QAAA,cAAA,CAAe,QAAQ,cAAe,CAAA,OAAA,KAAY,EAAK,GAAA,EAAA,GAAK,KAAK,GAAI,CAAA;AACrE,QAAM,MAAA,IAAA,CAAK,OAAQ,CAAA,YAAA,CAAa,QAAU,EAAA;AAAA,UACxC,WAAa,EAAA,gBAAA;AAAA,UACb,sBAAA,sBAA4B,IAAK,EAAA;AAAA,UACjC,cAAA;AAAA,UACA,MAAQ,EAAA;AAAA,SACT,CAAA;AACD,QAAA,GAAA,CAAI,IAAK,CAAA;AAAA,UACP,OAAS,EAAA,IAAA;AAAA,UACT,OAAA,EAAS,GAAG,QAAQ,CAAA,6BAAA;AAAA,SACrB,CAAA;AAAA,OACI,MAAA;AACL,QAAA,MAAM,SAAsB,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAC7D,QAAI,IAAA,SAAA,CAAU,QAAS,CAAA,QAAQ,CAAG,EAAA;AAChC,UAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAAG,EAAA,QAAQ,CAA2B,yBAAA,CAAA,CAAA;AACxD,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,OAAS,EAAA,IAAA;AAAA,YACT,OAAS,EAAA;AAAA,WACV,CAAA;AAAA,SACI,MAAA;AACL,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,YACnB,OAAS,EAAA,KAAA;AAAA,YACT,OAAA,EAAS,aAAa,QAAQ,CAAA,WAAA;AAAA,WAC/B,CAAA;AAAA;AACH;AACF,KACD,CAAA;AAGD,IAAA,MAAA,CAAO,MAAO,CAAA,kCAAA,EAAoC,OAAO,GAAA,EAAK,GAAQ,KAAA;AACpE,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,sBAAsB,QAAQ,CAAA;AAChE,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,KAChB,CAAA;AAGD,IAAA,MAAA,CAAO,GAAI,CAAA,CAAA,sCAAA,CAAA,EAA0C,OAAO,GAAA,EAAK,GAAQ,KAAA;AACvE,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,0BAA0B,QAAQ,CAAA;AACpE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,KAAK,MAAO,CAAA,EAAA;AAClB,QAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,YAAY,EAAE,CAAA;AACjD,QAAA,GAAA,CAAI,IAAK,CAAA,EAAE,OAAS,EAAA,IAAA,EAAM,SAAS,CAAA;AAAA,OAC9B,MAAA;AACL,QAAA,MAAM,SAAsB,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,aAAc,EAAA;AAC7D,QAAI,IAAA,SAAA,CAAU,QAAS,CAAA,QAAQ,CAAG,EAAA;AAChC,UAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAAG,EAAA,QAAQ,CAA2B,yBAAA,CAAA,CAAA;AACxD,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,OAAS,EAAA,IAAA;AAAA,YACT,OAAS,EAAA;AAAA,WACV,CAAA;AAAA,SACI,MAAA;AACL,UAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,YACV,GAAG,QAAQ,CAAA,6CAAA;AAAA,WACb;AACA,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,YACnB,OAAS,EAAA,KAAA;AAAA,YACT,QAAQ,EAAC;AAAA,YACT,UAAA,EAAY,aAAa,QAAQ,CAAA,WAAA;AAAA,WAClC,CAAA;AAAA;AACH;AACF,KACD,CAAA;AAED,IAAO,MAAA,CAAA,MAAA;AAAA,MACL,CAAA,sCAAA,CAAA;AAAA,MACA,OAAO,KAAK,GAAQ,KAAA;AAClB,QAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA;AACzB,QAAA,MAAM,SAAY,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,wBAAwB,QAAQ,CAAA;AAErE,QAAA,GAAA,CAAI,IAAK,CAAA;AAAA,UACP,OAAS,EAAA,IAAA;AAAA,UACT,OAAA,EAAS,+BAA+B,QAAQ,CAAA,UAAA,CAAA;AAAA,UAChD;AAAA,SACD,CAAA;AAAA;AACH,KACF;AAEA,IAAO,OAAA,MAAA;AAAA;AAEX;;;;"}
@@ -34,8 +34,7 @@ class IncrementalCatalogBuilder {
34
34
  });
35
35
  const incrementalAdminRouter = await new routes.IncrementalProviderRouter(
36
36
  this.manager,
37
- routerLogger,
38
- this.env.config
37
+ routerLogger
39
38
  ).createRouter();
40
39
  return { incrementalAdminRouter };
41
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IncrementalCatalogBuilder.cjs.js","sources":["../../src/service/IncrementalCatalogBuilder.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n PluginEnvironment,\n} from '../types';\nimport { CatalogBuilder as CoreCatalogBuilder } from '@backstage/plugin-catalog-backend';\nimport { createDeferred } from '@backstage/types';\nimport { Duration } from 'luxon';\nimport { Knex } from 'knex';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\n/**\n * @public\n * @deprecated Please migrate to the new backend system and import `@backstage/plugin-catalog-backend-module-incremental-ingestion` as a module, and add providers to the `incrementalIngestionProvidersExtensionPoint` instead\n */\nexport class IncrementalCatalogBuilder {\n /**\n * Creates the incremental catalog builder, which extends the regular catalog builder.\n * @param env - PluginEnvironment\n * @param builder - CatalogBuilder\n * @returns IncrementalCatalogBuilder\n */\n static async create(env: PluginEnvironment, builder: CoreCatalogBuilder) {\n const client = await env.database.getClient();\n const manager = new IncrementalIngestionDatabaseManager({ client });\n return new IncrementalCatalogBuilder(env, builder, client, manager);\n }\n\n private ready = createDeferred();\n\n private constructor(\n private env: PluginEnvironment,\n private builder: CoreCatalogBuilder,\n private client: Knex,\n private manager: IncrementalIngestionDatabaseManager,\n ) {}\n\n async build() {\n await applyDatabaseMigrations(this.client);\n this.ready.resolve();\n\n const routerLogger = this.env.logger.child({\n router: 'IncrementalProviderAdmin',\n });\n\n const incrementalAdminRouter = await new IncrementalProviderRouter(\n this.manager,\n routerLogger,\n this.env.config,\n ).createRouter();\n\n return { incrementalAdminRouter };\n }\n\n addIncrementalEntityProvider<TCursor, TContext>(\n provider: IncrementalEntityProvider<TCursor, TContext>,\n options: IncrementalEntityProviderOptions,\n ): EventSubscriber {\n const { burstInterval, burstLength, restLength } = options;\n const { logger: catalogLogger, scheduler } = this.env;\n const ready = this.ready;\n\n const manager = this.manager;\n\n let engine: IncrementalIngestionEngine;\n\n this.builder.addEntityProvider({\n getProviderName: provider.getProviderName.bind(provider),\n async connect(connection) {\n const logger = catalogLogger.child({\n entityProvider: provider.getProviderName(),\n });\n\n engine = new IncrementalIngestionEngine({\n ...options,\n ready,\n manager,\n logger,\n provider,\n restLength,\n connection,\n });\n\n let frequency = Duration.isDuration(burstInterval)\n ? burstInterval\n : Duration.fromObject(burstInterval);\n if (frequency.as('milliseconds') < 5000) {\n frequency = Duration.fromObject({ seconds: 5 }); // don't let it be silly low, to not overload the scheduler\n }\n\n let length = Duration.isDuration(burstLength)\n ? burstLength\n : Duration.fromObject(burstLength);\n length = length.plus(Duration.fromObject({ minutes: 1 })); // some margin from the actual completion\n\n await scheduler.scheduleTask({\n id: provider.getProviderName(),\n fn: engine.taskFn.bind(engine),\n frequency,\n timeout: length,\n });\n },\n });\n\n return {\n onEvent: (params: EventParams) => engine.onEvent(params),\n supportsEventTopics() {\n return engine.supportsEventTopics();\n },\n };\n }\n}\n"],"names":["IncrementalIngestionDatabaseManager","createDeferred","applyDatabaseMigrations","IncrementalProviderRouter","IncrementalIngestionEngine","Duration"],"mappings":"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"}
1
+ {"version":3,"file":"IncrementalCatalogBuilder.cjs.js","sources":["../../src/service/IncrementalCatalogBuilder.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n IncrementalEntityProvider,\n IncrementalEntityProviderOptions,\n PluginEnvironment,\n} from '../types';\nimport { CatalogBuilder as CoreCatalogBuilder } from '@backstage/plugin-catalog-backend';\nimport { createDeferred } from '@backstage/types';\nimport { Duration } from 'luxon';\nimport { Knex } from 'knex';\nimport { IncrementalIngestionEngine } from '../engine/IncrementalIngestionEngine';\nimport { applyDatabaseMigrations } from '../database/migrations';\nimport { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager';\nimport { IncrementalProviderRouter } from '../router/routes';\nimport { EventParams, EventSubscriber } from '@backstage/plugin-events-node';\n\n/**\n * @public\n * @deprecated Please migrate to the new backend system and import `@backstage/plugin-catalog-backend-module-incremental-ingestion` as a module, and add providers to the `incrementalIngestionProvidersExtensionPoint` instead\n */\nexport class IncrementalCatalogBuilder {\n /**\n * Creates the incremental catalog builder, which extends the regular catalog builder.\n * @param env - PluginEnvironment\n * @param builder - CatalogBuilder\n * @returns IncrementalCatalogBuilder\n */\n static async create(env: PluginEnvironment, builder: CoreCatalogBuilder) {\n const client = await env.database.getClient();\n const manager = new IncrementalIngestionDatabaseManager({ client });\n return new IncrementalCatalogBuilder(env, builder, client, manager);\n }\n\n private ready = createDeferred();\n\n private constructor(\n private env: PluginEnvironment,\n private builder: CoreCatalogBuilder,\n private client: Knex,\n private manager: IncrementalIngestionDatabaseManager,\n ) {}\n\n async build() {\n await applyDatabaseMigrations(this.client);\n this.ready.resolve();\n\n const routerLogger = this.env.logger.child({\n router: 'IncrementalProviderAdmin',\n });\n\n const incrementalAdminRouter = await new IncrementalProviderRouter(\n this.manager,\n routerLogger,\n ).createRouter();\n\n return { incrementalAdminRouter };\n }\n\n addIncrementalEntityProvider<TCursor, TContext>(\n provider: IncrementalEntityProvider<TCursor, TContext>,\n options: IncrementalEntityProviderOptions,\n ): EventSubscriber {\n const { burstInterval, burstLength, restLength } = options;\n const { logger: catalogLogger, scheduler } = this.env;\n const ready = this.ready;\n\n const manager = this.manager;\n\n let engine: IncrementalIngestionEngine;\n\n this.builder.addEntityProvider({\n getProviderName: provider.getProviderName.bind(provider),\n async connect(connection) {\n const logger = catalogLogger.child({\n entityProvider: provider.getProviderName(),\n });\n\n engine = new IncrementalIngestionEngine({\n ...options,\n ready,\n manager,\n logger,\n provider,\n restLength,\n connection,\n });\n\n let frequency = Duration.isDuration(burstInterval)\n ? burstInterval\n : Duration.fromObject(burstInterval);\n if (frequency.as('milliseconds') < 5000) {\n frequency = Duration.fromObject({ seconds: 5 }); // don't let it be silly low, to not overload the scheduler\n }\n\n let length = Duration.isDuration(burstLength)\n ? burstLength\n : Duration.fromObject(burstLength);\n length = length.plus(Duration.fromObject({ minutes: 1 })); // some margin from the actual completion\n\n await scheduler.scheduleTask({\n id: provider.getProviderName(),\n fn: engine.taskFn.bind(engine),\n frequency,\n timeout: length,\n });\n },\n });\n\n return {\n onEvent: (params: EventParams) => engine.onEvent(params),\n supportsEventTopics() {\n return engine.supportsEventTopics();\n },\n };\n }\n}\n"],"names":["IncrementalIngestionDatabaseManager","createDeferred","applyDatabaseMigrations","IncrementalProviderRouter","IncrementalIngestionEngine","Duration"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion",
3
- "version": "0.6.1-next.2",
3
+ "version": "0.6.2-next.0",
4
4
  "description": "An entity provider for streaming large asset sources into the catalog",
5
5
  "backstage": {
6
6
  "role": "backend-plugin-module",
@@ -61,15 +61,15 @@
61
61
  "test": "backstage-cli package test"
62
62
  },
63
63
  "dependencies": {
64
- "@backstage/backend-defaults": "0.6.0-next.2",
65
- "@backstage/backend-plugin-api": "1.1.0-next.2",
66
- "@backstage/catalog-model": "1.7.2-next.0",
67
- "@backstage/config": "1.3.1-next.0",
68
- "@backstage/errors": "1.2.6-next.0",
69
- "@backstage/plugin-catalog-backend": "1.29.0-next.2",
70
- "@backstage/plugin-catalog-node": "1.15.0-next.2",
71
- "@backstage/plugin-events-node": "0.4.6-next.2",
72
- "@backstage/plugin-permission-common": "0.8.3-next.0",
64
+ "@backstage/backend-defaults": "0.7.0-next.0",
65
+ "@backstage/backend-plugin-api": "1.1.1-next.0",
66
+ "@backstage/catalog-model": "1.7.2",
67
+ "@backstage/config": "1.3.1",
68
+ "@backstage/errors": "1.2.6",
69
+ "@backstage/plugin-catalog-backend": "1.30.0-next.0",
70
+ "@backstage/plugin-catalog-node": "1.15.1-next.0",
71
+ "@backstage/plugin-events-node": "0.4.7-next.0",
72
+ "@backstage/plugin-permission-common": "0.8.3",
73
73
  "@backstage/types": "1.2.0",
74
74
  "@opentelemetry/api": "^1.9.0",
75
75
  "@types/express": "^4.17.6",
@@ -80,8 +80,8 @@
80
80
  "uuid": "^11.0.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@backstage/backend-test-utils": "1.2.0-next.2",
84
- "@backstage/cli": "0.29.3-next.2",
83
+ "@backstage/backend-test-utils": "1.2.1-next.0",
84
+ "@backstage/cli": "0.29.5-next.0",
85
85
  "@types/luxon": "^3.0.0"
86
86
  }
87
87
  }