fix: disk resize now opt-in — pre-filled with current size, disabled by default, checkbox to enable

- Backend: None = keep current size (no auto-shrink); only resize when value explicitly provided
- Frontend: Target Disk Size field shows detected size, disabled (not submitted)
- Checkbox 'Enable disk resize' unlocks the field for editing
This commit is contained in:
Claus Lohmar 2026-07-27 08:57:58 +00:00
parent 75f90f16bb
commit ae53d2fbd8
3 changed files with 22 additions and 16 deletions

View file

@ -300,16 +300,8 @@ def _process_job(job_id: str, req: JobSubmissionRequest):
target_gb = req.target_disk_size_gb target_gb = req.target_disk_size_gb
if target_gb is None: if target_gb is None:
# Auto-shrink: 10% of virtual size, minimum 20 GB logger.info("Disk size not specified — keeping current (%.1f GiB)", current_gb)
auto_target = max(int(current_gb * 0.1), 20) elif target_gb < current_gb:
if current_gb > auto_target:
target_gb = auto_target
logger.info("Auto-shrink: %.1f GiB → %d GiB (10%% rule)", current_gb, target_gb)
else:
target_gb = int(round(current_gb)) + 1
logger.info("Disk already <= target, no shrink needed")
if target_gb < current_gb:
_update_job(job_id, progress=60, _update_job(job_id, progress=60,
message=f"Shrinking disk to {target_gb} GiB...") message=f"Shrinking disk to {target_gb} GiB...")
logger.info("Shrinking disk: %.1f GiB → %d GiB via virt-resize", current_gb, target_gb) logger.info("Shrinking disk: %.1f GiB → %d GiB via virt-resize", current_gb, target_gb)

View file

@ -66,13 +66,15 @@
</div> </div>
<div class="pve-form-group"> <div class="pve-form-group">
<label>Target Disk Size (GB)</label> <label>Target Disk Size (GB)</label>
<input type="number" name="target_disk_size_gb" class="pve-input" <input type="number" name="target_disk_size_gb" id="target-disk-size" class="pve-input"
value="{{ analysis.disk_size_gb }}" value="{{ analysis.disk_size_gb }}" disabled>
placeholder="Leave blank for auto-shrink"> <label style="margin-top:0.3rem;font-size:0.72rem;display:flex;align-items:center;gap:0.3rem;cursor:pointer;">
<span class="pve-hint"> <input type="checkbox" id="enable-resize" onchange="toggleDiskResize()">
{{ analysis.disk_size_gb }} GB detected. Auto-shrink to {{ (analysis.disk_size_gb * 0.1)|round(0)|int if (analysis.disk_size_gb * 0.1) > 20 else 20 }} GB if left blank.<br> Enable disk resize (shrink or expand)
</label>
<span class="pve-hint" id="resize-hint">
Default: {{ analysis.disk_size_gb }} GB (no resize). Check the box above to change.
<strong>Warning:</strong> shrinking can break complex layouts (LVM, encryption). <strong>Warning:</strong> shrinking can break complex layouts (LVM, encryption).
If unsure, enter the full size ({{ analysis.disk_size_gb }} GB) to skip.
</span> </span>
</div> </div>
</div> </div>

View file

@ -166,6 +166,18 @@ function showError(msg) {
if (el) el.innerHTML += '<div class="pve-alert pve-alert-error" style="margin-top:0.5rem;">' + msg + '</div>'; if (el) el.innerHTML += '<div class="pve-alert pve-alert-error" style="margin-top:0.5rem;">' + msg + '</div>';
} }
function toggleDiskResize() {
var cb = document.getElementById('enable-resize');
var inp = document.getElementById('target-disk-size');
if (!cb || !inp) return;
if (cb.checked) {
inp.removeAttribute('disabled');
inp.focus();
} else {
inp.setAttribute('disabled', '');
}
}
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
async function startSession(e) { async function startSession(e) {