Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Boot not required #5371

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions pyanaconda/modules/common/structures/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -455,16 +455,16 @@ def get_root_device(self):
return self.mount_points.get("/")


class RequiredMountPointData(DBusData):
"""Constrains (filesystem and device types allowed) for mount points required
for the installed system
"""
class MountPointConstraintsData(DBusData):
"""Constrains (filesystem and device types allowed) for mount points"""

def __init__(self):
self._mount_point = ""
self._required_filesystem_type = ""
self._encryption_allowed = False
self._logical_volume_allowed = False
self._required = False
self._recommended = False

@property
def mount_point(self) -> Str:
Expand Down Expand Up @@ -513,3 +513,27 @@ def logical_volume_allowed(self) -> Bool:
@logical_volume_allowed.setter
def logical_volume_allowed(self, logical_volume_allowed: Bool):
self._logical_volume_allowed = logical_volume_allowed

@property
def required(self) -> Bool:
"""Whether this mount point is required

:return: bool
"""
return self._required

@required.setter
def required(self, required: Bool):
self._required = required

@property
def recommended(self) -> Bool:
"""Whether this mount point is recommended

:return: bool
"""
return self._recommended

@recommended.setter
def recommended(self, recommended: Bool):
self._recommended = recommended
81 changes: 75 additions & 6 deletions pyanaconda/modules/storage/devicetree/viewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from pyanaconda.core.i18n import _
from pyanaconda.modules.common.errors.storage import UnknownDeviceError
from pyanaconda.modules.common.structures.storage import DeviceData, DeviceActionData, \
DeviceFormatData, OSData, RequiredMountPointData
DeviceFormatData, OSData, MountPointConstraintsData
from pyanaconda.modules.storage.devicetree.utils import get_required_device_size, \
get_supported_filesystems
from pyanaconda.modules.storage.platform import platform
Expand Down Expand Up @@ -470,13 +470,61 @@ def _get_os_data(self, root):
}
return data

def _get_mount_point_constraints_data(self, spec):
"""Get the mount point data.

:param spec: an instance of PartSpec
:return: an instance of MountPointConstraintsData
"""
data = MountPointConstraintsData()
data.mount_point = spec.mountpoint or ""
data.required_filesystem_type = spec.fstype or ""
data.encryption_allowed = spec.encrypted
data.logical_volume_allowed = spec.lv

return data

def get_mount_point_constraints(self):
"""Get list of constraints on mountpoints for the current platform

Also provides hints if the partition is required or recommended.

This includes mount points required to boot (e.g. /boot/efi, /boot)
and the / partition which is always considered to be required.

FIXME /boot can be required in some cases, depending on the filesystem
on the root partition (ie crypted root).

:return: a list of mount points with its constraints
"""

constraints = []

# Root partition is required
root_partition = PartSpec(mountpoint="/", lv=True, thin=True, encrypted=True)
root_constraint = self._get_mount_point_constraints_data(root_partition)
root_constraint.required = True
constraints.append(root_constraint)

# Platform partitions are required except for /boot partiotion which is recommended
for p in platform.partitions:
if p.mountpoint:
constraint = self._get_mount_point_constraints_data(p)
if p.mountpoint == "/boot":
constraint.recommended = True
else:
constraint.required = True
constraints.append(constraint)

return constraints

def _get_platform_mount_point_data(self, spec):
"""Get the mount point data.

:param spec: an instance of PartSpec
:return: an instance of RequiredMountPointData
:return: an instance of MountPointConstraintsData
"""
data = RequiredMountPointData()
data = MountPointConstraintsData()
data.mount_point = spec.mountpoint or ""
data.required_filesystem_type = spec.fstype or ""
data.encryption_allowed = spec.encrypted
Expand All @@ -487,12 +535,33 @@ def _get_platform_mount_point_data(self, spec):
def get_required_mount_points(self):
"""Get list of required mount points for the current platform

This includes mount points required to boot (e.g. /boot and /boot/efi)
This includes mount points required to boot (e.g. /boot/efi)
and the / partition which is always considered to be required.

:return: a list of mount points
FIXME in general /boot is not required, just recommended. Depending on
the filesystem on the root partition it may be required (ie crypted
root).

:return: a list of mount points with its constraints
"""
root_partition = PartSpec(mountpoint="/", lv=True, thin=True, encrypted=True)
ret = list(map(self._get_platform_mount_point_data,
[p for p in platform.partitions if p.mountpoint] + [root_partition]))
[p for p in platform.partitions if p.mountpoint and p.mountpoint != "/boot"]
+ [root_partition]))
return ret

def get_recommended_mount_points(self):
"""Get list of recommended mount points for the current platform

Currently it contains only /boot partition if it is default the for
platform.

:return: a list of mount points with its constraints
"""
# FIXME in general /boot is not required, just recommended. Depending
# on the filesystem on the root partition it may be required (ie
# crypted root).
recommended = ["/boot"]
ret = list(map(self._get_platform_mount_point_data,
[p for p in platform.partitions if p.mountpoint in recommended]))
return ret
37 changes: 33 additions & 4 deletions pyanaconda/modules/storage/devicetree/viewer_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from dasbus.typing import * # pylint: disable=wildcard-import
from pyanaconda.modules.common.constants.interfaces import DEVICE_TREE_VIEWER
from pyanaconda.modules.common.structures.storage import DeviceData, DeviceActionData, \
DeviceFormatData, OSData, RequiredMountPointData
DeviceFormatData, OSData, MountPointConstraintsData

__all__ = ["DeviceTreeViewerInterface"]

Expand Down Expand Up @@ -193,13 +193,42 @@ def GetExistingSystems(self) -> List[Structure]:
"""
return OSData.to_structure_list(self.implementation.get_existing_systems())

# FIXME: remove the replaced API
def GetMountPointConstraints(self) -> List[Structure]:
"""Get list of constraints on mountpoints for the current platform

Also provides hints if the partition is required or recommended.

This includes mount points required to boot (e.g. /boot/efi, /boot)
and the / partition which is always considered to be required.

:return: a list of mount points with its constraints
"""
return MountPointConstraintsData.to_structure_list(
self.implementation.get_mount_point_constraints())

def GetRequiredMountPoints(self) -> List[Structure]:
"""Get list of required mount points for the current platform

This includes mount points required to boot (e.g. /boot and /boot/efi)
This includes mount points required to boot (e.g. /boot/efi)
and the / partition which is always considered to be required.

:return: a list of mount points
FIXME in general /boot is not required, just recommended. Depending on
the filesystem on the root partition it may be required (ie crypted
root).

:return: a list of mount points with its constraints
"""
return RequiredMountPointData.to_structure_list(
return MountPointConstraintsData.to_structure_list(
self.implementation.get_required_mount_points())

def GetRecommendedMountPoints(self) -> List[Structure]:
"""Get list of recommended mount points for the current platform

Currently it contains only /boot partition if it is default the for
platform.

:return: a list of mount points with its constraints
"""
return MountPointConstraintsData.to_structure_list(
self.implementation.get_recommended_mount_points())
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from dasbus.typing import * # pylint: disable=wildcard-import
from pyanaconda.core.kernel import KernelArguments
from pyanaconda.modules.common.errors.storage import UnknownDeviceError, MountFilesystemError
from pyanaconda.modules.common.structures.storage import DeviceFormatData, RequiredMountPointData
from pyanaconda.modules.common.structures.storage import DeviceFormatData, MountPointConstraintsData
from pyanaconda.modules.storage.devicetree import DeviceTreeModule, create_storage, utils
from pyanaconda.modules.storage.devicetree.devicetree_interface import DeviceTreeInterface
from pyanaconda.modules.storage.devicetree.populate import FindDevicesTask
Expand Down Expand Up @@ -855,7 +855,7 @@ def test_get_required_mount_points(self):
assert isinstance(result, list)
assert len(result) != 0

result = RequiredMountPointData.from_structure_list(self.interface.GetRequiredMountPoints())
result = MountPointConstraintsData.from_structure_list(self.interface.GetRequiredMountPoints())
for mp in result:
assert mp.mount_point is not None
assert mp.required_filesystem_type is not None
Expand All @@ -868,6 +868,19 @@ def test_get_required_mount_points(self):
assert root.mount_point == "/"
assert root.required_filesystem_type == ""

def test_get_recommended_mount_points(self):
"""Test GetRecommendedMountPoints."""
result = self.interface.GetRecommendedMountPoints()
assert isinstance(result, list)
assert len(result) == 1

result = MountPointConstraintsData.from_structure_list(self.interface.GetRecommendedMountPoints())
boot = result[0]
assert boot is not None
assert boot.encryption_allowed is False
assert boot.logical_volume_allowed is False
assert boot.mount_point == "/boot"
assert boot.required_filesystem_type == ""

class DeviceTreeTasksTestCase(unittest.TestCase):
"""Test the storage tasks."""
Expand Down