summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-08-19 12:39:47 +0300
committerLars Wirzenius <liw@liw.fi>2018-08-19 12:39:47 +0300
commit403fae9e113e2e9ca4739077cc1b43f72885de73 (patch)
tree853184b76372f767618044331c3dd3f84b4c342e
parentcb6e340bedcdbfa77a55980d15b98fabe4991ba2 (diff)
downloadvmdb2-403fae9e113e2e9ca4739077cc1b43f72885de73.tar.gz
Change: Tags has ordered list of tags
-rw-r--r--vmdb/__init__.py2
-rw-r--r--vmdb/tags.py45
-rw-r--r--vmdb/tags_tests.py90
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')