diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md index df252808eb..f8de3034fd 100644 --- a/docs/features/software-catalog/configuration.md +++ b/docs/features/software-catalog/configuration.md @@ -171,7 +171,7 @@ To remove these entities automatically, you can use the following configuration. ```yaml catalog: - evictOrphanedEntityProviders: true + orphanProviderStrategy: delete ``` ## Processing Interval diff --git a/plugins/catalog-backend/config.d.ts b/plugins/catalog-backend/config.d.ts index 057d581e80..d7816fa856 100644 --- a/plugins/catalog-backend/config.d.ts +++ b/plugins/catalog-backend/config.d.ts @@ -155,6 +155,13 @@ export interface Config { */ orphanStrategy?: 'keep' | 'delete'; + /** + * The strategy to use for entities that are referenced by providers that are orphaned, + * i.e. entities with no providers currently configured in the catalog. The default value is + * "keep". + */ + orphanProviderStrategy?: 'keep' | 'delete'; + /** * The strategy to use when stitching together the final entities. */ @@ -216,10 +223,5 @@ export interface Config { * This flag is temporary and will be enabled by default in future releases. */ useUrlReadersSearch?: boolean; - - /** - * Evicts entities from the catalog when their related entity provider no longer exists. - */ - evictOrphanedEntityProviders?: boolean; }; } diff --git a/plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.test.ts b/plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.test.ts similarity index 88% rename from plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.test.ts rename to plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.test.ts index ba618feaba..1580194639 100644 --- a/plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.test.ts +++ b/plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.test.ts @@ -16,9 +16,9 @@ import { EntityProvider } from '@backstage/plugin-catalog-node'; import { mockServices } from '@backstage/backend-test-utils'; import { DefaultProviderDatabase } from '../database/DefaultProviderDatabase'; -import { evictOrphanedEntityProviders } from './evictOrphanedEntityProviders'; +import { evictEntitiesFromOrphanedProviders } from './evictEntitiesFromOrphanedProviders'; -describe('evictOrphanedEntityProviders', () => { +describe('evictEntitiesFromOrphanedProviders', () => { const db = { transaction: jest.fn().mockImplementation(cb => cb((() => {}) as any)), replaceUnprocessedEntities: jest.fn(), @@ -34,7 +34,7 @@ describe('evictOrphanedEntityProviders', () => { it('replaces unprocessed entities for orphaned providers with empty items', async () => { db.listReferenceSourceKeys.mockResolvedValue(['foo', 'bar']); - await evictOrphanedEntityProviders({ db, providers, logger }); + await evictEntitiesFromOrphanedProviders({ db, providers, logger }); expect(db.replaceUnprocessedEntities).toHaveBeenCalledTimes(2); expect(db.replaceUnprocessedEntities).toHaveBeenNthCalledWith( @@ -60,7 +60,7 @@ describe('evictOrphanedEntityProviders', () => { it('does not replace unprocessed entities for providers that are not orphaned', async () => { db.listReferenceSourceKeys.mockResolvedValue(['foo', 'provider1']); - await evictOrphanedEntityProviders({ db, providers, logger }); + await evictEntitiesFromOrphanedProviders({ db, providers, logger }); expect(db.replaceUnprocessedEntities).not.toHaveBeenCalledWith( expect.anything(), diff --git a/plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.ts b/plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.ts similarity index 96% rename from plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.ts rename to plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.ts index f1d99e83d7..a6bda5e8c5 100644 --- a/plugins/catalog-backend/src/processing/evictOrphanedEntityProviders.ts +++ b/plugins/catalog-backend/src/processing/evictEntitiesFromOrphanedProviders.ts @@ -62,7 +62,7 @@ async function removeEntitiesForProvider({ } } -export async function evictOrphanedEntityProviders(options: { +export async function evictEntitiesFromOrphanedProviders(options: { db: ProviderDatabase; providers: EntityProvider[]; logger: LoggerService; diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index dd77d70efd..0965ba63e3 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -87,7 +87,7 @@ import { ProcessingIntervalFunction, } from '../processing'; import { connectEntityProviders } from '../processing/connectEntityProviders'; -import { evictOrphanedEntityProviders } from '../processing/evictOrphanedEntityProviders'; +import { evictEntitiesFromOrphanedProviders } from '../processing/evictEntitiesFromOrphanedProviders'; import { DefaultCatalogProcessingEngine } from '../processing/DefaultCatalogProcessingEngine'; import { DefaultCatalogProcessingOrchestrator } from '../processing/DefaultCatalogProcessingOrchestrator'; import { @@ -646,8 +646,10 @@ export class CatalogBuilder { await connectEntityProviders(providerDatabase, entityProviders); - if (config.getOptionalBoolean('catalog.evictOrphanedEntityProviders')) { - await evictOrphanedEntityProviders({ + if ( + config.getOptionalString('catalog.orphanProviderStrategy') === 'delete' + ) { + await evictEntitiesFromOrphanedProviders({ db: providerDatabase, providers: entityProviders, logger,