Merge pull request #1154 from dbungert/autoinstall-disable-components

apt: fix disable_components w/ autoinstall
This commit is contained in:
Dan Bungert 2022-01-10 09:45:49 -07:00 committed by GitHub
commit 96a53eff14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 56 additions and 27 deletions

View File

@ -19,6 +19,9 @@ apt:
primary: primary:
- arches: [default] - arches: [default]
uri: "http://mymirror.local/repository/Apt/ubuntu/" uri: "http://mymirror.local/repository/Apt/ubuntu/"
disable_components:
- non-free
- restricted
packages: packages:
- package1 - package1
- package2 - package2

View File

@ -167,6 +167,8 @@ timeout --foreground 60 sh -c "LANG=C.UTF-8 python3 -m subiquity.cmd.tui --autoi
--kernel-cmdline 'autoinstall' \ --kernel-cmdline 'autoinstall' \
--source-catalog=examples/install-sources.yaml" --source-catalog=examples/install-sources.yaml"
validate validate
python3 scripts/check-yaml-fields.py .subiquity/var/log/installer/subiquity-curtin-apt.conf \
apt.disable_components='[non-free, restricted]'
python3 scripts/check-yaml-fields.py .subiquity/var/log/installer/subiquity-curtin-install.conf \ python3 scripts/check-yaml-fields.py .subiquity/var/log/installer/subiquity-curtin-install.conf \
debconf_selections.subiquity='"eek"' \ debconf_selections.subiquity='"eek"' \
storage.config[-1].options='"errors=remount-ro"' storage.config[-1].options='"errors=remount-ro"'

View File

@ -31,6 +31,7 @@ log = logging.getLogger('subiquitycore.models.mirror')
DEFAULT = { DEFAULT = {
"disable_components": [],
"preserve_sources_list": False, "preserve_sources_list": False,
"primary": [ "primary": [
{ {
@ -51,12 +52,9 @@ class MirrorModel(object):
self.config = copy.deepcopy(DEFAULT) self.config = copy.deepcopy(DEFAULT)
self.architecture = get_architecture() self.architecture = get_architecture()
self.default_mirror = self.get_mirror() self.default_mirror = self.get_mirror()
self.disable_components = set()
def get_apt_config(self): def get_apt_config(self):
config = copy.deepcopy(self.config) return copy.deepcopy(self.config)
config['disable_components'] = list(self.disable_components)
return config
def mirror_is_default(self): def mirror_is_default(self):
return self.get_mirror() == self.default_mirror return self.get_mirror() == self.default_mirror
@ -77,5 +75,14 @@ class MirrorModel(object):
self.config, "primary", self.architecture) self.config, "primary", self.architecture)
config["uri"] = mirror config["uri"] = mirror
def disable_components(self, comps, add):
dc = set(self.config.get('disable_components', []))
comps = set(comps)
if add:
dc |= comps
else:
dc -= comps
self.config['disable_components'] = list(dc)
def render(self): def render(self):
return {} return {}

View File

@ -15,40 +15,60 @@
import unittest import unittest
from curtin.config import merge_config
from subiquity.models.mirror import ( from subiquity.models.mirror import (
MirrorModel, MirrorModel,
) )
class TestMirrorModel(unittest.TestCase): class TestMirrorModel(unittest.TestCase):
def setUp(self):
self.model = MirrorModel()
def test_set_country(self): def test_set_country(self):
model = MirrorModel() self.model.set_country("CC")
model.set_country("CC")
self.assertIn( self.assertIn(
model.get_mirror(), self.model.get_mirror(),
[ [
"http://CC.archive.ubuntu.com/ubuntu", "http://CC.archive.ubuntu.com/ubuntu",
"http://CC.ports.ubuntu.com/ubuntu-ports", "http://CC.ports.ubuntu.com/ubuntu-ports",
]) ])
def test_set_mirror(self): def test_set_mirror(self):
model = MirrorModel() self.model.set_mirror("http://mymirror.invalid/")
model.set_mirror("http://mymirror.invalid/") self.assertEqual(self.model.get_mirror(), "http://mymirror.invalid/")
self.assertEqual(model.get_mirror(), "http://mymirror.invalid/")
def test_set_country_after_set_mirror(self): def test_set_country_after_set_mirror(self):
model = MirrorModel() self.model.set_mirror("http://mymirror.invalid/")
model.set_mirror("http://mymirror.invalid/") self.model.set_country("CC")
model.set_country("CC") self.assertEqual(self.model.get_mirror(), "http://mymirror.invalid/")
self.assertEqual(model.get_mirror(), "http://mymirror.invalid/")
def test_default_disable_components(self): def test_default_disable_components(self):
config = MirrorModel().get_apt_config() config = self.model.get_apt_config()
self.assertEqual([], config['disable_components']) self.assertEqual([], config['disable_components'])
def test_set_disable_components(self): def test_from_autoinstall(self):
model = MirrorModel() # autoinstall loads to the config directly
model.disable_components = set(['universe']) data = {'disable_components': ['non-free']}
config = model.get_apt_config() merge_config(self.model.config, data)
self.assertEqual(['universe'], config['disable_components']) config = self.model.get_apt_config()
self.assertEqual(['non-free'], config['disable_components'])
def test_disable_add(self):
expected = ['things', 'stuff']
self.model.disable_components(expected.copy(), add=True)
actual = self.model.get_apt_config()['disable_components']
actual.sort()
expected.sort()
self.assertEqual(expected, actual)
def test_disable_remove(self):
self.model.config['disable_components'] = ['a', 'b', 'things']
to_remove = ['things', 'stuff']
expected = ['a', 'b']
self.model.disable_components(to_remove, add=False)
actual = self.model.get_apt_config()['disable_components']
actual.sort()
expected.sort()
self.assertEqual(expected, actual)

View File

@ -129,7 +129,7 @@ class MirrorController(SubiquityController):
await self.configured() await self.configured()
async def disable_components_GET(self) -> List[str]: async def disable_components_GET(self) -> List[str]:
return list(self.model.disable_components) return self.model.config.get('disable_components', [])
async def disable_components_POST(self, data: List[str]): async def disable_components_POST(self, data: List[str]):
self.model.disable_components = set(data) self.model.config['disable_components'] = data

View File

@ -165,11 +165,8 @@ class MetaController:
async def free_only_POST(self, enable: bool) -> None: async def free_only_POST(self, enable: bool) -> None:
self.free_only = enable self.free_only = enable
to_disable = {'restricted', 'multiverse'} to_disable = {'restricted', 'multiverse'}
if enable: # enabling free only mode means disabling components
# enabling free only mode means disabling components self.app.base_model.mirror.disable_components(to_disable, enable)
self.app.base_model.mirror.disable_components |= to_disable
else:
self.app.base_model.mirror.disable_components -= to_disable
def get_installer_password_from_cloudinit_log(): def get_installer_password_from_cloudinit_log():