From 4eebdfb0cc06b71cffe253cd06a75836ed19ae7c Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Fri, 26 Aug 2022 09:33:35 +0200 Subject: [PATCH 1/4] return refresh keys if item is cached Signed-off-by: Kiss Miklos --- .../src/database/DefaultProcessingDatabase.ts | 28 ++++++++++--------- .../src/modules/core/UrlReaderProcessor.ts | 1 + 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 1cf2643339..c1a8ee9d33 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -145,20 +145,22 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { BATCH_SIZE, ); - // Delete old refresh keys - await tx('refresh_keys') - .where({ entity_id: id }) - .delete(); + if (refreshKeys && refreshKeys.length > 0) { + // Delete old refresh keys + await tx('refresh_keys') + .where({ entity_id: id }) + .delete(); - // Insert the refresh keys for the processed entity - await tx.batchInsert( - 'refresh_keys', - refreshKeys.map(k => ({ - entity_id: id, - key: k.key, - })), - BATCH_SIZE, - ); + // Insert the refresh keys for the processed entity + await tx.batchInsert( + 'refresh_keys', + refreshKeys.map(k => ({ + entity_id: id, + key: k.key, + })), + BATCH_SIZE, + ); + } return { previous: { diff --git a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts index 0ecd6d5a42..b1b1f64fdc 100644 --- a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts +++ b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.ts @@ -102,6 +102,7 @@ export class UrlReaderProcessor implements CatalogProcessor { for (const parseResult of cacheItem.value) { emit(parseResult); } + emit(processingResult.refresh(`${location.type}:${location.target}`)); } else if (error.name === 'NotFoundError') { if (!optional) { emit(processingResult.notFoundError(location, message)); From ce77e78c9371895ac34157cf48283c76031b595a Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Fri, 26 Aug 2022 10:07:16 +0200 Subject: [PATCH 2/4] add tests for emitting refresh keys Signed-off-by: Kiss Miklos --- .changeset/great-cats-sit.md | 5 ++++ .../modules/core/UrlReaderProcessor.test.ts | 30 +++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 .changeset/great-cats-sit.md diff --git a/.changeset/great-cats-sit.md b/.changeset/great-cats-sit.md new file mode 100644 index 0000000000..abdf9cfb39 --- /dev/null +++ b/.changeset/great-cats-sit.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixes a bug to be able to utilize refresh keys after the entity is loaded from cache diff --git a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts index ee68b2aa39..80992c7cbb 100644 --- a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts @@ -127,19 +127,25 @@ describe('UrlReaderProcessor', () => { mockCache.get.mockResolvedValue(cacheItem); const processor = new UrlReaderProcessor({ reader, logger }); - const generated = (await new Promise(emit => - processor.readLocation( - spec, - false, - emit, - defaultEntityDataParser, - mockCache, - ), - )) as CatalogProcessorEntityResult; + const emitted = new Array(); + await processor.readLocation( + spec, + false, + r => emitted.push(r), + defaultEntityDataParser, + mockCache, + ); + + const entity = emitted[0]; + const refresh = emitted[1]; + + expect(entity.type).toBe('entity'); + expect(entity.location).toEqual(spec); + expect(entity.entity).toEqual({ mock: 'entity' }); + + expect(refresh.type).toBe('refresh'); + expect(refresh.key).toBe('url:http://localhost/component.yaml'); - expect(generated.type).toBe('entity'); - expect(generated.location).toEqual(spec); - expect(generated.entity).toEqual({ mock: 'entity' }); expect(mockCache.get).toBeCalledWith('v1'); expect(mockCache.get).toBeCalledTimes(1); expect(mockCache.set).toBeCalledTimes(0); From b3a1299b89091569cdd8c0f1666d0e9545c320af Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Fri, 26 Aug 2022 10:12:49 +0200 Subject: [PATCH 3/4] fix types in tests Signed-off-by: Kiss Miklos --- .../src/modules/core/UrlReaderProcessor.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts index 80992c7cbb..c372eb12a6 100644 --- a/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts +++ b/plugins/catalog-backend/src/modules/core/UrlReaderProcessor.test.ts @@ -27,6 +27,7 @@ import { CatalogProcessorCache, CatalogProcessorEntityResult, CatalogProcessorErrorResult, + CatalogProcessorRefreshKeysResult, CatalogProcessorResult, } from '@backstage/plugin-catalog-node'; import { defaultEntityDataParser } from '../util/parse'; @@ -136,8 +137,8 @@ describe('UrlReaderProcessor', () => { mockCache, ); - const entity = emitted[0]; - const refresh = emitted[1]; + const entity = emitted[0] as CatalogProcessorEntityResult; + const refresh = emitted[1] as CatalogProcessorRefreshKeysResult; expect(entity.type).toBe('entity'); expect(entity.location).toEqual(spec); From 67980a927a39d194d77dff123a5036f60a567248 Mon Sep 17 00:00:00 2001 From: Kiss Miklos Date: Mon, 29 Aug 2022 10:59:55 +0200 Subject: [PATCH 4/4] remove condition to delete refreshKeys Signed-off-by: Kiss Miklos --- .../src/database/DefaultProcessingDatabase.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index c1a8ee9d33..1cf2643339 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -145,22 +145,20 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { BATCH_SIZE, ); - if (refreshKeys && refreshKeys.length > 0) { - // Delete old refresh keys - await tx('refresh_keys') - .where({ entity_id: id }) - .delete(); + // Delete old refresh keys + await tx('refresh_keys') + .where({ entity_id: id }) + .delete(); - // Insert the refresh keys for the processed entity - await tx.batchInsert( - 'refresh_keys', - refreshKeys.map(k => ({ - entity_id: id, - key: k.key, - })), - BATCH_SIZE, - ); - } + // Insert the refresh keys for the processed entity + await tx.batchInsert( + 'refresh_keys', + refreshKeys.map(k => ({ + entity_id: id, + key: k.key, + })), + BATCH_SIZE, + ); return { previous: {