diff --git a/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue b/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue index 5757e8c2..bcf640ae 100644 --- a/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue +++ b/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue @@ -15,6 +15,7 @@ import OverviewKeypairs from '../kubevirt.io.virtualmachine/VirtualMachineTabs/V import Volume from '../../edit/kubevirt.io.virtualmachine/VirtualMachineVolume'; import Network from '../../edit/kubevirt.io.virtualmachine/VirtualMachineNetwork'; import CloudConfig from '../../edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig'; +import { getBootDevices } from '../../utils/vm'; const UNDEFINED = 'n/a'; export default { @@ -74,18 +75,8 @@ export default { return image?.spec?.displayName || '-'; }, - disks() { - const disks = this?.spec?.template?.spec?.domain?.devices?.disks || []; - - return disks.filter((disk) => { - return !!disk.bootOrder; - }).sort((a, b) => { - if (a.bootOrder < b.bootOrder) { - return -1; - } - - return 1; - }); + bootDevices() { + return getBootDevices(this?.spec?.template?.spec?.domain?.devices); }, cdroms() { @@ -101,8 +92,10 @@ export default { getDeviceType(o) { if (o.disk) { return 'Disk'; - } else { + } else if (o.cdrom) { return 'CD-ROM'; + } else { + return 'Network'; } }, isEmpty(o) { @@ -184,10 +177,10 @@ export default {
@@ -233,6 +226,7 @@ export default { > diff --git a/pkg/harvester/detail/harvesterhci.io.vmsnapshot/index.vue b/pkg/harvester/detail/harvesterhci.io.vmsnapshot/index.vue index fc54aa70..c7fdbde0 100644 --- a/pkg/harvester/detail/harvesterhci.io.vmsnapshot/index.vue +++ b/pkg/harvester/detail/harvesterhci.io.vmsnapshot/index.vue @@ -15,6 +15,7 @@ import OverviewKeypairs from '../kubevirt.io.virtualmachine/VirtualMachineTabs/V import Volume from '../../edit/kubevirt.io.virtualmachine/VirtualMachineVolume'; import Network from '../../edit/kubevirt.io.virtualmachine/VirtualMachineNetwork'; import CloudConfig from '../../edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig'; +import { getBootDevices } from '../../utils/vm'; const UNDEFINED = 'n/a'; export default { @@ -74,18 +75,8 @@ export default { return image?.spec?.displayName || '-'; }, - disks() { - const disks = this?.spec?.template?.spec?.domain?.devices?.disks || []; - - return disks.filter((disk) => { - return !!disk.bootOrder; - }).sort((a, b) => { - if (a.bootOrder < b.bootOrder) { - return -1; - } - - return 1; - }); + bootDevices() { + return getBootDevices(this?.spec?.template?.spec?.domain?.devices); }, cdroms() { @@ -101,8 +92,10 @@ export default { getDeviceType(o) { if (o.disk) { return 'Disk'; - } else { + } else if (o.cdrom) { return 'CD-ROM'; + } else { + return 'Network'; } }, isEmpty(o) { @@ -184,10 +177,10 @@ export default {
@@ -234,6 +227,7 @@ export default { > diff --git a/pkg/harvester/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue b/pkg/harvester/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue index 7f92f48e..9c430723 100644 --- a/pkg/harvester/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +++ b/pkg/harvester/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue @@ -6,6 +6,7 @@ import HarvesterIpAddress from '../../../formatters/HarvesterIpAddress'; import VMConsoleBar from '../../../components/VMConsoleBar'; import { HCI } from '../../../types'; import { getVmCPUMemoryValues } from '../../../utils/cpuMemory'; +import { getBootDevices } from '../../../utils/vm'; const UNDEFINED = 'n/a'; @@ -69,18 +70,8 @@ export default { return image?.spec?.displayName || 'N/A'; }, - disks() { - const disks = this.value?.spec?.template?.spec?.domain?.devices?.disks || []; - - return disks.filter((disk) => { - return !!disk.bootOrder; - }).sort((a, b) => { - if (a.bootOrder < b.bootOrder) { - return -1; - } - - return 1; - }); + bootDevices() { + return getBootDevices(this.value?.spec?.template?.spec?.domain?.devices); }, cdroms() { @@ -122,8 +113,10 @@ export default { getDeviceType(o) { if (o.disk) { return 'Disk'; - } else { + } else if (o.cdrom) { return 'CD-ROM'; + } else { + return 'Network'; } }, isEmpty(o) { @@ -219,16 +212,16 @@ export default {
diff --git a/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue b/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue index eedafd62..b7975ed3 100644 --- a/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue +++ b/pkg/harvester/detail/kubevirt.io.virtualmachine/index.vue @@ -214,6 +214,7 @@ export default { this['diskRows'] = diskRows; this['networkRows'] = this.getNetworkRows(neu, { fromTemplate: false, init: false }); + this['networkBootFirst'] = this.isNetworkBootFirst(neu.spec); // getInitConfig() seeds these on created(); refresh them here too so the // VM-wide performance panel does not go stale when the spec changes. @@ -276,6 +277,7 @@ export default { > diff --git a/pkg/harvester/edit/harvesterhci.io.virtualmachinetemplateversion.vue b/pkg/harvester/edit/harvesterhci.io.virtualmachinetemplateversion.vue index 0358420b..753182a4 100644 --- a/pkg/harvester/edit/harvesterhci.io.virtualmachinetemplateversion.vue +++ b/pkg/harvester/edit/harvesterhci.io.virtualmachinetemplateversion.vue @@ -324,6 +324,7 @@ export default { > diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue index 7d6e5cb0..9904a1f4 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue @@ -2,6 +2,7 @@ import InputOrDisplay from '@shell/components/InputOrDisplay'; import { LabeledInput } from '@components/Form/LabeledInput'; import LabeledSelect from '@shell/components/form/LabeledSelect'; +import { Checkbox } from '@components/Form/Checkbox'; import { clone } from '@shell/utils/object'; import { _CREATE, _VIEW } from '@shell/config/query-params'; @@ -33,7 +34,7 @@ export default { emits: ['update'], components: { - LabeledInput, LabeledSelect, InputOrDisplay + LabeledInput, LabeledSelect, InputOrDisplay, Checkbox }, props: { @@ -169,6 +170,7 @@ export default { this.value.isPod = true; this.value.macAddress = ''; this.value.staticIp = ''; + this.value.networkBoot = false; } else { this.value.isPod = false; } @@ -285,6 +287,22 @@ export default {
+
+
+ +
+
+
import InfoBox from '@shell/components/InfoBox'; +import { RadioGroup } from '@components/Form/Radio'; import { NETWORK_ATTACHMENT } from '@shell/config/types'; import { sortBy } from '@shell/utils/sort'; import { clone } from '@shell/utils/object'; @@ -10,7 +11,11 @@ import { HCI as HCI_ANNOTATIONS } from '../../../config/labels-annotations'; import Base from './base'; export default { - components: { InfoBox, Base }, + components: { + InfoBox, Base, RadioGroup + }, + + emits: ['update:value', 'update:networkBootFirst'], props: { vm: { @@ -35,6 +40,11 @@ export default { isSingle: { type: Boolean, default: true + }, + + networkBootFirst: { + type: Boolean, + default: true } }, @@ -82,6 +92,20 @@ export default { vmState() { return this.vm?.stateDisplay; + }, + + hasNetworkBoot() { + return this.rows.some((R) => R.networkBoot); + }, + + networkBootOrderOptions() { + return [{ + label: this.t('harvester.virtualMachine.network.networkBoot.first'), + value: true + }, { + label: this.t('harvester.virtualMachine.network.networkBoot.last'), + value: false + }]; } }, @@ -218,6 +242,22 @@ export default { /> +
+ +
+