From 6b590b6efaef2a6fa7392dfcf74b6cd67371fc3d Mon Sep 17 00:00:00 2001 From: Sharon Gratch Date: Tue, 30 Jul 2024 11:15:45 +0300 Subject: [PATCH] VMware - filter VMs by available dynamiclly enum list of hosts Reference: https://github.com/kubev2v/forklift-console-plugin/issues/1274 This includes the following changes for the VMware provider VMs list: 1. Set the 'Host' filter to be a primary filter. 2. Display a dynamic list of hosts that the VMs run on as an enum filter to select. 3. Enable selecting any number of hosts from the enum filter list. If none, all VMs are filtered. 3. Enable to type-ahead input for displaying a subset of the enum filter list of hosts. Signed-off-by: Sharon Gratch --- .../VSphereVirtualMachinesList.tsx | 7 ++----- .../ProviderVirtualMachinesList.tsx | 9 ++++++++- .../utils/filters/hostFilter.ts | 19 +++++++++++++++++++ .../VirtualMachines/utils/filters/index.ts | 1 + 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/hostFilter.ts diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/VSphereVirtualMachinesList.tsx b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/VSphereVirtualMachinesList.tsx index e47b9fee8..71c0d2eea 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/VSphereVirtualMachinesList.tsx +++ b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/VSphereVirtualMachinesList.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { EnumToTuple, ResourceFieldFactory } from '@kubev2v/common'; import { VSphereVM } from '@kubev2v/types'; -import { concernFilter } from './utils/filters/concernFilter'; +import { concernFilter, hostFilter } from './utils/filters'; import { ProviderVirtualMachinesList, VmData } from './components'; import { ProviderVirtualMachinesProps } from './ProviderVirtualMachines'; import { getVmPowerState, useVSphereInventoryVms } from './utils'; @@ -44,11 +44,8 @@ export const vSphereVmFieldsMetadataFactory: ResourceFieldFactory = (t) => [ label: t('Host'), isVisible: true, isIdentity: false, - filter: { - type: 'freetext', - placeholderLabel: t('Filter by host'), - }, sortable: true, + filter: hostFilter(t), }, { resourceFieldId: 'folder', diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/components/ProviderVirtualMachinesList.tsx b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/components/ProviderVirtualMachinesList.tsx index 2067dd50c..dea8bef07 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/components/ProviderVirtualMachinesList.tsx +++ b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/components/ProviderVirtualMachinesList.tsx @@ -12,6 +12,7 @@ import { loadUserSettings, ResourceFieldFactory, RowProps, + SearchableEnumFilter, SearchableGroupedEnumFilter, ValueMatcher, } from '@kubev2v/common'; @@ -86,9 +87,10 @@ export const ProviderVirtualMachinesList: FC = userSettings={userSettings} extraSupportedFilters={{ concerns: SearchableGroupedEnumFilter, + host: SearchableEnumFilter, features: EnumFilter, }} - extraSupportedMatchers={[concernsMatcher, featuresMatcher]} + extraSupportedMatchers={[concernsMatcher, hostMatcher, featuresMatcher]} GlobalActionToolbarItems={showActions ? actions : undefined} toId={toId} onSelect={onSelectedIds} @@ -111,3 +113,8 @@ export const featuresMatcher: ValueMatcher = { filterType: 'features', matchValue: (features: { [key: string]: boolean }) => (filter: string) => !!features?.[filter], }; + +export const hostMatcher: ValueMatcher = { + filterType: 'host', + matchValue: (value: string) => (filter: string) => value == filter, +}; diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/hostFilter.ts b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/hostFilter.ts new file mode 100644 index 000000000..780b9daf5 --- /dev/null +++ b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/hostFilter.ts @@ -0,0 +1,19 @@ +import { EnumValue } from '@kubev2v/common'; + +/** + * This component enables filtering the VMware's virtual machines + * by the hostname that they are running on. + */ +export const hostFilter = (t: (string) => string) => { + return { + type: 'host', + primary: true, + placeholderLabel: t('Host'), + dynamicFilter: (items: { hostName: string }[]) => ({ + values: [ + ...Array.from(new Set(items.map((item) => item.hostName))) // at this point the list contains unique strings that can be used as ID + .map((label: string): EnumValue => ({ id: label, label })), + ], + }), + }; +}; diff --git a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/index.ts b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/index.ts index 20da6e874..035249727 100644 --- a/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/index.ts +++ b/packages/forklift-console-plugin/src/modules/Providers/views/details/tabs/VirtualMachines/utils/filters/index.ts @@ -1,3 +1,4 @@ // @index(['./*', /style/g], f => `export * from '${f.path}';`) export * from './concernFilter'; +export * from './hostFilter'; // @endindex