168 lines
5.8 KiB
Python
168 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]
|