diff options
author | Lars Wirzenius <liw@liw.fi> | 2018-08-19 12:39:47 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2018-08-19 12:39:47 +0300 |
commit | 403fae9e113e2e9ca4739077cc1b43f72885de73 (patch) | |
tree | 853184b76372f767618044331c3dd3f84b4c342e | |
parent | cb6e340bedcdbfa77a55980d15b98fabe4991ba2 (diff) | |
download | vmdb2-403fae9e113e2e9ca4739077cc1b43f72885de73.tar.gz |
Change: Tags has ordered list of tags
-rw-r--r-- | vmdb/__init__.py | 2 | ||||
-rw-r--r-- | vmdb/tags.py | 45 | ||||
-rw-r--r-- | vmdb/tags_tests.py | 90 |
3 files changed, 84 insertions, 53 deletions
diff --git a/vmdb/__init__.py b/vmdb/__init__.py index 2bcc954..91aa015 100644 --- a/vmdb/__init__.py +++ b/vmdb/__init__.py @@ -31,7 +31,7 @@ from .runcmd import ( progress, error, ) -from .tags import Tags, UnknownTag, TagInUse, AlreadyMounted +from .tags import Tags, UnknownTag, TagInUse, AlreadyHasDev, AlreadyMounted from .unmount import unmount, NotMounted from .spec import ( Spec, diff --git a/vmdb/tags.py b/vmdb/tags.py index 2318a65..337b36d 100644 --- a/vmdb/tags.py +++ b/vmdb/tags.py @@ -29,6 +29,7 @@ class Tags: def __init__(self): self._tags = {} + self._tagnames = [] def get_tags(self): return list(self._tags.keys()) @@ -37,35 +38,39 @@ class Tags: return tag in self._tags def get_dev(self, tag): - item = self._tags.get(tag) - if item is None: - raise UnknownTag(tag) + item = self._get(tag) return item['dev'] def get_mount_point(self, tag): - item = self._tags.get(tag) - if item is None: - raise UnknownTag(tag) + item = self._get(tag) return item['mount_point'] - def add_partition(self, tag, dev): + def append(self, tag): if tag in self._tags: raise TagInUse(tag) - self._new(tag, dev, None) + self._tagnames.append(tag) + self._tags[tag] = { + 'dev': None, + 'mount_point': None, + } - def add_mount_point(self, tag, mount_point): - item = self._tags.get(tag) - if item is None: - raise UnknownTag(tag) + def set_dev(self, tag, dev): + item = self._get(tag) + if item['dev'] is not None: + raise AlreadyHasDev(tag) + item['dev'] = dev + + def set_mount_point(self, tag, mount_point): + item = self._get(tag) if item['mount_point'] is not None: raise AlreadyMounted(tag) item['mount_point'] = mount_point - def _new(self, tag, dev, mount_point): - self._tags[tag] = { - 'dev': dev, - 'mount_point': mount_point, - } + def _get(self, tag): + item = self._tags.get(tag) + if item is None: + raise UnknownTag(tag) + return item class TagInUse(Exception): @@ -80,6 +85,12 @@ class UnknownTag(Exception): super().__init__('Unknown tag: {}'.format(tag)) +class AlreadyHasDev(Exception): + + def __init__(self, tag): + super().__init__('Already has device: {}'.format(tag)) + + class AlreadyMounted(Exception): def __init__(self, tag): diff --git a/vmdb/tags_tests.py b/vmdb/tags_tests.py index ae20e38..ff960b7 100644 --- a/vmdb/tags_tests.py +++ b/vmdb/tags_tests.py @@ -22,57 +22,77 @@ import unittest import vmdb -class ImageTests(unittest.TestCase): +class TagsTests(unittest.TestCase): def test_lists_not_tags_initally(self): - image = vmdb.Image() - self.assertEqual(image.get_tags(), []) + tags = vmdb.Tags() + self.assertEqual(tags.get_tags(), []) def test_tells_if_tag_is_used(self): - image = vmdb.Image() - self.assertFalse(image.has_tag('foo')) - image.add_partition('foo', 'bar') - self.assertTrue(image.has_tag('foo')) + tags = vmdb.Tags() + self.assertFalse(tags.has_tag('foo')) + tags.append('foo') + self.assertTrue(tags.has_tag('foo')) + self.assertEqual(tags.get_tags(), ['foo']) + + def test_remembers_order(self): + tags = vmdb.Tags() + tags.append('foo') + tags.append('bar') + self.assertTrue(tags.get_tags(), ['foo', 'bar']) def test_get_dev_raises_error_for_unknown_tag(self): - image = vmdb.Image() + tags = vmdb.Tags() with self.assertRaises(vmdb.UnknownTag): - image.get_dev('does-not-exist') + tags.get_dev('does-not-exist') def test_get_mount_point_raises_error_for_unknown_tag(self): - image = vmdb.Image() + tags = vmdb.Tags() with self.assertRaises(vmdb.UnknownTag): - image.get_mount_point('does-not-exist') + tags.get_mount_point('does-not-exist') def test_raises_error_for_reused_tag(self): - image = vmdb.Image() - image.add_partition('tag', 'dev') + tags = vmdb.Tags() + tags.append('tag') with self.assertRaises(vmdb.TagInUse): - image.add_partition('tag', 'dev') + tags.append('tag') - def test_adds_partition(self): - image = vmdb.Image() - image.add_partition('first', '/dev/foo') - self.assertEqual(image.get_tags(), ['first']) - self.assertEqual(image.get_dev('first'), '/dev/foo') - self.assertEqual(image.get_mount_point('first'), None) + def test_sets_dev(self): + tags = vmdb.Tags() + tags.append('first') + tags.set_dev('first', '/dev/foo') + self.assertEqual(tags.get_tags(), ['first']) + self.assertEqual(tags.get_dev('first'), '/dev/foo') + self.assertEqual(tags.get_mount_point('first'), None) def test_adds_mount_point(self): - image = vmdb.Image() - image.add_partition('first', '/dev/foo') - image.add_mount_point('first', '/mnt/foo') - self.assertEqual(image.get_tags(), ['first']) - self.assertEqual(image.get_dev('first'), '/dev/foo') - self.assertEqual(image.get_mount_point('first'), '/mnt/foo') - - def test_add_mount_point_raises_error_for_unknown_tag(self): - image = vmdb.Image() + tags = vmdb.Tags() + tags.append('first') + tags.set_mount_point('first', '/mnt/foo') + self.assertEqual(tags.get_tags(), ['first']) + self.assertEqual(tags.get_dev('first'), None) + self.assertEqual(tags.get_mount_point('first'), '/mnt/foo') + + def test_set_dev_raises_error_for_unknown_tag(self): + tags = vmdb.Tags() with self.assertRaises(vmdb.UnknownTag): - image.add_mount_point('first', '/mnt/foo') + tags.set_dev('first', '/mnt/foo') - def test_add_mount_point_raises_error_for_double_mount(self): - image = vmdb.Image() - image.add_partition('first', '/dev/foo') - image.add_mount_point('first', '/mnt/foo') + def test_set_mount_point_raises_error_for_unknown_tag(self): + tags = vmdb.Tags() + with self.assertRaises(vmdb.UnknownTag): + tags.set_mount_point('first', '/mnt/foo') + + def test_set_mount_point_raises_error_for_double_mount(self): + tags = vmdb.Tags() + tags.append('first') + tags.set_mount_point('first', '/mnt/foo') with self.assertRaises(vmdb.AlreadyMounted): - image.add_mount_point('first', '/mnt/foo') + tags.set_mount_point('first', '/mnt/foo') + + def test_set_dev_raises_error_for_double_dev(self): + tags = vmdb.Tags() + tags.append('first') + tags.set_dev('first', '/dev/foo') + with self.assertRaises(vmdb.AlreadyHasDev): + tags.set_dev('first', '/dev/foo') |