Skip to content

UI: allow memory setting in flex compute offering in GiB with unit selector (#14082) - #14413

Open
saurabhkushwaha438 wants to merge 1 commit into
apache:mainfrom
saurabhkushwaha438:issue-14082-flex-memory-gib
Open

saurabhkushwaha438 wants to merge 1 commit into
apache:mainfrom
saurabhkushwaha438:issue-14082-flex-memory-gib

Conversation

@saurabhkushwaha438

Copy link
Copy Markdown
Contributor

Description

Fixes #14082

1. Conversion from MiB to GiB (Display & Rounding)

  • Binary conversion is used (1 GiB = 1024 MiB).
  • When offerings with predefined constraints or initial values are loaded in MiB, or when switching from MiB to GiB:
    $$\text{displayValue} = \text{parseFloat}\left(\left(\frac{\text{rawMemory}}{1024}\right)\text{.toFixed(2)}\right)$$
  • The display value is rounded to 2 decimal places to keep the UI clean, readable, and intuitive for users.
  • Slider step dynamically adjusts:
    • In GiB mode: step is set to 0.01 (or smaller for sub-GiB offerings) with precision 2.
    • In MiB mode: step is set to 1 with integer precision 0.

2. Conversion from GiB to MiB (Backend Value Emission)

  • CloudStack APIs and backend services expect memory allocations in integer MiB.
  • When the user selects or inputs memory in GiB:
    $$\text{memoryInMiB} = \text{Math.round}(\text{displayValue} \times 1024)$$
  • Exact Boundary Protection: If a compute offering has minimum/maximum memory constraints (minMemory / maxMemory), selecting the exact minimum or maximum bound in GiB directly maps to the exact integer minMemory or maxMemory in MiB to eliminate any potential off-by-one rounding discrepancies.

💬 Feedback Needed: Fractional GiB to Integer MiB Rounding

  • Observation: Converting decimal GiB values to MiB often produces fractional values (e.g., 1.51 GiB × 1024 = 1546.24 MiB).
  • Current Behavior: The UI rounds this to the nearest integer (1546 MiB), which is then emitted in the API payload and consumed by backend hypervisor managers.
  • Reviewer Input: Looking for maintainer feedback on whether standard nearest-integer rounding (Math.round) is acceptable, or if we should apply ceiling (Math.ceil) to guarantee the VM always receives at least the requested GiB amount.
bandicam.2026-10-16.10-21-12-210.mp4

this.updateComputeCpuNumber(this.preFillContent.cpunumber || this.cpuNumberInputValue)
this.updateComputeCpuSpeed(this.preFillContent.cpuspeed || this.cpuSpeedInputValue)
this.updateComputeMemory(this.preFillContent.memory || this.memoryInputValue)
this.updateComputeMemory(this.memoryDisplayValue)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what happens when the memory isnt a round GiB value? an imported vm with 1500 MB shows as 1.46 GiB and gets sent back as 1495 without the user touching it

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice catch , now i am confuse and would be great to get suggestion from you and others

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

np. maybe, we can open it in MiB when the value isnt a whole number of GiB? then 1500 stays 1500. on load and on a unit switch, send the saved MiB value as is and only convert when the user changes the number.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

another option could be use GIB for display only because MIB is only state and single source of truth so in backend we will use actual MIB value

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that only works if the saved MiB is what gets sent.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bandicam.2026-10-17.21-08-51-749.mp4

how about this , is this better direction

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@saurabhkushwaha438 This looks better. But IMHO I think that having a slider for GiB that goes in increments of 0.01 is not a very interesting design. I think both the GiB and MiB increments should be of 1 (of their respective unit of mesurement).
If you want to have a VM with 1.6 GiB for some reason, you can just use the MiB slider. I believe most users will use whole GiB numbers, not fractions.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok i will this "GiB and MiB increments should be of 1"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bandicam.2026-10-17.21-08-51-749.mp4
how about this , is this better direction

and i havent commited those change yet

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@saurabhkushwaha438 yes this is a better direction, 1500 stays 1500 now unless the user changes it. any reason for 0.25 GiB steps? you agreed with joao on steps of 1 for GiB and MiB.

@codecov

codecov Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 3.87%. Comparing base (7ed0cec) to head (c401af2).
⚠️ Report is 82 commits behind head on main.

❗ There is a different number of reports uploaded between BASE (7ed0cec) and HEAD (c401af2). Click for more details.

HEAD has 1 upload less than BASE
Flag BASE (7ed0cec) HEAD (c401af2)
unittests 1 0
Additional details and impacted files
@@              Coverage Diff              @@
##               main   #14413       +/-   ##
=============================================
- Coverage     19.91%    3.87%   -16.04%     
=============================================
  Files          6373      493     -5880     
  Lines        577230    42613   -534617     
  Branches      70696     8087    -62609     
=============================================
- Hits         114936     1653   -113283     
+ Misses       449736    40729   -409007     
+ Partials      12558      231    -12327     
Flag Coverage Δ
uitests 3.87% <ø> (+0.16%) ⬆️
unittests ?

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@nvazquez nvazquez added this to the 24.0 milestone Oct 30, 2026
@nvazquez

Copy link
Copy Markdown
Contributor

@blueorangutan ui

@blueorangutan

Copy link
Copy Markdown

@nvazquez a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress.

@blueorangutan

Copy link
Copy Markdown

UI build: ✔️
Live QA URL: https://qa.cloudstack.cloud/simulator/pr/14413 (QA-JID-1003)

@saurabhkushwaha438
saurabhkushwaha438 force-pushed the issue-14082-flex-memory-gib branch from db7c8a0 to 2c7e3a6 Compare October 30, 2026 06:33
…B step (apache#14082)

- Add compact unit selector dropdown (GiB/MiB) for flex compute offerings
- Use fixed 0.25 GiB steps in GiB mode (binary-exact to 256 MiB intervals, zero rounding errors)
- Maintain integer MiB as authoritative internal state to prevent lossy conversion on load
- Default to GiB for 256 MiB multiples and MiB for arbitrary sizes (e.g. 1500 MiB)
- Add hover tooltip to display exact converted values
@saurabhkushwaha438
saurabhkushwaha438 force-pushed the issue-14082-flex-memory-gib branch from 2c7e3a6 to c401af2 Compare October 30, 2026 06:42
updateComputeMemory (displayValue) {
if (displayValue === null || displayValue === undefined) {
this.memoryDisplayValue = 0
displayValue = 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@saurabhkushwaha438 can we keep the required error when the box is cleared? on an offering with no limits this now sends 0 instead.

@Damans227

Copy link
Copy Markdown
Collaborator

@blueorangutan ui

@blueorangutan

Copy link
Copy Markdown

@Damans227 a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UI: Please change memory setting in flex compute offering from MiB to GiB

5 participants