filesystem: don't crash if v2/orig_config is called early

When v2/orig_config is called too early, the load_probe_data function
will fail because probe_data is None:

  Traceback (most recent call last):
    File "subiquity/common/api/server.py", line 164, in handler
      result = await implementation(**args)
    File "subiquity/server/controllers/filesystem.py", line 1029, in v2_orig_config_GET
      model = self.model.get_orig_model()
    File "subiquity/models/filesystem.py", line 1428, in get_orig_model
      orig_model.load_probe_data(self._probe_data)
    File "subiquity/models/filesystem.py", line 1894, in load_probe_data
      for devname, devdata in probe_data["blockdev"].items():
  TypeError: 'NoneType' object is not subscriptable

Make sure we don't dereference model._probe_data if it is None.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
(cherry picked from commit 7de6f0538b)
This commit is contained in:
Olivier Gayot 2023-09-26 15:49:59 +02:00 committed by Dan Bungert
parent 8c76944e6b
commit 0caf03c037
2 changed files with 11 additions and 1 deletions

View File

@ -1435,7 +1435,8 @@ class FilesystemModel:
# use on the V2 storage API. # use on the V2 storage API.
orig_model = FilesystemModel(self.bootloader, root=self.root) orig_model = FilesystemModel(self.bootloader, root=self.root)
orig_model.target = self.target orig_model.target = self.target
orig_model.load_probe_data(self._probe_data) if self._probe_data is not None:
orig_model.load_probe_data(self._probe_data)
return orig_model return orig_model
def process_probe_data(self): def process_probe_data(self):

View File

@ -328,6 +328,15 @@ class TestFilesystemModel(unittest.TestCase):
self.assertFalse(lv.ok_for_raid) self.assertFalse(lv.ok_for_raid)
self.assertFalse(lv.ok_for_lvm_vg) self.assertFalse(lv.ok_for_lvm_vg)
def test_get_orig_model_no_probe_data(self):
# When v2/get_orig_data gets called early, model._probe_data is still
# None. Ensure get_orig_model() does not fail.
model = make_model()
model._probe_data = None
orig_model = model.get_orig_model()
self.assertIsNone(orig_model._probe_data)
def fake_up_blockdata_disk(disk, **kw): def fake_up_blockdata_disk(disk, **kw):
model = disk._m model = disk._m