diff --git a/subiquity/models/actions.py b/subiquity/models/actions.py index 191ab929..d1a05289 100644 --- a/subiquity/models/actions.py +++ b/subiquity/models/actions.py @@ -111,6 +111,19 @@ class DiskAction(): self._wipe = wipe self._type = 'disk' + __hash__ = None + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self._action_id == other._action_id and + self.parent == other.parent and + self._ptable == other._ptable and + self._model == other._model and + self._serial == other._serial and + self._wipe == other._wipe and + self._type == other._type) + else: + return False + def get_parent(self): return self.parent @@ -147,6 +160,18 @@ class RaidAction(DiskAction): self._spares = spare_ids self._type = 'raid' + __hash__ = None + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self._action_id == other._action_id and + self.parent == other.parent and + self._raidlevel == other._raidlevel and + self._devices == other._devices and + self._spares == other._spares and + self._type == other._type) + else: + return False + def get(self): action = { 'id': self.action_id, @@ -174,6 +199,20 @@ class PartitionAction(DiskAction): if self.flags in ['bios_grub']: self._action_id = 'bios_boot_partition' + __hash__ = None + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self._action_id == other._action_id and + self.parent == other.parent and + self.partnum == other.partnum and + self._offset == other._offset and + self._size == other._size and + self.flags == other.flags and + self._type == other._type) + else: + return False + + @property def path(self): return "{}{}".format(self.parent.action_id, self.partnum) @@ -230,6 +269,17 @@ class FormatAction(DiskAction): if fstype.startswith('fat'): self._action_id = self._action_id[:11] + __hash__ = None + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self._action_id == other._action_id and + self.parent == other.parent and + self._fstype == other._fstype and + self._type == other._type) + else: + return False + + @property def fstype(self): return self._fstype @@ -250,6 +300,16 @@ class MountAction(DiskAction): self._action_id = "{}_mnt".format(self.parent.action_id) self._type = 'mount' + __hash__ = None + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self._action_id == other._action_id and + self.parent == other.parent and + self._path == other._path and + self._type == other._type) + else: + return False + @property def path(self): return self._path diff --git a/subiquity/models/blockdev.py b/subiquity/models/blockdev.py index 1f4d406c..b1fa8cb9 100644 --- a/subiquity/models/blockdev.py +++ b/subiquity/models/blockdev.py @@ -77,6 +77,21 @@ class Disk(): self._size = self._get_size(devpath, size) self._partitions = OrderedDict() + def __eq__(self, other): + if isinstance(other, self.__class__): + print('disk same class, checking members') + return (self._devpath == other._devpath and + self._serial == other._serial and + self._parttype == other._parttype and + self._model == other._model and + self._size == other._size and + self._partitions == other._partitions) + else: + return False + __hash__ = None + def __ne__(self, other): + return not self.__eq__(other) + def _get_size(self, devpath, size): if size: return size @@ -95,6 +110,17 @@ class Disk(): return nr_blocks * block_sz + def __repr__(self): + o = { + 'devpath': self.devpath, + 'serial': self.serial, + 'model': self.model, + 'parttype': self.parttype, + 'size': self.size, + 'partitions': self.partitions + } + return yaml.dump(o, default_flow_format=False) + @property def devpath(self): return self._devpath @@ -136,6 +162,25 @@ class Blockdev(): self.disk.model, self.disk.serial, self.disk.parttype) + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self.disk == other.disk and + self._filesystems == other._filesystems and + self._mounts == other._mounts and + self.bcache == other.bcache and + self.lvm == other.lvm and + self.holder == other.holder and + self.baseaction == other.baseaction) + else: + return False + + __hash__ = None + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return str(self.get_actions()) + def reset(self): ''' Wipe out any actions queued for this disk ''' self.disk.reset() diff --git a/subiquity/tests/fakes.py b/subiquity/tests/fakes.py index e6a6621d..a35bf163 100644 --- a/subiquity/tests/fakes.py +++ b/subiquity/tests/fakes.py @@ -1,7 +1,7 @@ import os -import yaml +import json TOP_DIR = os.path.join('/'.join(__file__.split('/')[:-3])) TEST_DATA = os.path.join(TOP_DIR, 'subiquity', 'tests', 'data') FAKE_MACHINE_JSON = os.path.join(TEST_DATA, 'fake_machine.json') - +FAKE_MACHINE_STORAGE_DATA = json.load(open(FAKE_MACHINE_JSON)).get('storage') diff --git a/subiquity/tests/test_models_filesystems.py b/subiquity/tests/test_models_filesystems.py index c77d8380..beea8732 100644 --- a/subiquity/tests/test_models_filesystems.py +++ b/subiquity/tests/test_models_filesystems.py @@ -1,7 +1,10 @@ -import testtools -import random import argparse +import logging +import random +import testtools +import yaml +from mock import patch from subiquity.models.blockdev import (Blockdev, blockdev_align_up, FIRST_PARTITION_OFFSET, @@ -16,13 +19,21 @@ GB = 1 << 40 class TestFilesystemModel(testtools.TestCase): def setUp(self): super(TestFilesystemModel, self).setUp() + # don't show logging messages while testing + logging.disable(logging.CRITICAL) + self.make_fsm() + + # mocking the reading of the fake data saves on IO + @patch.object(Prober, 'get_storage') + def make_fsm(self, _get_storage): + _get_storage.return_value = fakes.FAKE_MACHINE_STORAGE_DATA self.opts = argparse.Namespace() self.opts.machine_config = fakes.FAKE_MACHINE_JSON self.opts.dry_run = True self.prober = Prober(self.opts) + self.storage = fakes.FAKE_MACHINE_STORAGE_DATA self.fsm = FilesystemModel(self.prober, self.opts) - def test_filesystemmodel_init(self): self.assertNotEqual(self.fsm, None) self.assertEqual(self.fsm.info, {}) @@ -36,12 +47,34 @@ class TestFilesystemModel(testtools.TestCase): def test_filesystemmodel_get_signal_by_name(self): for (name, signal, method) in self.fsm.get_signals(): - self.assertEqual(signal, - self.fsm.get_signal_by_name(name)) + self.assertEqual(self.fsm.get_signal_by_name(name), signal) def test_filesystemmodel_get_menu(self): - self.assertEqual(sorted(self.fsm.fs_menu), - sorted(self.fsm.get_menu())) + self.assertEqual(sorted(self.fsm.get_menu()), + sorted(self.fsm.fs_menu)) + + def test_filesystemmodel_probe_storage(self): + '''sd[b..i]''' + disks = [d for d in self.storage.keys() + if self.storage[d]['DEVTYPE'] == 'disk' and + self.storage[d]['MAJOR'] in ['8', '253']] + self.fsm.probe_storage() + self.assertNotEqual(self.fsm.storage, {}) + self.assertEqual(sorted(self.fsm.info.keys()), + sorted(disks)) + + def test_filesystemmodel_get_disk(self): + self.fsm.probe_storage() + diskname = random.choice(list(self.fsm.info.keys())) + disk = Blockdev(diskname, + self.fsm.info[diskname].serial, + self.fsm.info[diskname].model, + size=self.fsm.info[diskname].size) + + test_disk = self.fsm.get_disk(diskname) + print(disk) + print(test_disk) + self.assertEqual(test_disk, disk) class TestBlockdev(testtools.TestCase):