anaconda/anaconda-40.22.3.13/pyanaconda/modules/storage/disk_selection/selection.py
2024-11-14 21:39:56 -08:00

167 lines
5.8 KiB
Python

#
# Disk selection module.
#
# Copyright (C) 2018 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 pyanaconda.anaconda_loggers import get_module_logger
from pyanaconda.core.signal import Signal
from pyanaconda.core.dbus import DBus
from pyanaconda.modules.common.constants.objects import DISK_SELECTION
from pyanaconda.modules.common.structures.validation import ValidationReport
from pyanaconda.modules.storage.disk_selection.selection_interface import DiskSelectionInterface
from pyanaconda.modules.storage.disk_selection.utils import check_disk_selection
from pyanaconda.modules.storage.storage_subscriber import StorageSubscriberModule
log = get_module_logger(__name__)
class DiskSelectionModule(StorageSubscriberModule):
"""The disk selection module."""
def __init__(self):
super().__init__()
self.selected_disks_changed = Signal()
self._selected_disks = []
self.exclusive_disks_changed = Signal()
self._exclusive_disks = []
self.ignored_disks_changed = Signal()
self._ignored_disks = []
self.protected_devices_changed = Signal()
self._protected_devices = []
self.disk_images_changed = Signal()
self._disk_images = {}
def publish(self):
"""Publish the module."""
DBus.publish_object(DISK_SELECTION.object_path, DiskSelectionInterface(self))
def process_kickstart(self, data):
"""Process the kickstart data."""
self.set_selected_disks(data.ignoredisk.onlyuse)
self.set_exclusive_disks(data.ignoredisk.onlyuse)
self.set_ignored_disks(data.ignoredisk.ignoredisk)
def setup_kickstart(self, data):
"""Setup the kickstart data."""
data.ignoredisk.onlyuse = self.selected_disks
data.ignoredisk.ignoredisk = self.ignored_disks
@property
def selected_disks(self):
"""The list of drives to use."""
return self._selected_disks
def set_selected_disks(self, drives):
"""Set the list of selected disks
Specifies those disks that anaconda can use for
partitioning, formatting, and clearing.
:param drives: a list of drives names
"""
self._selected_disks = drives
self.selected_disks_changed.emit(list(drives))
log.debug("Selected disks are set to '%s'.", drives)
def validate_selected_disks(self, drives):
"""Validate the list of selected disks.
:param drives: a list of drives names
:return: a validation report
"""
report = ValidationReport()
report.error_messages = check_disk_selection(self.storage, drives)
return report
@property
def exclusive_disks(self):
"""The list of drives to scan."""
return self._exclusive_disks
def set_exclusive_disks(self, drives):
"""Set the list of drives to scan.
Specifies those disks that anaconda will scan during
the storage reset. If the list is empty, anaconda will
scan all drives.
It can be set from the kickstart with 'ignoredisk --onlyuse'.
:param drives: a list of drives names
"""
self._exclusive_disks = drives
self.exclusive_disks_changed.emit()
log.debug("Exclusive disks are set to '%s'.", drives)
@property
def ignored_disks(self):
"""The list of drives to ignore."""
return self._ignored_disks
def set_ignored_disks(self, drives):
"""Set the list of ignored disks.
Specifies those disks that anaconda should not touch
when it does partitioning, formatting, and clearing.
:param drives: a list of drive names
"""
self._ignored_disks = drives
self.ignored_disks_changed.emit()
log.debug("Ignored disks are set to '%s'.", drives)
@property
def protected_devices(self):
"""The list of devices to protect."""
return self._protected_devices
def set_protected_devices(self, devices):
"""Set the list of protected devices.
Specifies those disks that anaconda should protect.
:param devices: a list of device names
"""
self._protected_devices = devices
self.protected_devices_changed.emit(list(devices))
log.debug("Protected devices are set to '%s'.", devices)
@property
def disk_images(self):
"""The dictionary of disk images."""
return self._disk_images
def set_disk_images(self, disk_images):
"""Set the dictionary of disk images.
:param disk_images: a dictionary of image names and file names
"""
self._disk_images = disk_images
self.disk_images_changed.emit()
log.debug("Disk images are set to '%s'.", disk_images)
def get_usable_disks(self):
"""Get a list of disks that can be used for the installation.
:return: a list of disk names
"""
return [disk.name for disk in self.storage.usable_disks]