installer: Generate the unattended script only in installer

And pass it down to treemedia, which acts on our script wrapper
object. This is conceptually a bit simpler because we can see in
one place what data feeds the script build process, depending on
installer props
This commit is contained in:
Cole Robinson 2019-06-09 19:10:19 -04:00
parent 20bb798a5f
commit 4dd12e2e56
4 changed files with 63 additions and 50 deletions

View File

@ -158,7 +158,7 @@ def _testGuest(testdata, guest):
fetcher.acquireFile = fakeAcquireFile
# Fetch regular kernel
kernel, initrd, kernelargs = treemedia.prepare(guest, meter)
kernel, initrd, kernelargs = treemedia.prepare(guest, meter, None)
dummy = initrd
if testdata.kernelregex and not re.match(testdata.kernelregex, kernel):
raise AssertionError("kernel=%s but testdata.kernelregex='%s'" %

View File

@ -210,28 +210,46 @@ class Installer(object):
# Internal API overrides #
##########################
def _prepare_unattended_data(self, guest):
osmedia = OSDB.guess_os_by_iso(self.cdrom)[1]
script = unattended.prepare_install_script(
guest, self._unattended_data, self.cdrom, osmedia)
def _prepare_unattended_data(self, guest, script):
expected_filename = script.get_expected_filename()
scriptpath = unattended.generate_install_script(guest, script)
unattended_cmdline = script.generate_cmdline()
logging.debug("Generated unattended cmdline: %s", unattended_cmdline)
scriptpath = script.write(guest)
self._tmpfiles.append(scriptpath)
iso = perform_cdrom_injections([(scriptpath, expected_filename)],
guest.conn.get_app_cache_dir())
self._tmpfiles.append(iso)
self._add_unattended_install_cdrom_device(guest, iso)
self._tmpfiles.extend([scriptpath, iso])
def _prepare_unattended_script(self, guest, meter):
if self._treemedia:
url = self._treemedia.url()
os_media = self._treemedia.get_os_media(guest, meter)
else:
url = None
osguess = OSDB.guess_os_by_iso(self.cdrom)
os_media = osguess[1] if osguess else None
return unattended.prepare_install_script(
guest, self._unattended_data, url, os_media)
def _prepare(self, guest, meter):
unattended_script = None
if self._unattended_data:
unattended_script = self._prepare_unattended_script(guest, meter)
if self._treemedia:
k, i, a = self._treemedia.prepare(guest, meter)
k, i, a = self._treemedia.prepare(guest, meter,
unattended_script)
self._install_kernel = k
self._install_initrd = i
if a and "VIRTINST_INITRD_TEST" not in os.environ:
self.extra_args.append(a)
elif self._unattended_data:
self._prepare_unattended_data(guest)
elif unattended_script:
self._prepare_unattended_data(guest, unattended_script)
def _cleanup(self, guest):
if self._treemedia:
@ -349,10 +367,7 @@ class Installer(object):
return ret
def set_unattended_data(self, unattended_data):
if self._treemedia:
self._treemedia.set_unattended_data(unattended_data)
else:
self._unattended_data = unattended_data
self._unattended_data = unattended_data
##########################

View File

@ -8,7 +8,6 @@ import logging
import os
from . import progress
from . import unattended
from . import urldetect
from . import urlfetcher
from .devices import DeviceDisk
@ -112,8 +111,6 @@ class InstallerTreeMedia(object):
self._tmpfiles = []
self._tmpvols = []
self._unattended_data = None
self._media_type = MEDIA_ISO
if (not self.conn.is_remote() and
os.path.exists(self.location) and
@ -205,29 +202,23 @@ class InstallerTreeMedia(object):
# Public API #
##############
def set_unattended_data(self, unattended_data):
self._unattended_data = unattended_data
def _prepare_unattended_data(self, guest, cache):
location = self.location if self._media_type == MEDIA_URL else None
script = unattended.prepare_install_script(
guest, self._unattended_data, location, cache.os_media)
expected_filename = script.get_expected_filename()
scriptpath = unattended.generate_install_script(guest, script)
def _prepare_unattended_data(self, guest, script):
unattended_cmdline = script.generate_cmdline()
logging.debug("Generated unattended cmdline: %s", unattended_cmdline)
self.initrd_injections.append((scriptpath, expected_filename))
expected_filename = script.get_expected_filename()
scriptpath = script.write(guest)
self._tmpfiles.append(scriptpath)
self.initrd_injections.append((scriptpath, expected_filename))
return unattended_cmdline
def prepare(self, guest, meter):
def prepare(self, guest, meter, unattended_script):
fetcher = self._get_fetcher(guest, meter)
cache = self._get_cached_data(guest, fetcher)
unattended_cmdline = None
if self._unattended_data:
unattended_cmdline = self._prepare_unattended_data(guest, cache)
if unattended_script:
unattended_cmdline = self._prepare_unattended_data(
guest, unattended_script)
k, i, a = self._prepare_kernel_url(guest, fetcher)
@ -261,17 +252,25 @@ class InstallerTreeMedia(object):
if self._media_type in [MEDIA_ISO]:
return self.location
def url(self):
if self._media_type in [MEDIA_URL]:
return self.location
def detect_distro(self, guest):
fetcher = self._get_fetcher(guest, None)
cache = self._get_cached_data(guest, fetcher)
return cache.os_variant
def get_os_media(self, guest, meter):
fetcher = self._get_fetcher(guest, meter)
cache = self._get_cached_data(guest, fetcher)
return cache.os_media
def requires_internet(self, guest, meter):
if self._media_type in [MEDIA_URL, MEDIA_DIR]:
return True
fetcher = self._get_fetcher(guest, meter)
cache = self._get_cached_data(guest, fetcher)
if cache.os_media:
return cache.os_media.is_netinst()
os_media = self.get_os_media(guest, meter)
if os_media:
return os_media.is_netinst()
return False

View File

@ -212,6 +212,20 @@ class OSInstallScript:
return self._script.generate_command_line(
self._osobj.get_handle(), self._config)
def write(self, guest):
scratch = guest.conn.get_app_cache_dir()
fileobj = tempfile.NamedTemporaryFile(
dir=scratch, prefix="virtinst-unattended-script", delete=False)
scriptpath = fileobj.name
content = self.generate()
open(scriptpath, "w").write(content)
logging.debug("Generated unattended script: %s", scriptpath)
logging.debug("Generated script contents:\n%s", content)
return scriptpath
class UnattendedData():
profile = None
@ -289,18 +303,3 @@ def prepare_install_script(guest, unattended_data, url, os_media):
guest.os.arch, guest.name, url)
script.set_config(config)
return script
def generate_install_script(guest, script):
scratch = guest.conn.get_app_cache_dir()
fileobj = tempfile.NamedTemporaryFile(
dir=scratch, prefix="virtinst-unattended-script", delete=False)
scriptpath = fileobj.name
content = script.generate()
open(scriptpath, "w").write(content)
logging.debug("Generated unattended script: %s", scriptpath)
logging.debug("Generated script contents:\n%s", content)
return scriptpath