Skip to content

Commit 6403a2e

Browse files
committed
feat(xo6/new-vm-form): allow resizing existing template disks when a config drive is used
1 parent 7a18762 commit 6403a2e

2 files changed

Lines changed: 43 additions & 14 deletions

File tree

@xen-orchestra/web/src/modules/vm/components/new/NewVmSrTable.vue

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ import UiTableCell from '@core/components/ui/table-cell/UiTableCell.vue'
3333
import { useFormSelect } from '@core/packages/form-select'
3434
import { useNewVmSrColumns } from '@core/tables/column-sets/new-vm-sr-columns.ts'
3535
import { renderBodyCell } from '@core/tables/helpers/render-body-cell.ts'
36-
import { toRef } from 'vue'
36+
import { toRef, watch } from 'vue'
3737
import { useI18n } from 'vue-i18n'
3838
39-
const { vmState, srs } = defineProps<{
39+
const { vmState, srs, canResizeExistingDisks, defaultExistingVdis } = defineProps<{
4040
vmState: VmState
4141
srs: FrontXoSr[]
42+
canResizeExistingDisks: boolean
43+
defaultExistingVdis: Vdi[]
4244
}>()
4345
4446
const emit = defineEmits<{
@@ -65,10 +67,29 @@ const { HeadCells, BodyCells, colspan } = useNewVmSrColumns({
6567
const size = toRef(vdi, 'size')
6668
const description = toRef(vdi, 'name_description')
6769
70+
const isExistingVdi = vmState.existingVdis.includes(vdi)
71+
const defaultVdi = isExistingVdi ? defaultExistingVdis[vmState.existingVdis.indexOf(vdi)] : undefined
72+
const isDisabled = isExistingVdi ? !canResizeExistingDisks : false
73+
74+
if (isExistingVdi && defaultVdi) {
75+
watch(
76+
() => vdi.size,
77+
newValue => {
78+
if (isExistingVdi && newValue < defaultVdi.size) {
79+
vdi.size = defaultVdi.size
80+
}
81+
}
82+
)
83+
}
84+
6885
return {
6986
sr: r => r(srSelectId),
7087
diskName: r => r(diskName),
71-
size: r => r(size, { disabled: !onRemove }),
88+
size: r =>
89+
r(size, {
90+
disabled: isDisabled,
91+
min: defaultVdi?.size ?? 1,
92+
} as any),
7293
description: r => r(description),
7394
remove: r => (onRemove ? r(onRemove) : renderBodyCell()),
7495
}

@xen-orchestra/web/src/pages/vm/new.vue

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@
192192
<NewVmSrTable
193193
:srs="filteredSrs"
194194
:vm-state
195+
:can-resize-existing-disks="canResizeExistingDisks"
196+
:default-existing-vdis="defaultExistingVdis"
195197
@add="addStorageEntry()"
196198
@remove="index => deleteItem(vmState.vdis, index)"
197199
/>
@@ -634,26 +636,32 @@ const redirectToPool = (poolId: XoPool['id']) => {
634636
router.push({ name: '/pool/[id]/dashboard', params: { id: poolId } })
635637
}
636638
637-
function getExistingVdisDiff(vdi1: Vdi, vdi2: Vdi) {
638-
const changes: Record<string, unknown> = {}
639-
let hasChanged = false
639+
function getExistingVdisDiff(vdi1: Vdi, vdi2: Vdi, canResizeExistingDisks: boolean = false) {
640+
const changes: Partial<Vdi> = {}
640641
641-
for (const _key in vdi1) {
642-
const key = _key as keyof Vdi
642+
if (vdi1.name_label !== vdi2.name_label) {
643+
changes.name_label = vdi2.name_label
644+
}
643645
644-
if (vdi1[key] !== vdi2[key]) {
645-
hasChanged = true
646-
changes[key] = vdi2[key]
647-
}
646+
if (vdi1.name_description !== vdi2.name_description) {
647+
changes.name_description = vdi2.name_description
648+
}
649+
650+
if (canResizeExistingDisks && vdi1.size !== vdi2.size) {
651+
changes.size = vdi2.size
648652
}
649653
650-
return hasChanged ? (changes as Partial<Vdi>) : undefined
654+
return Object.keys(changes).length > 0 ? changes : undefined
651655
}
652656
657+
const canResizeExistingDisks = computed(() => {
658+
return vmState.installMode !== 'no-config'
659+
})
660+
653661
const modifiedExistingVdis = computed(() => {
654662
return vmState.existingVdis.reduce<Partial<Vdi>[]>((acc, vdi, index) => {
655663
const defaultVdi = defaultExistingVdis.value[index]
656-
const changes = getExistingVdisDiff(defaultVdi, vdi)
664+
const changes = getExistingVdisDiff(defaultVdi, vdi, canResizeExistingDisks.value)
657665
658666
if (changes) {
659667
acc.push({ ...changes, userdevice: vdi.userdevice })

0 commit comments

Comments
 (0)