pass install source as an argument to curtin install, not via config

This commit is contained in:
Michael Hudson-Doyle 2021-11-04 09:47:45 +13:00
parent 072d2b233a
commit 996a2125f2
4 changed files with 33 additions and 21 deletions

View File

@ -87,7 +87,7 @@ class SourceModel:
if self.current is None: if self.current is None:
self.current = self.sources[0] self.current = self.sources[0]
def render(self): def get_source(self):
path = os.path.join(self._dir, self.current.path) path = os.path.join(self._dir, self.current.path)
if self.current.preinstalled_langs: if self.current.preinstalled_langs:
base, ext = os.path.splitext(path) base, ext = os.path.splitext(path)
@ -97,8 +97,7 @@ class SourceModel:
suffix = 'no-languages' suffix = 'no-languages'
path = base + '.' + suffix + ext path = base + '.' + suffix + ext
scheme = self.current.type scheme = self.current.type
return { return f'{scheme}://{path}'
'sources': {
'ubuntu00': f'{scheme}://{path}' def render(self):
}, return {}
}

View File

@ -46,7 +46,7 @@ def make_entry(**fields):
return raw return raw
class TestMirrorModel(unittest.TestCase): class TestSourceModel(unittest.TestCase):
def tdir(self): def tdir(self):
tdir = tempfile.mkdtemp() tdir = tempfile.mkdtemp()
@ -88,7 +88,7 @@ class TestMirrorModel(unittest.TestCase):
self.write_and_load_entries(model, entries) self.write_and_load_entries(model, entries)
self.assertEqual(model.current.id, 'id2') self.assertEqual(model.current.id, 'id2')
def test_render_absolute(self): def test_get_source_absolute(self):
entry = make_entry( entry = make_entry(
type='scheme', type='scheme',
path='/foo/bar/baz', path='/foo/bar/baz',
@ -96,9 +96,9 @@ class TestMirrorModel(unittest.TestCase):
model = SourceModel() model = SourceModel()
self.write_and_load_entries(model, [entry]) self.write_and_load_entries(model, [entry])
self.assertEqual( self.assertEqual(
model.render(), {'sources': {'ubuntu00': 'scheme:///foo/bar/baz'}}) model.get_source(), 'scheme:///foo/bar/baz')
def test_render_relative(self): def test_get_source_relative(self):
dir = self.tdir() dir = self.tdir()
entry = make_entry( entry = make_entry(
type='scheme', type='scheme',
@ -107,11 +107,15 @@ class TestMirrorModel(unittest.TestCase):
model = SourceModel() model = SourceModel()
self.write_and_load_entries(model, [entry], dir) self.write_and_load_entries(model, [entry], dir)
self.assertEqual( self.assertEqual(
model.render(), model.get_source(),
{'sources': {'ubuntu00': f'scheme://{dir}/foo/bar/baz'}}) f'scheme://{dir}/foo/bar/baz')
def test_render_initial(self): def test_get_source_initial(self):
model = SourceModel() model = SourceModel()
self.assertEqual( self.assertEqual(
model.render(), model.get_source(),
{'sources': {'ubuntu00': 'cp:///media/filesystem'}}) 'cp:///media/filesystem')
def test_render(self):
model = SourceModel()
self.assertEqual(model.render(), {})

View File

@ -172,10 +172,10 @@ class TestSubiquityModel(unittest.TestCase):
netplan = yaml.safe_load(netplan_content) netplan = yaml.safe_load(netplan_content)
self.assertConfigHasVal(netplan, 'network.version', 2) self.assertConfigHasVal(netplan, 'network.version', 2)
def test_has_sources(self): def test_sources(self):
model = self.make_model() model = self.make_model()
config = model.render() config = model.render()
self.assertIn('sources', config) self.assertNotIn('sources', config)
def test_mirror(self): def test_mirror(self):
model = self.make_model() model = self.make_model()

View File

@ -19,11 +19,12 @@ import os
import re import re
import shutil import shutil
from curtin.commands.extract import get_handler_for_source
from curtin.commands.install import ( from curtin.commands.install import (
ERROR_TARFILE, ERROR_TARFILE,
INSTALL_LOG, INSTALL_LOG,
) )
from curtin.util import write_file from curtin.util import sanitize_source, write_file
import yaml import yaml
@ -130,9 +131,9 @@ class InstallController(SubiquityController):
@with_context( @with_context(
description="installing system", level="INFO", childlevel="DEBUG") description="installing system", level="INFO", childlevel="DEBUG")
async def curtin_install(self, *, context): async def curtin_install(self, *, context, source):
await run_curtin_command( await run_curtin_command(
self.app, context, 'install', config=self.write_config()) self.app, context, 'install', source, config=self.write_config())
@with_context() @with_context()
async def install(self, *, context): async def install(self, *, context):
@ -154,11 +155,19 @@ class InstallController(SubiquityController):
self.app.update_state(ApplicationState.RUNNING) self.app.update_state(ApplicationState.RUNNING)
handler = get_handler_for_source(
sanitize_source(self.model.source.get_source()))
if self.app.opts.dry_run:
path = '/'
else:
path = handler.setup()
if os.path.exists(self.model.target): if os.path.exists(self.model.target):
await self.unmount_target( await self.unmount_target(
context=context, target=self.model.target) context=context, target=self.model.target)
await self.curtin_install(context=context) await self.curtin_install(
context=context, source='cp://' + path)
self.app.update_state(ApplicationState.POST_WAIT) self.app.update_state(ApplicationState.POST_WAIT)