Repository navigation
UI: allow memory setting in flex compute offering in GiB with unit selector (#14082) - #14413
saurabhkushwaha438 wants to merge 1 commit into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #14413 +/- ##
============================================
+ Coverage 19.91% 20.77% +0.86%
- Complexity 20198 21926 +1728
============================================
Files 6373 6496 +123
Lines 577230 591700 +14470
Branches 70696 72626 +1930
============================================
+ Hits 114936 122919 +7983
- Misses 449736 455445 +5709
- Partials 12558 13336 +778
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
@nvazquez a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress. |
|
UI build: ✔️ |
2c7e3a6 to
c401af2
Compare
|
@Damans227 a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress. |
|
UI build: ✔️ |
c401af2 to
6c3f959
Compare
|
@nvazquez a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress. |
|
UI build: ✔️ |
nvazquez
left a comment
There was a problem hiding this comment.
Hi @saurabhkushwaha438 I have tested it and I see a problem with custom unconstrained offerings as displayed in the screenshot, can you please take a look at this issue? Custom constrained is looking fine btw.
6c3f959 to
171b008
Compare
|
| return | ||
| } | ||
| this.$emit('update-compute-memory', this.memoryInputDecorator, value) | ||
| let memoryInMiB | ||
| if (this.memoryUnit === 'GiB') { |
There was a problem hiding this comment.
@saurabhkushwaha438 The memory field and its hover text show different amounts of memory value at the minimum and maximum of a constrained offering.
With min memory 100 MiB, the GiB control shows 0.25 GiB. Hovering it shows "Exact: 0.09765625 GiB (100 MiB)", and deploy sends 100 MiB. 0.25 GiB is 256 MiB, so the VM is created with a smaller size than the field shows. The same happens at the maximum.
| }, | ||
| validateInput (input, value) { | ||
| this.errors[input].status = '' | ||
| this.errors[input].message = '' | ||
|
|
||
| if (value === null || value === undefined || value.length === 0) { | ||
| if (value === null || value === undefined || value.length === 0 || value === '' || value === 0) { |
There was a problem hiding this comment.
@saurabhkushwaha438 Setting the CPU value to 0 does not clear the previously stored CPU count in the form. For example, after selecting a constrained offering, the form stores CPU = 2. When switching to an unconstrained custom offering, the CPU field displays 0 with the validation message "Please enter input". However, instance creation still proceeds successfully, and the VM is created with 2 CPUs, as the previously stored value is retained.
There was a problem hiding this comment.
well this is not related to this issue
| memoryInMiB = Math.round(displayValue * 1024) | ||
| } | ||
| } else { | ||
| memoryInMiB = Math.round(displayValue) |
There was a problem hiding this comment.
@saurabhkushwaha438 Switching between MiB and GiB updates only the displayed memory value, while the deploy form continues to retain the previously entered MiB value.
On an unconstrained custom offering:
- Enter 1100 MiB and then switch to GiB. The field displays 1.00 GiB, but when the instance is created, the deploy request still sends 1100 MiB (where 1.00 GiB = 1024 MiB).
- Enter 100 MiB and then switch to GiB. The field displays 0 GiB, but instance creation still succeeds, and the deploy request sends 100 MiB, resulting in a VM being created with 100 MiB of memory.
There was a problem hiding this comment.
thanks for pointing out this "Enter 100 MiB and then switch to GiB. The field displays 0 GiB, but instance creation still succeeds, and the deploy request sends 100 MiB, resulting in a VM being created with 100 MiB of memory."
There was a problem hiding this comment.
thanks for pointing out this "Enter 100 MiB and then switch to GiB. The field displays 0 GiB, but instance creation still succeeds, and the deploy request sends 100 MiB, resulting in a VM being created with 100 MiB of memory."
hey i am not able reproduce this problem , could you attach screenshot of it
There was a problem hiding this comment.
Could you please try this with custom unconstrained compute offering?
| maxMemoryInUnit () { | ||
| if (!this.maxMemory) return 0 | ||
| if (this.memoryUnit === 'GiB') { | ||
| return Math.max(this.minMemoryInUnit, Math.floor(this.maxMemory / 256) * 0.25) |
There was a problem hiding this comment.
@saurabhkushwaha438 For custom offerings with a memory range like 2000-2300 MiB, the field is effectively restricted to 2.00 GiB when the unit is switched to GiB. The slider cannot be moved to any other value within the allowed range, preventing selection of valid memory sizes between 2000 MiB and 2300 MiB.
@suryag1201 please go through this and then later i also make other changes according to feedback i was getting and here ui: allow memory setting in flex compute offering in GiB with 0.25 GiB step (#14082)
|
…rained offerings and Switch guard
171b008 to
b8cfd40
Compare
|
@nvazquez a Jenkins job has been kicked to build UI QA env. I'll keep you posted as I make progress. |
|
UI build failed: ✖️ |
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Copilot review overview
6 open issues
The same long predicate is duplicated in multiple bindings, and the1000000000threshold is a… · New The same long predicate is duplicated in multiple bindings, and the1000000000threshold is a… · New When GiB isn’t allowed, the UI still allows selecting “GiB” and then reverts with a warning in… · New The implementation hard-codes GiB stepping to 0.25 (and validates multiples of 0.25), but the PR… · New UsingMath.round(displayValue * 1024)in GiB mode can yield a MiB value that is slightly less… · New The implementation hard-codes GiB stepping to 0.25 (and validates multiples of 0.25), but the PR… · New
What changed in this PR
Adds a GiB/MiB unit selector for flex compute offering memory in the compute wizard, including display conversion and validation, while still emitting MiB integers for backend/API compatibility.
Changes:
- Introduces a memory unit selector (GiB/MiB) and binds slider/input to a display value in the selected unit.
- Adds GiB-availability checks + validation for GiB increments, and converts emitted values back to integer MiB.
- Adds i18n strings for GiB step validation and “GiB not supported” messaging.
| File | Description |
|---|---|
| ui/src/views/compute/wizard/ComputeSelection.vue | Adds unit selector UI, conversion logic, range checking tweaks, and GiB step validation. |
| ui/public/locales/en.json | Adds new localized error/help strings for GiB step validation and unsupported GiB mode. |
Review effort: Lite
| :help="errors.memory.message"> | ||
| <a-row :gutter="12"> | ||
| <a-col :md="10" :lg="10" v-show="isConstrained && maxMemory && !isNaN(maxMemory)"> | ||
| <a-col :md="14" :lg="14" v-show="isConstrained && maxMemory && !isNaN(maxMemory) && maxMemory < 1000000000"> |
| v-model:value="memoryInputValue" | ||
| @change="($event) => updateComputeMemory($event)" | ||
| /> | ||
| <a-col :md="isConstrained && maxMemory && !isNaN(maxMemory) && maxMemory < 1000000000 ? 10 : 24" :lg="isConstrained && maxMemory && !isNaN(maxMemory) && maxMemory < 1000000000 ? 10 : 24"> |
| v-model:value="memoryUnit" | ||
| style="width: 75px" | ||
| @change="handleUnitChange"> | ||
| <a-select-option value="GiB" :title="!isGiBAllowed ? $t('message.memory.gib.not.supported') : undefined"> |
| memoryStep () { | ||
| if (this.memoryUnit === 'GiB') { | ||
| return 0.25 | ||
| } | ||
| return 1 | ||
| }, |
| let memoryInMiB | ||
| if (this.memoryUnit === 'GiB') { | ||
| memoryInMiB = Math.round(displayValue * 1024) | ||
| } else { | ||
| memoryInMiB = Math.round(displayValue) | ||
| } | ||
|
|
| if (input === 'memory') { | ||
| if (this.memoryUnit === 'GiB') { | ||
| const isStepMultiple = Math.abs(value * 4 - Math.round(value * 4)) < 0.001 | ||
| if (!isStepMultiple) { | ||
| this.errors.memory.status = 'error' | ||
| this.errors.memory.message = this.$t('message.error.memory.gib.step') || 'Please enter memory in multiples of 0.25 GiB (256 MiB), or switch to MiB.' | ||
| return false | ||
| } | ||
| } | ||
| } |
|
Hi @saurabhkushwaha438 can you please check the Copilot comments and also address the UI build that is failing? |



Description
Fixes #14082
1. Conversion from MiB to GiB (Display & Rounding)
1 GiB = 1024 MiB).0.01(or smaller for sub-GiB offerings) with precision2.1with integer precision0.2. Conversion from GiB to MiB (Backend Value Emission)
minMemory/maxMemory), selecting the exact minimum or maximum bound in GiB directly maps to the exact integerminMemoryormaxMemoryin MiB to eliminate any potential off-by-one rounding discrepancies.💬 Feedback Needed: Fractional GiB to Integer MiB Rounding
1.51 GiB × 1024 = 1546.24 MiB).1546 MiB), which is then emitted in the API payload and consumed by backend hypervisor managers.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