From 7a0ce77a4a2d68a61a82596948be4c7a38d98769 Mon Sep 17 00:00:00 2001 From: David Lehman Date: Mon, 14 Jan 2013 12:36:22 -0600 Subject: Start laying groundwork for splitting storage out of pyanaconda. Remove platform's use of bootloader in preparation for moving platform into storage, since that's the only code that uses it. Move some logging initialization code in network.py into a function so it does not run automatically on import. Add some code to storage to control whether or not it is being used by anaconda versus as a normal python module/library. --- anaconda | 6 +++++ pyanaconda/__init__.py | 10 +++++--- pyanaconda/anaconda_log.py | 5 ++-- pyanaconda/bootloader.py | 22 +++++++++++++++- pyanaconda/iutil.py | 3 ++- pyanaconda/network.py | 29 +++++++++++---------- pyanaconda/platform.py | 12 --------- pyanaconda/storage/__init__.py | 52 ++++++++++++++++++++++++++++++-------- pyanaconda/storage/dasd.py | 2 +- pyanaconda/storage/deviceaction.py | 14 +++++++--- pyanaconda/storage/fcoe.py | 10 ++++---- pyanaconda/storage/iscsi.py | 2 +- pyanaconda/storage/zfcp.py | 2 +- 13 files changed, 113 insertions(+), 56 deletions(-) diff --git a/anaconda b/anaconda index ca4961db7..2bfd7ab90 100755 --- a/anaconda +++ b/anaconda @@ -658,6 +658,9 @@ if __name__ == "__main__": anaconda_log.init() anaconda_log.logger.setupVirtio() + from pyanaconda import network + network.setup_ifcfg_log() + log = logging.getLogger("anaconda") stdoutLog = logging.getLogger("anaconda.stdout") @@ -927,6 +930,9 @@ if __name__ == "__main__": from pyanaconda.threads import initThreading, threadMgr, AnacondaThread initThreading() + from pyanaconda import storage + storage.enable_installer_mode() + # now start the interface setupDisplay(anaconda, opts, addon_paths) diff --git a/pyanaconda/__init__.py b/pyanaconda/__init__.py index b21754793..0b8119b87 100644 --- a/pyanaconda/__init__.py +++ b/pyanaconda/__init__.py @@ -30,11 +30,11 @@ import os, time, string import sys -from pyanaconda.storage import arch -import isys from constants import ROOT_PATH from tempfile import mkstemp +from pyanaconda.bootloader import get_bootloader + import logging log = logging.getLogger("anaconda") stdoutLog = logging.getLogger("anaconda.stdout") @@ -71,7 +71,9 @@ class Anaconda(object): self.rescue = False self.rescue_mount = True self.rootParts = None - self.simpleFilter = not arch.isS390() + + # use os.uname because it's too early to be importing storage + self.simpleFilter = not os.uname()[4].startswith('s390') self.stage2 = None self._storage = None self.updateSrc = None @@ -85,7 +87,7 @@ class Anaconda(object): @property def bootloader(self): if not self._bootloader: - self._bootloader = self.platform.bootloaderClass(self.platform) + self._bootloader = get_bootloader(self.platform) return self._bootloader diff --git a/pyanaconda/anaconda_log.py b/pyanaconda/anaconda_log.py index 439192711..36c79f03a 100644 --- a/pyanaconda/anaconda_log.py +++ b/pyanaconda/anaconda_log.py @@ -30,7 +30,6 @@ import sys import types import warnings -from pyanaconda.storage import arch from flags import flags DEFAULT_TTY_LEVEL = logging.INFO @@ -105,7 +104,9 @@ class AnacondaLog: logger.setLevel(logging.DEBUG) self.forwardToSyslog(logger) # Logging of basic stuff and storage to tty3. - if not arch.isS390() and os.access(MAIN_LOG_TTY, os.W_OK): + # XXX Use os.uname here since it's too early to be importing the + # storage module. + if not os.uname()[4].startswith('s390') and os.access(MAIN_LOG_TTY, os.W_OK): self.addFileHandler(MAIN_LOG_TTY, logger, fmtStr=TTY_FORMAT, autoLevel=True) diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py index 6ea74776f..b3a60ff69 100644 --- a/pyanaconda/bootloader.py +++ b/pyanaconda/bootloader.py @@ -36,6 +36,7 @@ from pyanaconda.constants import * from pyanaconda.storage.errors import StorageError from pyanaconda.storage.fcoe import fcoe import pyanaconda.network +from pyanaconda import platform as _platform import gettext _ = lambda x: gettext.ldgettext("anaconda", x) @@ -44,7 +45,6 @@ N_ = lambda x: x import logging log = logging.getLogger("storage") - def get_boot_block(device, seek_blocks=0): status = device.status if not status: @@ -2191,6 +2191,26 @@ class UBOOT(BootLoader): if rc: raise BootLoaderError("bootloader install failed") + +# every platform that wants a bootloader needs to be in this dict +bootloader_by_platform = {_platform.X86: GRUB2, + _platform.EFI: EFIGRUB, + _platform.MacEFI: MacEFIGRUB, + _platform.PPC: GRUB2, + _platform.IPSeriesPPC: IPSeriesGRUB2, + _platform.NewWorldPPC: MacYaboot, + _platform.S390: ZIPL, + _platform.Sparc: SILO, + _platform.ARM: UBOOT, + _platform.omapARM: UBOOT} + +def get_bootloader(platform): + platform_name = platform.__class__.__name__ + cls = bootloader_by_platform.get(platform.__class__, BootLoader) + log.info("bootloader %s on %s platform" % (cls.__name__, platform_name)) + return cls(platform) + + # anaconda-specific functions def writeSysconfigKernel(storage, version): diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py index 66024c5a3..dbc7c3ba6 100644 --- a/pyanaconda/iutil.py +++ b/pyanaconda/iutil.py @@ -183,7 +183,8 @@ def mkdirChain(dir): def isConsoleOnVirtualTerminal(): # XXX PJFIX is there some way to ask the kernel this instead? - if isS390(): + # XXX we don't want to have to import storage from here + if os.uname()[4].startswith("s390"): return False return not flags.serial diff --git a/pyanaconda/network.py b/pyanaconda/network.py index f968fba49..1f2bf1961 100644 --- a/pyanaconda/network.py +++ b/pyanaconda/network.py @@ -61,19 +61,22 @@ DEFAULT_HOSTNAME = "localhost.localdomain" # for more info about '(?!-)' and '(? # +## +## Default stub values for installer-specific stuff that gets set up in +## enable_installer_mode. +## +isys = None +ROOT_PATH = '/' +shortProductName = '' +bootLoaderError = Exception + import os import time import stat @@ -31,11 +40,8 @@ import copy import nss.nss import parted -from pyanaconda.constants import * from pykickstart.constants import * from pyanaconda import tsort -from pyanaconda.errors import * -from pyanaconda.bootloader import BootLoaderError from storage_log import log_method_call from errors import * @@ -62,12 +68,7 @@ import zfcp import dasd import util import arch -import flags - -if flags.installer_mode: - from pyanaconda import isys -else: - isys = None +from flags import flags import shelve import contextlib @@ -78,6 +79,21 @@ _ = lambda x: gettext.ldgettext("anaconda", x) import logging log = logging.getLogger("storage") +def enable_installer_mode(): + global isys + global ROOT_PATH + global shortProductName + global get_bootloader + global BootLoaderError + + from pyanaconda import isys + from pyanaconda.constants import ROOT_PATH + from pyanaconda.constants import shortProductName + from pyanaconda.bootloader import get_bootloader + from pyanaconda.bootloader import BootLoaderError + + flags.installer_mode = True + DEVICE_TYPE_LVM = 0 DEVICE_TYPE_MD = 1 DEVICE_TYPE_PARTITION = 2 @@ -120,6 +136,9 @@ def getRAIDLevel(device): return raid_level def storageInitialize(storage, ksdata, protected): + from pyanaconda.flags import flags as anaconda_flags + flags.update_from_anaconda_flags(anaconda_flags) + storage.shutdown() # touch /dev/.in_sysinit so that /lib/udev/rules.d/65-md-incremental.rules @@ -155,6 +174,9 @@ def storageInitialize(storage, ksdata, protected): log.debug("onlyuse is now: %s" % (",".join(ksdata.ignoredisk.onlyuse))) def turnOnFilesystems(storage): + if not flags.installer_mode: + return + if (flags.live_install and not flags.image_install and not storage.fsset.active): # turn off any swaps that we didn't turn on # needed for live installs @@ -1669,8 +1691,10 @@ class Storage(object): @property def bootloader(self): - if self._bootloader is None and self.platform is not None: - self._bootloader = self.platform.bootloaderClass(self.platform) + if self._bootloader is None and self.platform is not None and \ + flags.installer_mode: + self._bootloader = get_bootloader(self.platform) + return self._bootloader def updateBootLoaderDiskList(self): @@ -2801,6 +2825,9 @@ class FSSet(object): def turnOnSwap(self, rootPath="", upgrading=None): """ Activate the system's swap space. """ + if not flags.installer_mode: + return + for device in self.swapDevices: if isinstance(device, FileDevice): # set up FileDevices' parents now that they are accessible @@ -2828,6 +2855,9 @@ class FSSet(object): def mountFilesystems(self, rootPath="", readOnly=None, skipRoot=False, raiseErrors=None): """ Mount the system's filesystems. """ + if not flags.installer_mode: + return + devices = self.mountpoints.values() + self.swapDevices devices.extend([self.dev, self.devshm, self.devpts, self.sysfs, self.proc, self.selinux, self.usb]) diff --git a/pyanaconda/storage/dasd.py b/pyanaconda/storage/dasd.py index 752ca057f..abf97b90f 100644 --- a/pyanaconda/storage/dasd.py +++ b/pyanaconda/storage/dasd.py @@ -25,7 +25,7 @@ from pyanaconda.storage.errors import DasdFormatError from pyanaconda.storage.devices import deviceNameToDiskByPath from pyanaconda.storage import util from pyanaconda.storage import arch -from pyanaconda.constants import * +from . import ROOT_PATH from pyanaconda.baseudev import udev_trigger import logging diff --git a/pyanaconda/storage/deviceaction.py b/pyanaconda/storage/deviceaction.py index 7cb17c4ac..c8f96f204 100644 --- a/pyanaconda/storage/deviceaction.py +++ b/pyanaconda/storage/deviceaction.py @@ -37,6 +37,16 @@ _ = lambda x: gettext.ldgettext("anaconda", x) import logging log = logging.getLogger("storage") +from contextlib import contextmanager + +@contextmanager +def progress_report_stub(message): + yield + +try: + from pyanaconda.progress import progress_report +except ImportError: + progress_report = progress_report_stub # The values are just hints as to the ordering. # Eg: fsmod and devmod ordering depends on the mod (shrink -v- grow) @@ -405,8 +415,6 @@ class ActionCreateFormat(DeviceAction): self.origFormat = getFormat(None) def execute(self): - from pyanaconda.progress import progress_report - msg = _("Creating %(type)s on %(device)s") % {"type": self.device.format.type, "device": self.device.path} with progress_report(msg): self.device.setup() @@ -545,8 +553,6 @@ class ActionResizeFormat(DeviceAction): self.device.format.targetSize = newsize def execute(self): - from pyanaconda.progress import progress_report - msg = _("Resizing filesystem on %(device)s") % {"device": self.device.path} with progress_report(msg): self.device.setup(orig=True) diff --git a/pyanaconda/storage/fcoe.py b/pyanaconda/storage/fcoe.py index 3a4d1471a..22c6258b2 100644 --- a/pyanaconda/storage/fcoe.py +++ b/pyanaconda/storage/fcoe.py @@ -20,8 +20,8 @@ import os from . import util from pyanaconda.baseudev import udev_settle -from pyanaconda import isys -from pyanaconda.constants import ROOT_PATH +#from pyanaconda import isys +from . import ROOT_PATH import logging import time log = logging.getLogger("storage") @@ -76,9 +76,9 @@ class fcoe(object): return (key, val) = rc.strip().split("=", 1) - if val not in isys.getDeviceProperties(): - log.error("Unknown FCoE NIC found in EDD: %s, ignoring" % val) - return + #if val not in isys.getDeviceProperties(): + # log.error("Unknown FCoE NIC found in EDD: %s, ignoring" % val) + # return log.info("FCoE NIC found in EDD: %s" % val) self.addSan(val, dcb=True, auto_vlan=True) diff --git a/pyanaconda/storage/iscsi.py b/pyanaconda/storage/iscsi.py index 4e64335e3..8b7cbf80d 100644 --- a/pyanaconda/storage/iscsi.py +++ b/pyanaconda/storage/iscsi.py @@ -18,7 +18,7 @@ # along with this program. If not, see . # -from pyanaconda.constants import * +from . import ROOT_PATH from udev import udev_settle from . import util from .flags import flags diff --git a/pyanaconda/storage/zfcp.py b/pyanaconda/storage/zfcp.py index 27dd1070c..23be6cd9d 100644 --- a/pyanaconda/storage/zfcp.py +++ b/pyanaconda/storage/zfcp.py @@ -21,7 +21,7 @@ import string import os -from pyanaconda.constants import * +from . import ROOT_PATH from udev import udev_settle from . import util -- cgit