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 {
-
- {{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
+ {{ device.bootOrder }}. {{ device.name }} ({{ getDeviceType(device) }})
@@ -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 {
-
- {{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
+ {{ device.bootOrder }}. {{ device.name }} ({{ getDeviceType(device) }})
@@ -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 {
-
- {{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
+ {{ device.bootOrder }}. {{ device.name }} ({{ getDeviceType(device) }})
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 {
/>
+
+
+
+