From cfd6a00fe02ad01e3a6d3b0b079938d4b7da8eca Mon Sep 17 00:00:00 2001 From: Soundarya Ravi Date: Fri, 8 May 2026 18:26:35 +0530 Subject: [PATCH] Include NFS to resource profile calculations --- .../create-storage-system/create-steps.tsx | 2 ++ .../capacity-and-nodes-step.tsx | 11 ++++++- .../configure-performance.tsx | 29 ++++++++++++++----- .../create-storage-system/footer.tsx | 3 +- packages/odf/components/utils/common.ts | 9 ++++-- packages/odf/constants/common.ts | 15 ++++++++++ packages/odf/utils/ocs.ts | 22 ++++++++++++-- 7 files changed, 76 insertions(+), 15 deletions(-) diff --git a/packages/odf/components/create-storage-system/create-steps.tsx b/packages/odf/components/create-storage-system/create-steps.tsx index f43e76f5f..f5dd93702 100644 --- a/packages/odf/components/create-storage-system/create-steps.tsx +++ b/packages/odf/components/create-storage-system/create-steps.tsx @@ -41,6 +41,7 @@ export const createSteps = ( nodes, createLocalVolumeSet, connectionDetails, + optionalSettings, } = state; const { systemNamespace, externalStorage, deployment } = backingStorage; const { encryption, kms } = securityAndNetwork; @@ -73,6 +74,7 @@ export const createSteps = ( nodes={nodes} systemNamespace={systemNamespace} isTNFEnabled={isTNFEnabled} + enableNFS={optionalSettings.enableNFS} /> ), }, diff --git a/packages/odf/components/create-storage-system/create-storage-system-steps/capacity-and-nodes-step/capacity-and-nodes-step.tsx b/packages/odf/components/create-storage-system/create-storage-system-steps/capacity-and-nodes-step/capacity-and-nodes-step.tsx index 8e4e6c2a4..756018de2 100644 --- a/packages/odf/components/create-storage-system/create-storage-system-steps/capacity-and-nodes-step/capacity-and-nodes-step.tsx +++ b/packages/odf/components/create-storage-system/create-storage-system-steps/capacity-and-nodes-step/capacity-and-nodes-step.tsx @@ -444,6 +444,7 @@ export const CapacityAndNodes: React.FC = ({ systemNamespace, infraType, isTNFEnabled, + enableNFS, }) => { const { capacity, @@ -473,7 +474,13 @@ export const CapacityAndNodes: React.FC = ({ const validations = isTNFEnabled ? [] - : capacityAndNodesValidate(nodes, state, isNoProvisioner, osdAmount); + : capacityAndNodesValidate( + nodes, + state, + isNoProvisioner, + osdAmount, + enableNFS + ); const onProfileChange = React.useCallback( (profile) => onResourceProfileChange(dispatch)(profile), [dispatch] @@ -528,6 +535,7 @@ export const CapacityAndNodes: React.FC = ({ selectedNodes={nodes} osdAmount={osdAmount} isTNFEnabled={isTNFEnabled} + enableNFS={enableNFS} /> Object.entries(ResourceProfile).map((value: [string, ResourceProfile]) => { const displayName = t('{{mode}} mode', { mode: value[0] }); @@ -36,7 +37,8 @@ const selectOptions = ( const { minCpu, minMem } = getResourceProfileRequirements( profile, osdAmount, - architecture + architecture, + enableNFS ); const description = `CPUs required: ${minCpu}, Memory required: ${minMem} GiB`; const isDisabled = @@ -69,16 +71,18 @@ type ProfileRequirementsTextProps = { selectedProfile: ResourceProfile; osdAmount: number; architecture?: string; + enableNFS?: boolean; }; export const ProfileRequirementsText: React.FC< ProfileRequirementsTextProps -> = ({ selectedProfile, osdAmount, architecture }) => { +> = ({ selectedProfile, osdAmount, architecture, enableNFS }) => { const { t } = useCustomTranslation(); const { minCpu, minMem } = getResourceProfileRequirements( selectedProfile, osdAmount, - architecture + architecture, + enableNFS ); return ( @@ -126,6 +130,7 @@ type ConfigurePerformanceProps = { selectedNodes: WizardNodeState[]; osdAmount?: number; isTNFEnabled?: boolean; + enableNFS?: boolean; }; const ConfigurePerformance: React.FC = ({ @@ -136,6 +141,7 @@ const ConfigurePerformance: React.FC = ({ selectedNodes, osdAmount, isTNFEnabled, + enableNFS, }) => { const { t } = useCustomTranslation(); const [availableNodes, availableNodesLoaded, availableNodesLoadError] = @@ -156,7 +162,8 @@ const ConfigurePerformance: React.FC = ({ allCpu, allMem, osdAmount, - architecture + architecture, + enableNFS ) ) { forceLean = true; @@ -174,7 +181,8 @@ const ConfigurePerformance: React.FC = ({ getTotalCpu(selectedNodes), getTotalMemoryInGiB(selectedNodes), osdAmount, - architecture + architecture, + enableNFS ) : true; const validated = @@ -199,7 +207,13 @@ const ConfigurePerformance: React.FC = ({ selectedKey={resourceProfile} id="resource-profile" className="odf-configure-performance__selector pf-v6-u-mb-md" - selectOptions={selectOptions(t, forceLean, osdAmount, architecture)} + selectOptions={selectOptions( + t, + forceLean, + osdAmount, + architecture, + enableNFS + )} onChange={onResourceProfileChange} validated={validated} isDisabled={isTNFEnabled} @@ -209,6 +223,7 @@ const ConfigurePerformance: React.FC = ({ selectedProfile={resourceProfile} osdAmount={osdAmount} architecture={architecture} + enableNFS={enableNFS} /> )} diff --git a/packages/odf/components/create-storage-system/footer.tsx b/packages/odf/components/create-storage-system/footer.tsx index 5c5067ac4..d36da43ff 100644 --- a/packages/odf/components/create-storage-system/footer.tsx +++ b/packages/odf/components/create-storage-system/footer.tsx @@ -309,7 +309,8 @@ const canJumpToNextStep = ( getTotalCpu(nodes), getTotalMemoryInGiB(nodes), osdAmount, - architecture + architecture, + optionalSettings.enableNFS ) && isValidCapacityAutoScalingConfig( capacityAndNodes.capacityAutoScaling.enable, diff --git a/packages/odf/components/utils/common.ts b/packages/odf/components/utils/common.ts index 8c59df21a..908b556c4 100644 --- a/packages/odf/components/utils/common.ts +++ b/packages/odf/components/utils/common.ts @@ -164,7 +164,8 @@ export const capacityAndNodesValidate = ( nodes: WizardNodeState[], state: WizardState['capacityAndNodes'], isNoProvSC: boolean, - osdAmount: number + osdAmount: number, + enableNFS?: boolean ): ValidationType[] => { const validations = []; const { @@ -189,7 +190,8 @@ export const capacityAndNodesValidate = ( totalCpu, totalMemory, osdAmount, - architecture + architecture, + enableNFS ) ) { validations.push(ValidationType.RESOURCE_PROFILE); @@ -200,7 +202,8 @@ export const capacityAndNodesValidate = ( totalCpu, totalMemory, osdAmount, - architecture + architecture, + enableNFS ) ) { validations.push(ValidationType.MINIMAL); diff --git a/packages/odf/constants/common.ts b/packages/odf/constants/common.ts index e68d4d0a5..32c5faf2c 100644 --- a/packages/odf/constants/common.ts +++ b/packages/odf/constants/common.ts @@ -84,6 +84,21 @@ export const S390X_CPU_ADJUSTMENTS = { }, }; +/** + * NFS resource requirements to be added when NFS is enabled + */ +export const NFS_RESOURCE_REQUIREMENTS = { + minCpu: 6, + minMem: 16, // GiB +}; + +/** + * s390x specific NFS CPU requirements + */ +export const NFS_S390X_CPU_REQUIREMENT = { + minCpu: 3, +}; + export enum DefaultRequestSize { BAREMETAL = '1', NON_BAREMETAL = '2Ti', diff --git a/packages/odf/utils/ocs.ts b/packages/odf/utils/ocs.ts index 90b82cfa8..e876b53d0 100644 --- a/packages/odf/utils/ocs.ts +++ b/packages/odf/utils/ocs.ts @@ -26,6 +26,8 @@ import { HOSTNAME_LABEL_KEY, LABEL_OPERATOR, MINIMUM_NODES, + NFS_RESOURCE_REQUIREMENTS, + NFS_S390X_CPU_REQUIREMENT, ocsTaint, RESOURCE_PROFILE_REQUIREMENTS_MAP, S390X_CPU_ADJUSTMENTS, @@ -131,7 +133,8 @@ export const getNodeArchitectureFromState = ( export const getResourceProfileRequirements = ( profile: ResourceProfile, osdAmount: number, - architecture?: string + architecture?: string, + enableNFS?: boolean ): { minCpu: number; minMem: number } => { let { minCpu, minMem, osd } = RESOURCE_PROFILE_REQUIREMENTS_MAP[profile]; @@ -148,6 +151,16 @@ export const getResourceProfileRequirements = ( cpu += Math.ceil(extraOsds * osd.cpu); mem += Math.ceil(extraOsds * osd.mem); } + + if (enableNFS) { + if (architecture === ARCHITECTURE_S390X) { + cpu += NFS_S390X_CPU_REQUIREMENT.minCpu; + } else { + cpu += NFS_RESOURCE_REQUIREMENTS.minCpu; + } + mem += NFS_RESOURCE_REQUIREMENTS.minMem; + } + return { minCpu: cpu, minMem: mem }; }; @@ -158,6 +171,7 @@ export const getResourceProfileRequirements = ( * @param memory The amount of selected nodes' memory in GiB. * @param osdAmount The amount of OSD pods. * @param architecture The node architecture. + * @param enableNFS Whether NFS is enabled. * @returns boolean */ export const isResourceProfileAllowed = ( @@ -165,12 +179,14 @@ export const isResourceProfileAllowed = ( cpu: number, memory: number, osdAmount: number, - architecture?: string + architecture?: string, + enableNFS?: boolean ): boolean => { const { minCpu, minMem } = getResourceProfileRequirements( profile, osdAmount, - architecture + architecture, + enableNFS ); return cpu >= minCpu && memory >= minMem;