summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorMichael Still <mikal@stillhq.com>2012-12-14 10:22:44 +1100
committerMichael Still <mikal@stillhq.com>2012-12-15 10:22:03 +1100
commit6da1dbc8498b4c3143221fd4e1b9f59374134fd3 (patch)
treea2f25ac893425f26c72ddf896cddcb591edb1646 /nova/tests
parent8652d71ade5e778da7c5934cc313f9c85443a0ce (diff)
Retry NBD device allocation.
Mitigates bug 726244. Change-Id: I2f09f3a69c3eb61ca3af90355d5861373b7ae277
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/virt/disk/test_nbd.py110
1 files changed, 78 insertions, 32 deletions
diff --git a/nova/tests/virt/disk/test_nbd.py b/nova/tests/virt/disk/test_nbd.py
index 5e08215a5..17e149cbc 100644
--- a/nova/tests/virt/disk/test_nbd.py
+++ b/nova/tests/virt/disk/test_nbd.py
@@ -139,13 +139,13 @@ class NbdTestCase(test.TestCase):
# re-added. I will fix this in a later patch.
self.assertEquals('/dev/nbd1', n._allocate_nbd())
- def test_get_dev_no_devices(self):
+ def test_inner_get_dev_no_devices(self):
tempdir = self.useFixture(fixtures.TempDir()).path
n = nbd.NbdMount(None, tempdir)
n.detect_nbd_device = _fake_detect_nbd_devices
- self.assertFalse(n.get_dev())
+ self.assertFalse(n._inner_get_dev())
- def test_get_dev_qemu_fails(self):
+ def test_inner_get_dev_qemu_fails(self):
tempdir = self.useFixture(fixtures.TempDir()).path
n = nbd.NbdMount(None, tempdir)
self.useFixture(fixtures.MonkeyPatch('os.path.exists',
@@ -157,10 +157,10 @@ class NbdTestCase(test.TestCase):
self.useFixture(fixtures.MonkeyPatch('nova.utils.trycmd', fake_trycmd))
# Error logged, no device consumed
- self.assertFalse(n.get_dev())
+ self.assertFalse(n._inner_get_dev())
self.assertTrue(n.error.startswith('qemu-nbd error'))
- def test_get_dev_qemu_timeout(self):
+ def test_inner_get_dev_qemu_timeout(self):
tempdir = self.useFixture(fixtures.TempDir()).path
n = nbd.NbdMount(None, tempdir)
n.detect_nbd_device = _fake_detect_nbd_devices
@@ -174,46 +174,46 @@ class NbdTestCase(test.TestCase):
self.useFixture(fixtures.MonkeyPatch('time.sleep', _fake_noop))
# Error logged, no device consumed
- self.assertFalse(n.get_dev())
+ self.assertFalse(n._inner_get_dev())
self.assertTrue(n.error.endswith('did not show up'))
- def test_get_dev_works(self):
- tempdir = self.useFixture(fixtures.TempDir()).path
- n = nbd.NbdMount(None, tempdir)
- n.detect_nbd_device = _fake_detect_nbd_devices
- self.useFixture(fixtures.MonkeyPatch('random.shuffle', _fake_noop))
- self.useFixture(fixtures.MonkeyPatch('nova.utils.execute', _fake_noop))
-
+ def fake_exists_one(self, path):
# We need the pid file for the device which is allocated to exist, but
# only once it is allocated to us
- def fake_exists_one(path):
+ if path.startswith('/sys/block/nbd'):
+ if path == '/sys/block/nbd1/pid':
+ return False
+ if path.endswith('pid'):
+ return False
+ return True
+ return ORIG_EXISTS(path)
+
+ def fake_trycmd_creates_pid(self, *args, **kwargs):
+ def fake_exists_two(path):
if path.startswith('/sys/block/nbd'):
- if path == '/sys/block/nbd1/pid':
- return False
+ if path == '/sys/block/nbd0/pid':
+ return True
if path.endswith('pid'):
return False
return True
return ORIG_EXISTS(path)
self.useFixture(fixtures.MonkeyPatch('os.path.exists',
- fake_exists_one))
+ fake_exists_two))
+ return '', ''
- # We have a trycmd that always passed
- def fake_trycmd(*args, **kwargs):
- def fake_exists_two(path):
- if path.startswith('/sys/block/nbd'):
- if path == '/sys/block/nbd0/pid':
- return True
- if path.endswith('pid'):
- return False
- return True
- return ORIG_EXISTS(path)
- self.useFixture(fixtures.MonkeyPatch('os.path.exists',
- fake_exists_two))
- return '', ''
- self.useFixture(fixtures.MonkeyPatch('nova.utils.trycmd', fake_trycmd))
+ def test_inner_get_dev_works(self):
+ tempdir = self.useFixture(fixtures.TempDir()).path
+ n = nbd.NbdMount(None, tempdir)
+ n.detect_nbd_device = _fake_detect_nbd_devices
+ self.useFixture(fixtures.MonkeyPatch('random.shuffle', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('os.path.exists',
+ self.fake_exists_one))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.trycmd',
+ self.fake_trycmd_creates_pid))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.execute', _fake_noop))
# No error logged, device consumed
- self.assertTrue(n.get_dev())
+ self.assertTrue(n._inner_get_dev())
self.assertTrue(n.linked)
self.assertEquals('', n.error)
self.assertEquals('/dev/nbd0', n.device)
@@ -229,4 +229,50 @@ class NbdTestCase(test.TestCase):
# something we don't have
tempdir = self.useFixture(fixtures.TempDir()).path
n = nbd.NbdMount(None, tempdir)
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.execute', _fake_noop))
n.unget_dev()
+
+ def test_get_dev(self):
+ tempdir = self.useFixture(fixtures.TempDir()).path
+ n = nbd.NbdMount(None, tempdir)
+ n.detect_nbd_device = _fake_detect_nbd_devices
+ self.useFixture(fixtures.MonkeyPatch('random.shuffle', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.execute', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('os.path.exists',
+ self.fake_exists_one))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.trycmd',
+ self.fake_trycmd_creates_pid))
+
+ # No error logged, device consumed
+ self.assertTrue(n.get_dev())
+ self.assertTrue(n.linked)
+ self.assertEquals('', n.error)
+ self.assertEquals('/dev/nbd0', n.device)
+
+ # Free
+ n.unget_dev()
+ self.assertFalse(n.linked)
+ self.assertEquals('', n.error)
+ self.assertEquals(None, n.device)
+
+ def test_get_dev_timeout(self):
+ tempdir = self.useFixture(fixtures.TempDir()).path
+ n = nbd.NbdMount(None, tempdir)
+ n.detect_nbd_device = _fake_detect_nbd_devices
+ self.useFixture(fixtures.MonkeyPatch('random.shuffle', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('time.sleep', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.execute', _fake_noop))
+ self.useFixture(fixtures.MonkeyPatch('os.path.exists',
+ self.fake_exists_one))
+ self.useFixture(fixtures.MonkeyPatch('nova.utils.trycmd',
+ self.fake_trycmd_creates_pid))
+ self.useFixture(fixtures.MonkeyPatch(('nova.virt.disk.mount.nbd.'
+ 'MAX_NBD_WAIT'), -10))
+
+ # Always fail to get a device
+ def fake_get_dev_fails():
+ return False
+ n._inner_get_dev = fake_get_dev_fails
+
+ # No error logged, device consumed
+ self.assertFalse(n.get_dev())