anaconda/anaconda-40.22.3.13/pyanaconda/modules/storage/partitioning/interactive/scheduler_interface.py
2024-11-14 21:39:56 -08:00

337 lines
12 KiB
Python

#
# DBus interface for the device tree scheduler
#
# Copyright (C) 2019 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
from dasbus.server.interface import dbus_interface
from dasbus.typing import * # pylint: disable=wildcard-import
from pyanaconda.modules.common.constants.interfaces import DEVICE_TREE_SCHEDULER
from pyanaconda.modules.common.containers import TaskContainer
from pyanaconda.modules.common.structures.device_factory import DeviceFactoryRequest, \
DeviceFactoryPermissions
from pyanaconda.modules.common.structures.partitioning import PartitioningRequest
from pyanaconda.modules.common.structures.storage import OSData
from pyanaconda.modules.common.structures.validation import ValidationReport
from pyanaconda.modules.storage.devicetree.devicetree_interface import DeviceTreeInterface
__all__ = ["DeviceTreeSchedulerInterface"]
@dbus_interface(DEVICE_TREE_SCHEDULER.interface_name)
class DeviceTreeSchedulerInterface(DeviceTreeInterface):
"""DBus interface for the device tree scheduler."""
def IsDevice(self, device_name: Str) -> Bool:
"""Is the specified device in the device tree?
It can recognize also hidden and incomplete devices.
:param device_name: a name of the device
:return: True or False
"""
return self.implementation.is_device(device_name)
def IsDeviceLocked(self, device_name: Str) -> Bool:
"""Is the specified device locked?
:param device_name: a name of the device
:return: True or False
"""
return self.implementation.is_device_locked(device_name)
def IsDeviceEditable(self, device_name: Str) -> Bool:
"""Is the specified device editable?
:param device_name: a name of the device
:return: True or False
"""
return self.implementation.is_device_editable(device_name)
def CheckCompleteness(self, device_name: Str) -> Structure:
"""Check that the specified device is complete.
:param device_name: a name of the device
:return: a validation report
"""
return ValidationReport.to_structure(
self.implementation.check_completeness(device_name)
)
def GetDefaultFileSystem(self) -> Str:
"""Get the default type of a filesystem.
:return: a filesystem name
"""
return self.implementation.get_default_file_system()
def GetDefaultLUKSVersion(self) -> Str:
"""Get the default version of LUKS.
:return: a version of LUKS
"""
return self.implementation.get_default_luks_version()
def GetContainerFreeSpace(self, container_name: Str) -> UInt64:
"""Get total free space in the specified container.
:param container_name: a name of the container
:return: a size in bytes
"""
return self.implementation.get_container_free_space(container_name)
def GenerateSystemName(self) -> Str:
"""Generate a name of the new installation.
:return: a translated string
"""
return self.implementation.generate_system_name()
def GenerateSystemData(self, boot_drive: Str) -> Structure:
"""Generate the new installation data.
:param boot_drive: a name of the boot drive
:return: a structure with data about the new installation
"""
return OSData.to_structure(
self.implementation.generate_system_data(boot_drive)
)
def GenerateDeviceName(self, mount_point: Str, format_type: Str) -> Str:
"""Get a suggestion for a device name.
:param mount_point: a mount point
:param format_type: a format type
:return: a generated device name
"""
return self.implementation.generate_device_name(mount_point, format_type)
def GenerateContainerName(self) -> Str:
"""Get a suggestion for a container name.
:return: a generated container name
"""
return self.implementation.generate_container_name()
def GenerateDeviceFactoryRequest(self, device_name: Str) -> Structure:
"""Generate a device factory request for the given device.
The request will reflect the current state of the device.
It can be modified and used to change the device.
:param device_name: a device name
:return: a device factory request
"""
return DeviceFactoryRequest.to_structure(
self.implementation.generate_device_factory_request(device_name)
)
def GenerateDeviceFactoryPermissions(self, request: Structure) -> Structure:
"""Generate device factory permissions for the given request.
The permissions will reflect which device attributes we are allowed
to change in the requested device.
:param request: a device factory request
:return: device factory permissions
"""
request = DeviceFactoryRequest.from_structure(request)
permissions = self.implementation.generate_device_factory_permissions(request)
return DeviceFactoryPermissions.to_structure(permissions)
def GenerateContainerData(self, request: Structure) -> Structure:
"""Generate the container data for the device factory request.
:param request: a device factory request
:return: a device factory request
"""
request = DeviceFactoryRequest.from_structure(request)
self.implementation.generate_container_data(request)
return DeviceFactoryRequest.to_structure(request)
def UpdateContainerData(self, request: Structure, container_name: Str) -> Structure:
"""Update the container data in the device factory request.
:param request: a device factory request
:param container_name: a container name
:return: a device factory request
"""
request = DeviceFactoryRequest.from_structure(request)
self.implementation.update_container_data(request, container_name)
return DeviceFactoryRequest.to_structure(request)
def CollectNewDevices(self, boot_drive: Str) -> List[Str]:
"""Get all new devices in the device tree.
FIXME: Remove the boot drive option.
:param boot_drive: a name of the boot drive
:return: a list of device names
"""
return self.implementation.collect_new_devices(boot_drive)
def CollectUnusedDevices(self) -> List[Str]:
"""Collect all devices that are not used in existing or new installations.
:return: a list of device names
"""
return self.implementation.collect_unused_devices()
def CollectUnusedMountPoints(self) -> List[Str]:
"""Collect mount points that can be assigned to a device.
:return: a list of mount points
"""
return self.implementation.collect_unused_mount_points()
def CollectContainers(self, device_type: Int) -> List[Str]:
"""Collect containers of the given type.
:param device_type: a device type
:return: a list of container names
"""
return self.implementation.collect_containers(device_type)
def CollectSupportedSystems(self) -> List[Structure]:
"""Collect supported existing or new installations.
:return: a list of data about found installations
"""
return OSData.to_structure_list(
self.implementation.collect_supported_systems()
)
def GetDeviceTypesForDevice(self, device_name: Str) -> List[Int]:
"""Collect supported device types for the given device.
:param device_name: a device name
:return: a list of device types
"""
return self.implementation.get_device_types_for_device(device_name)
def GetFileSystemsForDevice(self, device_name: Str) -> List[Str]:
"""Get supported file system types for the given device.
:param device_name: a device name
:return: a list of file system names
"""
return self.implementation.get_file_systems_for_device(device_name)
def GetSupportedRaidLevels(self, device_type: Int) -> List[Str]:
"""Get RAID levels for the specified device type.
:param device_type: a type of the device
:return: a list of RAID level names
"""
return self.implementation.get_supported_raid_levels(device_type)
def ValidateMountPoint(self, mount_point: Str) -> Structure:
"""Validate the given mount point.
:param mount_point: a path to a mount point
:return: a validation report
"""
return ValidationReport.to_structure(
self.implementation.validate_mount_point(mount_point)
)
def ValidateRaidLevel(self, raid_level: Str, num_members: Int) -> Structure:
"""Validate the given RAID level.
:param raid_level: a RAID level name
:param num_members: a number of members
:return: a validation report
"""
return ValidationReport.to_structure(
self.implementation.validate_raid_level(raid_level, num_members)
)
def ValidateContainerName(self, name: Str) -> Structure:
"""Validate the given container name.
:param name: a container name
:return: a validation report
"""
return ValidationReport.to_structure(
self.implementation.validate_container_name(name)
)
def ValidateDeviceFactoryRequest(self, request: Structure) -> Structure:
"""Validate the given device factory request.
:param request: a device factory request
:return: a validation report
"""
request = DeviceFactoryRequest.from_structure(request)
report = self.implementation.validate_device_factory_request(request)
return ValidationReport.to_structure(report)
def AddDevice(self, request: Structure):
"""Add a new device to the storage model.
:param request: a device factory request
:raise: StorageConfigurationError if the device cannot be created
"""
self.implementation.add_device(
DeviceFactoryRequest.from_structure(request)
)
def ChangeDevice(self, request: Structure, original_request: Structure):
"""Change a device in the storage model.
FIXME: Remove the original request from the arguments.
:param request: a device factory request
:param original_request: an original device factory request
:raise: StorageConfigurationError if the device cannot be changed
"""
self.implementation.change_device(
DeviceFactoryRequest.from_structure(request),
DeviceFactoryRequest.from_structure(original_request)
)
def ResetDevice(self, device_name: Str):
"""Reset the specified device in the storage model.
FIXME: Merge with DestroyDevice.
:param device_name: a name of the device
:raise: StorageConfigurationError in case of failure
"""
self.implementation.reset_device(device_name)
def DestroyDevice(self, device_name: Str):
"""Destroy the specified device in the storage model.
:param device_name: a name of the device
:raise: StorageConfigurationError in case of failure
"""
self.implementation.destroy_device(device_name)
def SchedulePartitionsWithTask(self, request: Structure) -> ObjPath:
"""Schedule the partitioning actions.
Generate the automatic partitioning configuration
using the given request.
:param: a partitioning request
:return: a DBus path to a task
"""
return TaskContainer.to_object_path(
self.implementation.schedule_partitions_with_task(
PartitioningRequest.from_structure(request)
)
)