filesystem: look-ahead on reset-partition-only
The identity controller shouldn't own the logic for determining if the filesystem controller will only install the reset partition. Creates a utility function that can be called by the identity controller to determine if only installing the reset partition.
This commit is contained in:
parent
7fedee55fa
commit
3b3e3310d6
|
@ -294,6 +294,16 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
|
||||||
# log.debug("self.ai_data = %s", data)
|
# log.debug("self.ai_data = %s", data)
|
||||||
self.ai_data = data
|
self.ai_data = data
|
||||||
|
|
||||||
|
# The identity and user-data section are optional if we are only installing
|
||||||
|
# the reset partition, however the identity controller needs to know this
|
||||||
|
# before the filesystem controller naturally sets this. So this is a
|
||||||
|
# function to inspect the outcome early.
|
||||||
|
# See: https://github.com/canonical/subiquity/pull/1965
|
||||||
|
def is_reset_partition_only(self):
|
||||||
|
storage_config = self.app.autoinstall_config.get(self.autoinstall_key, {})
|
||||||
|
layout = storage_config.get("layout", {})
|
||||||
|
return layout.get("reset-partition-only", False)
|
||||||
|
|
||||||
async def configured(self):
|
async def configured(self):
|
||||||
self._configured = True
|
self._configured = True
|
||||||
if self._info is None:
|
if self._info is None:
|
||||||
|
|
|
@ -89,14 +89,7 @@ class IdentityController(SubiquityController):
|
||||||
if self.app.base_model.source.current.variant != "server":
|
if self.app.base_model.source.current.variant != "server":
|
||||||
return
|
return
|
||||||
# 3. we are only refreshing the reset partition
|
# 3. we are only refreshing the reset partition
|
||||||
# (The identity controller doesn't figure this out until the apply
|
if self.app.controllers.Filesystem.is_reset_partition_only():
|
||||||
# step, so we are going to cheat and inspect the situation here)
|
|
||||||
storage_config = self.app.autoinstall_config.get("storage")
|
|
||||||
if (
|
|
||||||
storage_config is not None
|
|
||||||
and storage_config.get("layout") is not None
|
|
||||||
and storage_config["layout"].get("reset-partition-only")
|
|
||||||
):
|
|
||||||
return
|
return
|
||||||
# 4. identity section is interactive
|
# 4. identity section is interactive
|
||||||
if self.interactive():
|
if self.interactive():
|
||||||
|
|
|
@ -1660,3 +1660,50 @@ class TestMatchingDisks(IsolatedAsyncioTestCase):
|
||||||
# overhead
|
# overhead
|
||||||
actual = self.fsc.get_bootable_matching_disk({"path": "/dev/md/*"})
|
actual = self.fsc.get_bootable_matching_disk({"path": "/dev/md/*"})
|
||||||
self.assertEqual(r1, actual)
|
self.assertEqual(r1, actual)
|
||||||
|
|
||||||
|
|
||||||
|
class TestResetPartitionLookAhead(IsolatedAsyncioTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.app = make_app()
|
||||||
|
self.app.opts.bootloader = None
|
||||||
|
self.fsc = FilesystemController(app=self.app)
|
||||||
|
|
||||||
|
@parameterized.expand(
|
||||||
|
# (config, is reset only)
|
||||||
|
(
|
||||||
|
({}, False),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"storage": {},
|
||||||
|
},
|
||||||
|
False,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"storage": {
|
||||||
|
"layout": {
|
||||||
|
"name": "direct",
|
||||||
|
"reset-partition": True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
False,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"storage": {
|
||||||
|
"layout": {
|
||||||
|
"reset-partition-only": True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
True,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
def test_is_reset_partition_only_utility(self, config, expected):
|
||||||
|
"""Test is_reset_partition_only utility"""
|
||||||
|
|
||||||
|
self.app.autoinstall_config = config
|
||||||
|
|
||||||
|
self.assertEqual(self.fsc.is_reset_partition_only(), expected)
|
||||||
|
|
|
@ -17,6 +17,7 @@ import jsonschema
|
||||||
from jsonschema.validators import validator_for
|
from jsonschema.validators import validator_for
|
||||||
|
|
||||||
from subiquity.server.autoinstall import AutoinstallError
|
from subiquity.server.autoinstall import AutoinstallError
|
||||||
|
from subiquity.server.controllers.filesystem import FilesystemController
|
||||||
from subiquity.server.controllers.identity import IdentityController
|
from subiquity.server.controllers.identity import IdentityController
|
||||||
from subiquitycore.tests import SubiTestCase
|
from subiquitycore.tests import SubiTestCase
|
||||||
from subiquitycore.tests.mocks import make_app
|
from subiquitycore.tests.mocks import make_app
|
||||||
|
@ -39,6 +40,8 @@ class TestControllerUserCreationFlows(SubiTestCase):
|
||||||
# See subiquity/models/tests/test_subiquity.py for details.
|
# See subiquity/models/tests/test_subiquity.py for details.
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.app = make_app()
|
self.app = make_app()
|
||||||
|
self.app.opts.bootloader = False
|
||||||
|
self.app.controllers.Filesystem = FilesystemController(self.app)
|
||||||
self.ic = IdentityController(self.app)
|
self.ic = IdentityController(self.app)
|
||||||
self.ic.model.user = None
|
self.ic.model.user = None
|
||||||
|
|
||||||
|
@ -54,9 +57,9 @@ class TestControllerUserCreationFlows(SubiTestCase):
|
||||||
({"interactive-sections": ["*"]}, True),
|
({"interactive-sections": ["*"]}, True),
|
||||||
# No Autoinstall => interactive
|
# No Autoinstall => interactive
|
||||||
({}, True),
|
({}, True),
|
||||||
# Can be missing if reset-parition-only specified
|
# Can be missing if reset-partition-only specified
|
||||||
({"storage": {"layout": {"reset-partition-only": True}}}, True),
|
({"storage": {"layout": {"reset-partition-only": True}}}, True),
|
||||||
# Can't be missing if reset-parition-only is not specified
|
# Can't be missing if reset-partition-only is not specified
|
||||||
({"storage": {"layout": {}}}, False),
|
({"storage": {"layout": {}}}, False),
|
||||||
# user-data passed instead
|
# user-data passed instead
|
||||||
({"user-data": "..."}, True),
|
({"user-data": "..."}, True),
|
||||||
|
|
Loading…
Reference in New Issue