Skip to content

Commit

Permalink
Merge pull request #5082 from vojtechtrefny/master_filter-devices-fil…
Browse files Browse the repository at this point in the history
…esystem

Do not show unusable devices in mount point assignment
  • Loading branch information
vojtechtrefny authored Aug 30, 2023
2 parents 0bb1bfd + a37490d commit 1ba8c40
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 25 deletions.
18 changes: 9 additions & 9 deletions ui/webui/src/components/storage/InstallationScenario.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ const checkUseFreeSpace = ({ diskFreeSpace, diskTotalSpace, requiredSize }) => {
return availability;
};

const checkMountPointMapping = ({ hasPartitions }) => {
const checkMountPointMapping = ({ hasFilesystems }) => {
const availability = new AvailabilityState();

if (!hasPartitions) {
if (!hasFilesystems) {
availability.available = false;
availability.reason = _("No existing partitions on the selected disks.");
availability.reason = _("No usable devices on the selected disks.");
} else {
availability.available = true;
}
Expand Down Expand Up @@ -163,7 +163,7 @@ const InstallationScenarioSelector = ({ deviceData, selectedDisks, idPrefix, sto
const [requiredSize, setRequiredSize] = useState();
const [diskTotalSpace, setDiskTotalSpace] = useState();
const [diskFreeSpace, setDiskFreeSpace] = useState();
const [hasPartitions, setHasPartitions] = useState();
const [hasFilesystems, setHasFilesystems] = useState();

useEffect(() => {
const updateSizes = async () => {
Expand All @@ -187,22 +187,22 @@ const InstallationScenarioSelector = ({ deviceData, selectedDisks, idPrefix, sto
}, []);

useEffect(() => {
const hasPartitions = selectedDisks.some(device => deviceData[device]?.children.v.some(child => deviceData[child]?.type.v === "partition"));
const hasFilesystems = selectedDisks.some(device => deviceData[device]?.children.v.some(child => deviceData[child]?.formatData.mountable.v || deviceData[child]?.formatData.type.v === "luks"));

setHasPartitions(hasPartitions);
setHasFilesystems(hasFilesystems);
}, [selectedDisks, deviceData]);

useEffect(() => {
let selectedScenarioId = "";
let availableScenarioExists = false;

if ([diskTotalSpace, diskFreeSpace, hasPartitions, requiredSize].some(itm => itm === undefined)) {
if ([diskTotalSpace, diskFreeSpace, hasFilesystems, requiredSize].some(itm => itm === undefined)) {
return;
}

const newAvailability = {};
for (const scenario of scenarios) {
const availability = scenario.check({ diskTotalSpace, diskFreeSpace, hasPartitions, requiredSize });
const availability = scenario.check({ diskTotalSpace, diskFreeSpace, hasFilesystems, requiredSize });
newAvailability[scenario.id] = availability;
if (availability.available) {
availableScenarioExists = true;
Expand All @@ -219,7 +219,7 @@ const InstallationScenarioSelector = ({ deviceData, selectedDisks, idPrefix, sto
setSelectedScenario(selectedScenarioId);
setScenarioAvailability(newAvailability);
setIsFormValid(availableScenarioExists);
}, [deviceData, hasPartitions, requiredSize, diskFreeSpace, diskTotalSpace, setIsFormValid, storageScenarioId]);
}, [deviceData, hasFilesystems, requiredSize, diskFreeSpace, diskTotalSpace, setIsFormValid, storageScenarioId]);

useEffect(() => {
const applyScenario = async (scenarioId) => {
Expand Down
48 changes: 36 additions & 12 deletions ui/webui/src/components/storage/MountPointMapping.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ const getDeviceChildren = ({ deviceData, device }) => {
return children;
};

const getInitialRequests = (partitioningData) => {
const bootOriginalRequest = partitioningData.requests.find(r => r["mount-point"] === "/boot");
const rootOriginalRequest = partitioningData.requests.find(r => r["mount-point"] === "/");
const getInitialRequests = (usablePartitioningRequests) => {
const bootOriginalRequest = usablePartitioningRequests.find(r => r["mount-point"] === "/boot");
const rootOriginalRequest = usablePartitioningRequests.find(r => r["mount-point"] === "/");

const requests = requiredMountPointOptions.map((mountPoint, idx) => {
const request = ({ "mount-point": mountPoint.value, reformat: mountPoint.name === "root" });
Expand All @@ -91,7 +91,7 @@ const getInitialRequests = (partitioningData) => {
return request;
});

const extraRequests = partitioningData.requests.filter(r => r["mount-point"] && r["mount-point"] !== "/" && r["mount-point"] !== "/boot" && r["format-type"] !== "biosboot") || [];
const extraRequests = usablePartitioningRequests.filter(r => r["mount-point"] && r["mount-point"] !== "/" && r["mount-point"] !== "/boot" && r["format-type"] !== "biosboot") || [];
return [...requests, ...extraRequests].map((request, idx) => ({ ...request, "request-id": idx + 1 }));
};

Expand Down Expand Up @@ -403,19 +403,19 @@ const RequestsTable = ({
);
};

const MountPointMappingContent = ({ deviceData, partitioningData, dispatch, idPrefix, setIsFormValid, onAddErrorNotification }) => {
const MountPointMappingContent = ({ deviceData, partitioningData, usablePartitioningRequests, dispatch, idPrefix, setIsFormValid, onAddErrorNotification }) => {
const [skipUnlock, setSkipUnlock] = useState(false);
const [requests, setRequests] = useState(getInitialRequests(partitioningData));
const [requests, setRequests] = useState(getInitialRequests(usablePartitioningRequests));
const [updateRequestCnt, setUpdateRequestCnt] = useState(0);
const currentUpdateRequestCnt = useRef(0);

const allDevices = useMemo(() => {
return partitioningData.requests?.map(r => r["device-spec"]) || [];
}, [partitioningData.requests]);
return usablePartitioningRequests?.map(r => r["device-spec"]) || [];
}, [usablePartitioningRequests]);

const lockedLUKSDevices = useMemo(
() => getLockedLUKSDevices(partitioningData.requests, deviceData),
[deviceData, partitioningData.requests]
() => getLockedLUKSDevices(usablePartitioningRequests, deviceData),
[deviceData, usablePartitioningRequests]
);

const handlePartitioningRequestsChange = useCallback(_requests => {
Expand All @@ -437,12 +437,12 @@ const MountPointMappingContent = ({ deviceData, partitioningData, dispatch, idPr

setManualPartitioningRequests({
partitioning: partitioningData.path,
requests: requestsToDbus(partitioningData.requests)
requests: requestsToDbus(usablePartitioningRequests)
}).catch(ex => {
onAddErrorNotification(ex);
setIsFormValid(false);
});
}, [partitioningData.path, onAddErrorNotification, partitioningData.requests, setIsFormValid]);
}, [partitioningData.path, onAddErrorNotification, usablePartitioningRequests, setIsFormValid]);

/* When requests change apply directly to the backend */
useEffect(() => {
Expand Down Expand Up @@ -547,6 +547,29 @@ const MountPointMappingContent = ({ deviceData, partitioningData, dispatch, idPr
export const MountPointMapping = ({ deviceData, diskSelection, partitioningData, dispatch, idPrefix, setIsFormValid, onAddErrorNotification, reusePartitioning, setReusePartitioning, stepNotification }) => {
const [usedPartitioning, setUsedPartitioning] = useState(partitioningData?.path);

const isUsableDevice = (devSpec, deviceData) => {
const device = deviceData[devSpec];
if (device === undefined || device.formatData === undefined) {
return false;
}

// luks is allowed -- we need to be able to unlock it
if (device.formatData.type.v === "luks") {
return true;
}

// only swap and mountable filesystems should be shown in the mount point assignment
if (device.formatData.type.v === "swap" || device.formatData.mountable.v === true) {
return true;
}

return false;
};

const usablePartitioningRequests = useMemo(() => {
return partitioningData.requests?.filter(r => isUsableDevice(r["device-spec"], deviceData)) || [];
}, [partitioningData.requests, deviceData]);

useEffect(() => {
if (!reusePartitioning || partitioningData?.method !== "MANUAL") {
/* Reset the bootloader drive before we schedule partitions
Expand Down Expand Up @@ -582,6 +605,7 @@ export const MountPointMapping = ({ deviceData, diskSelection, partitioningData,
idPrefix={idPrefix}
onAddErrorNotification={onAddErrorNotification}
partitioningData={partitioningData}
usablePartitioningRequests={usablePartitioningRequests}
setIsFormValid={setIsFormValid}
/>
</AnacondaPage>
Expand Down
6 changes: 5 additions & 1 deletion ui/webui/test/check-storage
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,7 @@ class TestStorageMountPoints(anacondalib.VirtInstallMachineCase):

disk = "/dev/vda"
dev = "vda"
s.partition_disk(disk, [("1GB", "udf")])
s.partition_disk(disk, [("1GB", "udf"), ("1GB", None), ("1GB", "lvmpv")])
s.udevadm_settle()

i.open()
Expand All @@ -912,5 +912,9 @@ class TestStorageMountPoints(anacondalib.VirtInstallMachineCase):
self.select_reformat(3)
self.wait_mount_point_table_column_helper(3, "format", text="Selected")

# unformatted and unmountable devices should not be available
self.check_device_available(1, f"{dev}2", False)
self.check_device_available(1, f"{dev}3", False)

if __name__ == '__main__':
test_main()
7 changes: 5 additions & 2 deletions ui/webui/test/helpers/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,13 @@ def partition_disk(self, disk, partitions_params):
command += f"\n{' '.join(sgdisk)}"

if params[1] not in ("biosboot", None):
mkfs = [f"mkfs.{params[1]}"]
if params[1] == "lvmpv":
mkfs = ["pvcreate"]
else:
mkfs = [f"mkfs.{params[1]}"]

# force flag
if params[1] in ["xfs", "btrfs"]:
if params[1] in ["xfs", "btrfs", "lvmpv"]:
mkfs.append("-f")
elif params[1] in ["ext4", "etx3", "ext2", "ntfs"]:
mkfs.append("-F")
Expand Down
2 changes: 1 addition & 1 deletion ui/webui/test/reference

0 comments on commit 1ba8c40

Please sign in to comment.