From debe428fd2e7896c81a364dbb570bc405957b52c Mon Sep 17 00:00:00 2001 From: Vojtech Trefny Date: Mon, 4 Sep 2023 14:51:56 +0200 Subject: [PATCH] webui: Get the required mountpoints from the backend We now have a backend function to get list of mount points required for mount point assignment. --- ui/webui/src/apis/storage.js | 12 ++++++++++ ui/webui/src/components/AnacondaWizard.jsx | 13 ++++++++++- .../components/storage/MountPointMapping.jsx | 23 +++++-------------- ui/webui/test/check-storage | 22 +++++++++--------- 4 files changed, 41 insertions(+), 29 deletions(-) diff --git a/ui/webui/src/apis/storage.js b/ui/webui/src/apis/storage.js index 3394d4aca976..69a1de022868 100644 --- a/ui/webui/src/apis/storage.js +++ b/ui/webui/src/apis/storage.js @@ -153,6 +153,18 @@ export const getRequiredDeviceSize = ({ requiredSpace }) => { .then(res => res[0]); }; +/** + * @returns {Promise} List of all mount points required on the platform + */ +export const getRequiredMountPoints = () => { + return new StorageClient().client.call( + "/org/fedoraproject/Anaconda/Modules/Storage/DeviceTree", + "org.fedoraproject.Anaconda.Modules.Storage.DeviceTree.Viewer", + "GetRequiredMountPoints", [] + ) + .then(res => res[0]); +}; + /** * @param {Array[string]} diskNames A list of disk names * diff --git a/ui/webui/src/components/AnacondaWizard.jsx b/ui/webui/src/components/AnacondaWizard.jsx index 70c5e21bbd4c..a8b101c3898d 100644 --- a/ui/webui/src/components/AnacondaWizard.jsx +++ b/ui/webui/src/components/AnacondaWizard.jsx @@ -48,6 +48,7 @@ import { usePageLocation } from "hooks"; import { applyStorage, resetPartitioning, + getRequiredMountPoints, } from "../apis/storage.js"; const _ = cockpit.gettext; @@ -60,11 +61,21 @@ export const AnacondaWizard = ({ dispatch, isBootIso, osRelease, storageData, lo const [storageEncryption, setStorageEncryption] = useState(getStorageEncryptionState()); const [storageScenarioId, setStorageScenarioId] = useState(window.sessionStorage.getItem("storage-scenario-id") || getDefaultScenario().id); const [reusePartitioning, setReusePartitioning] = useState(false); + const [requiredMountPoints, setRequiredMountPoints] = useState(); const availableDevices = useMemo(() => { return Object.keys(storageData.devices); }, [storageData.devices]); + useEffect(() => { + const updateRequiredMountPoints = async () => { + const requiredMountPoints = await getRequiredMountPoints().catch(console.error); + + setRequiredMountPoints(requiredMountPoints); + }; + updateRequiredMountPoints(); + }, []); + useEffect(() => { /* * When disk selection changes or the user re-scans the devices we need to re-create the partitioning. @@ -103,7 +114,7 @@ export const AnacondaWizard = ({ dispatch, isBootIso, osRelease, storageData, lo label: _("Disk configuration"), steps: [{ component: MountPointMapping, - data: { deviceData: storageData.devices, diskSelection: storageData.diskSelection, partitioningData: storageData.partitioning, dispatch, reusePartitioning, setReusePartitioning }, + data: { deviceData: storageData.devices, diskSelection: storageData.diskSelection, partitioningData: storageData.partitioning, requiredMountPoints, dispatch, reusePartitioning, setReusePartitioning }, id: "mount-point-mapping", label: _("Manual disk configuration"), isHidden: storageScenarioId !== "mount-point-mapping" diff --git a/ui/webui/src/components/storage/MountPointMapping.jsx b/ui/webui/src/components/storage/MountPointMapping.jsx index cf7e90f9f750..149ad21610a0 100644 --- a/ui/webui/src/components/storage/MountPointMapping.jsx +++ b/ui/webui/src/components/storage/MountPointMapping.jsx @@ -74,17 +74,17 @@ const getInitialRequests = (usablePartitioningRequests, requiredMountPoints) => const bootEfiOriginalRequest = usablePartitioningRequests.find(r => r["mount-point"] === "/boot/efi"); const requests = requiredMountPoints.map((mountPoint, idx) => { - const request = ({ "mount-point": mountPoint.value, reformat: mountPoint.name === "root" }); + const request = ({ "mount-point": mountPoint.value.v, reformat: mountPoint.value.v === "/" }); - if (mountPoint.name === "boot" && bootOriginalRequest) { + if (mountPoint.value.v === "/boot" && bootOriginalRequest) { return { ...bootOriginalRequest, ...request }; } - if (mountPoint.name === "root" && rootOriginalRequest) { + if (mountPoint.value.v === "/" && rootOriginalRequest) { return { ...rootOriginalRequest, ...request }; } - if (mountPoint.name === "boot-efi" && bootEfiOriginalRequest) { + if (mountPoint.value.v === "/boot/efi" && bootEfiOriginalRequest) { return { ...bootEfiOriginalRequest, ...request }; } @@ -358,7 +358,7 @@ const RequestsTable = ({ }) => { const columnClassName = idPrefix + "__column"; const getRequestRow = (request) => { - const isRequiredMountPoint = !!requiredMountPoints.find(val => val.value === request["mount-point"]); + const isRequiredMountPoint = !!requiredMountPoints.find(val => val.value.v === request["mount-point"]); const duplicatedMountPoint = isDuplicateRequestField(requests, "mount-point", request["mount-point"]); const rowId = idPrefix + "-row-" + request["request-id"]; @@ -570,19 +570,8 @@ const MountPointMappingContent = ({ deviceData, partitioningData, usablePartitio } }; -export const MountPointMapping = ({ deviceData, diskSelection, partitioningData, dispatch, idPrefix, setIsFormValid, onAddErrorNotification, reusePartitioning, setReusePartitioning, stepNotification }) => { +export const MountPointMapping = ({ deviceData, diskSelection, partitioningData, requiredMountPoints, dispatch, idPrefix, setIsFormValid, onAddErrorNotification, reusePartitioning, setReusePartitioning, stepNotification }) => { const [usedPartitioning, setUsedPartitioning] = useState(partitioningData?.path); - const requiredMountPoints = useMemo(() => { - const mounts = [ - { value: "/boot", name: "boot" }, - { value: "/", name: "root" }, - ]; - - cockpit.spawn(["ls", "/sys/firmware/efi"], { err: "ignore" }) - .then(() => { mounts.push({ value: "/boot/efi", name: "boot-efi" }) }); - - return mounts; - }, []); const isUsableDevice = (devSpec, deviceData) => { const device = deviceData[devSpec]; diff --git a/ui/webui/test/check-storage b/ui/webui/test/check-storage index 7bdafa905381..5010ef8dd40e 100755 --- a/ui/webui/test/check-storage +++ b/ui/webui/test/check-storage @@ -955,23 +955,23 @@ class TestStorageMountPointsEFI(anacondalib.VirtInstallMachineCase, TestUtils): # verify gathered requests # root partition is not auto-mapped - self.check_row_mountpoint(b, 1, "/boot") + self.check_row_mountpoint(b, 1, "/boot/efi") self.check_row_device(b, 1, "Select a device") self.check_reformat(b, 1, False) - self.select_row_device(b, 1, f"{dev}2") - self.check_format_type(b, 1, "ext4") + self.select_row_device(b, 1, f"{dev}1") + self.check_format_type(b, 1, "EFI System Partition") - self.check_row_mountpoint(b, 2, "/") + self.check_row_mountpoint(b, 2, "/boot") self.check_row_device(b, 2, "Select a device") - self.check_reformat(b, 2, True) - self.select_row_device(b, 2, f"{dev}3") - self.check_format_type(b, 2, "xfs") + self.check_reformat(b, 2, False) + self.select_row_device(b, 2, f"{dev}2") + self.check_format_type(b, 2, "ext4") - self.check_row_mountpoint(b, 3, "/boot/efi") + self.check_row_mountpoint(b, 3, "/") self.check_row_device(b, 3, "Select a device") - self.check_reformat(b, 3, False) - self.select_row_device(b, 3, f"{dev}1") - self.check_format_type(b, 3, "EFI System Partition") + self.check_reformat(b, 3, True) + self.select_row_device(b, 3, f"{dev}3") + self.check_format_type(b, 3, "xfs") i.next()