From 9b9c05c05501a1a81c3eaf52d70c49b19c73bcd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Vit=C3=A1sek?= Date: Tue, 30 Jan 2024 09:23:51 +0100 Subject: [PATCH 1/8] adding fields limitation for EntityPicker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ladislav Vitásek --- .changeset/four-walls-perform.md | 5 +++++ .../components/fields/EntityPicker/EntityPicker.tsx | 12 +++++++++++- .../src/components/fields/EntityPicker/schema.ts | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-walls-perform.md diff --git a/.changeset/four-walls-perform.md b/.changeset/four-walls-perform.md new file mode 100644 index 0000000000..bb30a0cc2b --- /dev/null +++ b/.changeset/four-walls-perform.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +Scaffolding - EntityPicker component - now it does not load full entity data, only a specified set - defaults to `['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']`. It can significantly reduce loaded time bigger data set. It's possible to set fields to ignore configure via `fieldsToIgnore` in UI options of the EntityPicker component. diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index 0d45fe771c..d2c88a0b03 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -61,14 +61,24 @@ export const EntityPicker = (props: EntityPickerProps) => { } = props; const catalogFilter = buildCatalogFilter(uiSchema); const defaultKind = uiSchema['ui:options']?.defaultKind; + const fieldsToIgnore = uiSchema['ui:options']?.fieldsToIgnore; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace || undefined; const catalogApi = useApi(catalogApiRef); const { value: entities, loading } = useAsync(async () => { + const defaultFieldsToIgnore = [ + 'metadata.name', + 'metadata.namespace', + 'metadata.title', + 'kind', + ]; + const fields = fieldsToIgnore || defaultFieldsToIgnore; const { items } = await catalogApi.getEntities( - catalogFilter ? { filter: catalogFilter } : undefined, + catalogFilter + ? { filter: catalogFilter, fields: fields } + : { filter: undefined, fields: fields }, ); return items; }); diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index eb1bba364b..5617ca2073 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -41,6 +41,13 @@ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( .describe( 'DEPRECATED: Use `catalogFilter` instead. List of kinds of entities to derive options from', ), + fieldsToIgnore: z + .array(z.string()) + .optional() + .describe( + 'Fields to ignore from loading - download only the parts of each entity that match the field declarations.' + + " Defaults to: fields: ['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']", + ), defaultKind: z .string() .optional() From 747f9ba9cde7686121ca2c048af207e301a8e58f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Vit=C3=A1sek?= Date: Tue, 30 Jan 2024 09:35:58 +0100 Subject: [PATCH 2/8] renamed `fields` configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ladislav Vitásek --- .changeset/four-walls-perform.md | 2 +- .../src/components/fields/EntityPicker/EntityPicker.tsx | 2 +- plugins/scaffolder/src/components/fields/EntityPicker/schema.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/four-walls-perform.md b/.changeset/four-walls-perform.md index bb30a0cc2b..e680a8b549 100644 --- a/.changeset/four-walls-perform.md +++ b/.changeset/four-walls-perform.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder': minor --- -Scaffolding - EntityPicker component - now it does not load full entity data, only a specified set - defaults to `['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']`. It can significantly reduce loaded time bigger data set. It's possible to set fields to ignore configure via `fieldsToIgnore` in UI options of the EntityPicker component. +Scaffolding - EntityPicker component - now it does not load full entity data, only a specified set - defaults to `['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']`. It can significantly reduce loaded time bigger data set. It's possible to set fields to ignore configure via `fields` in UI options of the EntityPicker component. diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index d2c88a0b03..760a14b8a8 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -61,7 +61,7 @@ export const EntityPicker = (props: EntityPickerProps) => { } = props; const catalogFilter = buildCatalogFilter(uiSchema); const defaultKind = uiSchema['ui:options']?.defaultKind; - const fieldsToIgnore = uiSchema['ui:options']?.fieldsToIgnore; + const fieldsToIgnore = uiSchema['ui:options']?.fields; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace || undefined; diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index 5617ca2073..fd02e80c73 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -41,7 +41,7 @@ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( .describe( 'DEPRECATED: Use `catalogFilter` instead. List of kinds of entities to derive options from', ), - fieldsToIgnore: z + fields: z .array(z.string()) .optional() .describe( From b8b68b34a9dc105043e0e958cdf8dea6ef70862f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Vit=C3=A1sek?= Date: Tue, 30 Jan 2024 09:38:04 +0100 Subject: [PATCH 3/8] renamed variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ladislav Vitásek --- .../src/components/fields/EntityPicker/EntityPicker.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index 760a14b8a8..6a74b9ae51 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -61,20 +61,20 @@ export const EntityPicker = (props: EntityPickerProps) => { } = props; const catalogFilter = buildCatalogFilter(uiSchema); const defaultKind = uiSchema['ui:options']?.defaultKind; - const fieldsToIgnore = uiSchema['ui:options']?.fields; + const customFields = uiSchema['ui:options']?.fields; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace || undefined; const catalogApi = useApi(catalogApiRef); const { value: entities, loading } = useAsync(async () => { - const defaultFieldsToIgnore = [ + const defaultFields = [ 'metadata.name', 'metadata.namespace', 'metadata.title', 'kind', ]; - const fields = fieldsToIgnore || defaultFieldsToIgnore; + const fields = customFields || defaultFields; const { items } = await catalogApi.getEntities( catalogFilter ? { filter: catalogFilter, fields: fields } From 089f5800b48f3e73d5fe8a192c2ec6769ae7b915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Vit=C3=A1sek?= Date: Tue, 30 Jan 2024 09:41:47 +0100 Subject: [PATCH 4/8] change texting for `fields` describe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ladislav Vitásek --- plugins/scaffolder/src/components/fields/EntityPicker/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index fd02e80c73..0b9ddbe672 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -45,7 +45,7 @@ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( .array(z.string()) .optional() .describe( - 'Fields to ignore from loading - download only the parts of each entity that match the field declarations.' + + 'Download only the parts of each entity that match the field declarations.' + " Defaults to: fields: ['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']", ), defaultKind: z From 16e3f31218b5c3cfbbf0cbbe6708cc028aa8075d Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 30 Jan 2024 09:42:50 +0100 Subject: [PATCH 5/8] Update four-walls-perform.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ben Lambert Signed-off-by: blam Signed-off-by: Ladislav Vitásek --- .changeset/four-walls-perform.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.changeset/four-walls-perform.md b/.changeset/four-walls-perform.md index e680a8b549..b8e4c80416 100644 --- a/.changeset/four-walls-perform.md +++ b/.changeset/four-walls-perform.md @@ -2,4 +2,5 @@ '@backstage/plugin-scaffolder': minor --- -Scaffolding - EntityPicker component - now it does not load full entity data, only a specified set - defaults to `['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']`. It can significantly reduce loaded time bigger data set. It's possible to set fields to ignore configure via `fields` in UI options of the EntityPicker component. +Updating the `EntityPicker` to only select by default `kind` `metadata.name` `metadata.namespace` and `metadata.title` by default to improve performance on larger datasets. + From c88ec5c06d19182c48a96c0b1af5dc0d96af10f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ladislav=20Vit=C3=A1sek?= Date: Tue, 30 Jan 2024 11:42:05 +0100 Subject: [PATCH 6/8] bare minimum to resolve large datasets problem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ladislav Vitásek --- .changeset/four-walls-perform.md | 3 +-- .../src/components/fields/EntityPicker/EntityPicker.tsx | 9 +-------- .../src/components/fields/EntityPicker/schema.ts | 7 ------- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/.changeset/four-walls-perform.md b/.changeset/four-walls-perform.md index b8e4c80416..5275da7b79 100644 --- a/.changeset/four-walls-perform.md +++ b/.changeset/four-walls-perform.md @@ -2,5 +2,4 @@ '@backstage/plugin-scaffolder': minor --- -Updating the `EntityPicker` to only select by default `kind` `metadata.name` `metadata.namespace` and `metadata.title` by default to improve performance on larger datasets. - +Updating the `EntityPicker` to only select `kind` `metadata.name` and `metadata.namespace` by default to improve performance on larger datasets. diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index 6a74b9ae51..c9b74b49c7 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -61,20 +61,13 @@ export const EntityPicker = (props: EntityPickerProps) => { } = props; const catalogFilter = buildCatalogFilter(uiSchema); const defaultKind = uiSchema['ui:options']?.defaultKind; - const customFields = uiSchema['ui:options']?.fields; const defaultNamespace = uiSchema['ui:options']?.defaultNamespace || undefined; const catalogApi = useApi(catalogApiRef); const { value: entities, loading } = useAsync(async () => { - const defaultFields = [ - 'metadata.name', - 'metadata.namespace', - 'metadata.title', - 'kind', - ]; - const fields = customFields || defaultFields; + const fields = ['metadata.name', 'metadata.namespace', 'kind']; const { items } = await catalogApi.getEntities( catalogFilter ? { filter: catalogFilter, fields: fields } diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts index 0b9ddbe672..eb1bba364b 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts +++ b/plugins/scaffolder/src/components/fields/EntityPicker/schema.ts @@ -41,13 +41,6 @@ export const EntityPickerFieldSchema = makeFieldSchemaFromZod( .describe( 'DEPRECATED: Use `catalogFilter` instead. List of kinds of entities to derive options from', ), - fields: z - .array(z.string()) - .optional() - .describe( - 'Download only the parts of each entity that match the field declarations.' + - " Defaults to: fields: ['metadata.name', 'metadata.namespace', 'metadata.title', 'kind']", - ), defaultKind: z .string() .optional() From 03d9a7406f365131376b5176fe72bb28ec2fc57b Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 30 Jan 2024 11:44:49 +0100 Subject: [PATCH 7/8] Update EntityPicker.tsx Signed-off-by: Ben Lambert --- .../src/components/fields/EntityPicker/EntityPicker.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx index c9b74b49c7..76dbe42332 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.tsx @@ -70,8 +70,8 @@ export const EntityPicker = (props: EntityPickerProps) => { const fields = ['metadata.name', 'metadata.namespace', 'kind']; const { items } = await catalogApi.getEntities( catalogFilter - ? { filter: catalogFilter, fields: fields } - : { filter: undefined, fields: fields }, + ? { filter: catalogFilter, fields } + : { filter: undefined, fields }, ); return items; }); From 1693ac03b1565257893a5fab93259f053bd658ac Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 30 Jan 2024 12:57:05 +0100 Subject: [PATCH 8/8] chore: fixing tests Signed-off-by: blam --- .../fields/EntityPicker/EntityPicker.test.tsx | 93 +++++++++++-------- .../fields/OwnerPicker/OwnerPicker.test.tsx | 66 +++++++------ 2 files changed, 91 insertions(+), 68 deletions(-) diff --git a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx index 4329b2208b..8016a6ae83 100644 --- a/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/EntityPicker/EntityPicker.test.tsx @@ -89,7 +89,10 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith(undefined); + expect(catalogApi.getEntities).toHaveBeenCalledWith({ + fields: ['metadata.name', 'metadata.namespace', 'kind'], + filter: undefined, + }); }); it('updates even if there is not an exact match', async () => { @@ -130,11 +133,13 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: { - kind: ['User'], - }, - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: { + kind: ['User'], + }, + }), + ); }); }); @@ -173,18 +178,20 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: [ - { - kind: ['Group'], - 'metadata.name': 'test-entity', - }, - { - kind: ['User'], - 'metadata.name': 'test-entity', - }, - ], - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: [ + { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + { + kind: ['User'], + 'metadata.name': 'test-entity', + }, + ], + }), + ); }); it('allow single top level filter', async () => { uiSchema = { @@ -204,12 +211,14 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: { - kind: ['Group'], - 'metadata.name': 'test-entity', - }, - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: { + kind: ['Group'], + 'metadata.name': 'test-entity', + }, + }), + ); }); it('search for entitities containing an specific key', async () => { @@ -230,14 +239,16 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: [ - { - kind: ['User'], - 'metadata.annotation.some/anotation': CATALOG_FILTER_EXISTS, - }, - ], - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: [ + { + kind: ['User'], + 'metadata.annotation.some/anotation': CATALOG_FILTER_EXISTS, + }, + ], + }), + ); }); }); @@ -273,14 +284,16 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: [ - { - kind: ['Group'], - 'metadata.name': 'test-group', - }, - ], - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: [ + { + kind: ['Group'], + 'metadata.name': 'test-group', + }, + ], + }), + ); }); }); diff --git a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx index 3c948b8261..57ca8e53ab 100644 --- a/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/OwnerPicker/OwnerPicker.test.tsx @@ -94,11 +94,14 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: { - kind: ['Group', 'User'], - }, - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: { + kind: ['Group', 'User'], + }, + fields: ['metadata.name', 'metadata.namespace', 'kind'], + }), + ); }); }); @@ -124,11 +127,14 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: { - kind: ['User'], - }, - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: { + kind: ['User'], + }, + fields: ['metadata.name', 'metadata.namespace', 'kind'], + }), + ); }); }); @@ -163,14 +169,16 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: [ - { - kind: ['Group'], - 'spec.type': 'team', - }, - ], - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: [ + { + kind: ['Group'], + 'spec.type': 'team', + }, + ], + }), + ); }); }); @@ -208,16 +216,18 @@ describe('', () => { , ); - expect(catalogApi.getEntities).toHaveBeenCalledWith({ - filter: [ - { - kind: ['Group', 'User'], - }, - { - 'spec.type': ['team', 'business-unit'], - }, - ], - }); + expect(catalogApi.getEntities).toHaveBeenCalledWith( + expect.objectContaining({ + filter: [ + { + kind: ['Group', 'User'], + }, + { + 'spec.type': ['team', 'business-unit'], + }, + ], + }), + ); }); }); });