From 771d4af0a2bb48d270451c4060b80afc72a4f4a1 Mon Sep 17 00:00:00 2001 From: David Edler Date: Wed, 18 Sep 2024 16:52:09 +0200 Subject: [PATCH] fix(instance) allow root disk device to have a custom name Signed-off-by: David Edler --- src/components/forms/DiskDeviceFormCustom.tsx | 7 +++++-- src/components/forms/DiskDeviceFormRoot.tsx | 8 +++----- src/util/configInheritance.tsx | 5 ++++- src/util/instanceValidation.tsx | 6 +++++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/components/forms/DiskDeviceFormCustom.tsx b/src/components/forms/DiskDeviceFormCustom.tsx index 38133afcd7..8180a500ba 100644 --- a/src/components/forms/DiskDeviceFormCustom.tsx +++ b/src/components/forms/DiskDeviceFormCustom.tsx @@ -15,7 +15,10 @@ import { getConfigurationRowBase } from "components/ConfigurationRow"; import DetachDiskDeviceBtn from "pages/instances/actions/DetachDiskDeviceBtn"; import classnames from "classnames"; import { LxdStorageVolume } from "types/storage"; -import { isDiskDeviceMountPointMissing } from "util/instanceValidation"; +import { + isDiskDeviceMountPointMissing, + isRootDisk, +} from "util/instanceValidation"; import { ensureEditMode } from "util/instanceEdit"; import { getExistingDeviceNames } from "util/devices"; import { LxdProfile } from "types/profile"; @@ -29,7 +32,7 @@ interface Props { const DiskDeviceFormCustom: FC = ({ formik, project, profiles }) => { const readOnly = (formik.values as EditInstanceFormValues).readOnly; const customVolumes = formik.values.devices - .filter((device) => device.name !== "root" && device.type === "disk") + .filter((item) => item.type === "disk" && !isRootDisk(item)) .map((device) => device as FormDiskDevice); const focusField = (name: string) => { diff --git a/src/components/forms/DiskDeviceFormRoot.tsx b/src/components/forms/DiskDeviceFormRoot.tsx index 5498695c82..30e7c5a362 100644 --- a/src/components/forms/DiskDeviceFormRoot.tsx +++ b/src/components/forms/DiskDeviceFormRoot.tsx @@ -12,7 +12,7 @@ import DiskSizeSelector from "components/forms/DiskSizeSelector"; import { LxdStoragePool } from "types/storage"; import { LxdProfile } from "types/profile"; import { removeDevice } from "util/formDevices"; -import { hasNoRootDisk } from "util/instanceValidation"; +import { hasNoRootDisk, isRootDisk } from "util/instanceValidation"; import { ensureEditMode } from "util/instanceEdit"; interface Props { @@ -29,9 +29,7 @@ const DiskDeviceFormRoot: FC = ({ profiles, }) => { const readOnly = (formik.values as EditInstanceFormValues).readOnly; - const rootIndex = formik.values.devices.findIndex( - (item) => item.type === "disk" && item.name === "root", - ); + const rootIndex = formik.values.devices.findIndex(isRootDisk); const hasRootStorage = rootIndex !== -1; const formRootDevice = formik.values.devices[ rootIndex @@ -46,7 +44,7 @@ const DiskDeviceFormRoot: FC = ({ const copy = [...formik.values.devices]; copy.push({ type: "disk", - name: "root", + name: inheritValue?.name ? inheritValue.name : "root", path: "/", pool: inheritValue ? inheritValue.pool : (pools[0]?.name ?? undefined), }); diff --git a/src/util/configInheritance.tsx b/src/util/configInheritance.tsx index 257e092adc..e410606e0d 100644 --- a/src/util/configInheritance.tsx +++ b/src/util/configInheritance.tsx @@ -258,7 +258,10 @@ export const getInheritedRootStorage = ( .find((item) => (item.device as LxdDiskDevice).path === "/"); if (rootDisk) { - return [rootDisk.device as LxdDiskDevice, rootDisk.source]; + return [ + { ...rootDisk.device, name: rootDisk.key } as LxdDiskDevice, + rootDisk.source, + ]; } return [null, "LXD"]; diff --git a/src/util/instanceValidation.tsx b/src/util/instanceValidation.tsx index 48351803d7..5e8864a185 100644 --- a/src/util/instanceValidation.tsx +++ b/src/util/instanceValidation.tsx @@ -18,8 +18,12 @@ export const hasNoRootDisk = ( return missingRoot(values.devices) && !inheritsRoot(values, profiles); }; +export const isRootDisk = (device: FormDevice): device is FormDiskDevice => { + return device.type === "disk" && device.path === "/" && !device.source; +}; + const missingRoot = (devices: FormDevice[]): boolean => { - return !devices.some((item) => item.type === "disk" && item.name === "root"); + return !devices.some(isRootDisk); }; const inheritsRoot = (