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:
parent
20bb798a5f
commit
4dd12e2e56
|
@ -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'" %
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
##########################
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue