mirror: call relevant version of apt_config

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
This commit is contained in:
Olivier Gayot 2023-01-26 16:00:05 +01:00
parent 5bfd6fda03
commit 099db0bfdd
5 changed files with 41 additions and 16 deletions

View File

@ -15,7 +15,7 @@
import copy import copy
import logging import logging
from typing import Any, List, Set from typing import Any, Dict, Iterator, List, Set
from urllib import parse from urllib import parse
from curtin.commands.apt_config import ( from curtin.commands.apt_config import (
@ -65,6 +65,11 @@ class MirrorModel(object):
self.primary_elected, self.primary_elected,
] ]
self.iter_primary_candidate: Iterator[PrimarySectionConfig] = \
iter(self.primary_candidates)
self.primary_staged: PrimarySectionConfig = \
next(self.iter_primary_candidate)
self.architecture = get_architecture() self.architecture = get_architecture()
self.default_mirror = self.get_mirror() self.default_mirror = self.get_mirror()
@ -77,12 +82,24 @@ class MirrorModel(object):
self.primary_elected = self.primary_candidates[0] self.primary_elected = self.primary_candidates[0]
merge_config(self.config, data) merge_config(self.config, data)
def get_apt_config(self): def _get_apt_config_common(self) -> Dict[str, Any]:
assert "disable_components" not in self.config
assert "primary" not in self.config
config = copy.deepcopy(self.config) config = copy.deepcopy(self.config)
config["primary"] = copy.deepcopy(self.primary_elected)
config["disable_components"] = sorted(self.disabled_components) config["disable_components"] = sorted(self.disabled_components)
return config return config
def get_apt_config_staged(self) -> Dict[str, Any]:
config = self._get_apt_config_common()
config["primary"] = self.primary_staged
return config
def get_apt_config_elected(self) -> Dict[str, Any]:
config = self._get_apt_config_common()
config["primary"] = self.primary_elected
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
@ -115,4 +132,6 @@ class MirrorModel(object):
return {} return {}
def make_autoinstall(self): def make_autoinstall(self):
return self.get_apt_config() config = self._get_apt_config_common()
config["primary"] = self.primary_elected
return config

View File

@ -72,20 +72,20 @@ class TestMirrorModel(unittest.TestCase):
self.assertEqual(self.model.get_mirror(), "http://mymirror.invalid/") self.assertEqual(self.model.get_mirror(), "http://mymirror.invalid/")
def test_default_disable_components(self): def test_default_disable_components(self):
config = self.model.get_apt_config() config = self.model.get_apt_config_staged()
self.assertEqual([], config['disable_components']) self.assertEqual([], config['disable_components'])
def test_from_autoinstall(self): def test_from_autoinstall(self):
# autoinstall loads to the config directly # autoinstall loads to the config directly
data = {'disable_components': ['non-free']} data = {'disable_components': ['non-free']}
self.model.load_autoinstall_data(data) self.model.load_autoinstall_data(data)
config = self.model.get_apt_config() config = self.model.get_apt_config_staged()
self.assertEqual(['non-free'], config['disable_components']) self.assertEqual(['non-free'], config['disable_components'])
def test_disable_add(self): def test_disable_add(self):
expected = ['things', 'stuff'] expected = ['things', 'stuff']
self.model.disable_components(expected.copy(), add=True) self.model.disable_components(expected.copy(), add=True)
actual = self.model.get_apt_config()['disable_components'] actual = self.model.get_apt_config_staged()['disable_components']
actual.sort() actual.sort()
expected.sort() expected.sort()
self.assertEqual(expected, actual) self.assertEqual(expected, actual)
@ -95,7 +95,7 @@ class TestMirrorModel(unittest.TestCase):
to_remove = ['things', 'stuff'] to_remove = ['things', 'stuff']
expected = ['a', 'b'] expected = ['a', 'b']
self.model.disable_components(to_remove, add=False) self.model.disable_components(to_remove, add=False)
actual = self.model.get_apt_config()['disable_components'] actual = self.model.get_apt_config_staged()['disable_components']
actual.sort() actual.sort()
expected.sort() expected.sort()
self.assertEqual(expected, actual) self.assertEqual(expected, actual)
@ -103,6 +103,7 @@ class TestMirrorModel(unittest.TestCase):
def test_make_autoinstall(self): def test_make_autoinstall(self):
primary = [{"arches": "amd64", "uri": "http://mirror"}] primary = [{"arches": "amd64", "uri": "http://mirror"}]
self.model.disabled_components = set(["non-free"]) self.model.disabled_components = set(["non-free"])
self.model.primary_candidates = [primary]
self.model.primary_elected = primary self.model.primary_elected = primary
cfg = self.model.make_autoinstall() cfg = self.model.make_autoinstall()
self.assertEqual(cfg["disable_components"], ["non-free"]) self.assertEqual(cfg["disable_components"], ["non-free"])

View File

@ -112,18 +112,23 @@ class AptConfigurer:
self.install_tree: Optional[OverlayMountpoint] = None self.install_tree: Optional[OverlayMountpoint] = None
self.install_mount = None self.install_mount = None
def apt_config(self): def apt_config(self, elected: bool):
cfg = {} cfg = {}
merge_config(cfg, self.app.base_model.mirror.get_apt_config()) if elected:
merge_config(cfg,
self.app.base_model.mirror.get_apt_config_elected())
else:
merge_config(cfg,
self.app.base_model.mirror.get_apt_config_staged())
merge_config(cfg, self.app.base_model.proxy.get_apt_config()) merge_config(cfg, self.app.base_model.proxy.get_apt_config())
return {'apt': cfg} return {'apt': cfg}
async def apply_apt_config(self, context): async def apply_apt_config(self, context, elected: bool):
self.configured_tree = await self.mounter.setup_overlay([self.source]) self.configured_tree = await self.mounter.setup_overlay([self.source])
config_location = os.path.join( config_location = os.path.join(
self.app.root, 'var/log/installer/subiquity-curtin-apt.conf') self.app.root, 'var/log/installer/subiquity-curtin-apt.conf')
generate_config_yaml(config_location, self.apt_config()) generate_config_yaml(config_location, self.apt_config(elected))
self.app.note_data_for_apport("CurtinAptConfig", config_location) self.app.note_data_for_apport("CurtinAptConfig", config_location)
await run_curtin_command( await run_curtin_command(

View File

@ -184,11 +184,11 @@ class MirrorController(SubiquityController):
async def _promote_mirror(self): async def _promote_mirror(self):
await asyncio.gather(self.source_configured_event.wait(), await asyncio.gather(self.source_configured_event.wait(),
self.configured_event.wait()) self.configured_event.wait())
await self.apt_configurer.apply_apt_config(self.context) await self.apt_configurer.apply_apt_config(self.context, elected=True)
async def run_mirror_testing(self, output: io.StringIO) -> None: async def run_mirror_testing(self, output: io.StringIO) -> None:
await self.source_configured_event.wait() await self.source_configured_event.wait()
await self.apt_configurer.apply_apt_config(self.context) await self.apt_configurer.apply_apt_config(self.context, elected=False)
await self.apt_configurer.run_apt_config_check(output) await self.apt_configurer.run_apt_config_check(output)
async def wait_config(self): async def wait_config(self):

View File

@ -67,7 +67,7 @@ class TestAptConfigurer(SubiTestCase):
self.astart_sym = "subiquity.server.apt.astart_command" self.astart_sym = "subiquity.server.apt.astart_command"
def test_apt_config_noproxy(self): def test_apt_config_noproxy(self):
config = self.configurer.apt_config() config = self.configurer.apt_config(elected=False)
self.assertNotIn("http_proxy", config["apt"]) self.assertNotIn("http_proxy", config["apt"])
self.assertNotIn("https_proxy", config["apt"]) self.assertNotIn("https_proxy", config["apt"])
@ -75,7 +75,7 @@ class TestAptConfigurer(SubiTestCase):
proxy = 'http://apt-cacher-ng:3142' proxy = 'http://apt-cacher-ng:3142'
self.model.proxy.proxy = proxy self.model.proxy.proxy = proxy
config = self.configurer.apt_config() config = self.configurer.apt_config(elected=False)
self.assertEqual(proxy, config["apt"]["http_proxy"]) self.assertEqual(proxy, config["apt"]["http_proxy"])
self.assertEqual(proxy, config["apt"]["https_proxy"]) self.assertEqual(proxy, config["apt"]["https_proxy"])