Merge "Migrate to fileutils and lockutils."
This commit is contained in:
		| @@ -91,9 +91,6 @@ core_opts = [ | |||||||
|     cfg.StrOpt('state_path', |     cfg.StrOpt('state_path', | ||||||
|                default='$pybasedir', |                default='$pybasedir', | ||||||
|                help="Top-level directory for maintaining nova's state"), |                help="Top-level directory for maintaining nova's state"), | ||||||
|     cfg.StrOpt('lock_path', |  | ||||||
|                default='$pybasedir', |  | ||||||
|                help='Directory to use for lock files'), |  | ||||||
|     ] |     ] | ||||||
|  |  | ||||||
| debug_opts = [ | debug_opts = [ | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
| import os | import os | ||||||
|  |  | ||||||
| from nova import flags | from nova import flags | ||||||
|  | from nova.openstack.common import fileutils | ||||||
| from nova import test | from nova import test | ||||||
| from nova.tests import fake_libvirt_utils | from nova.tests import fake_libvirt_utils | ||||||
| from nova.virt.libvirt import imagebackend | from nova.virt.libvirt import imagebackend | ||||||
| @@ -56,8 +57,8 @@ class _ImageTestCase(test.TestCase): | |||||||
|         os.path.exists(self.TEMPLATE_PATH).AndReturn(False) |         os.path.exists(self.TEMPLATE_PATH).AndReturn(False) | ||||||
|         fn = self.mox.CreateMockAnything() |         fn = self.mox.CreateMockAnything() | ||||||
|         fn(target=self.TEMPLATE_PATH) |         fn(target=self.TEMPLATE_PATH) | ||||||
|         self.mox.StubOutWithMock(imagebackend.utils, 'ensure_tree') |         self.mox.StubOutWithMock(imagebackend.fileutils, 'ensure_tree') | ||||||
|         imagebackend.utils.ensure_tree(self.TEMPLATE_DIR) |         imagebackend.fileutils.ensure_tree(self.TEMPLATE_DIR) | ||||||
|         self.mox.ReplayAll() |         self.mox.ReplayAll() | ||||||
|  |  | ||||||
|         image = self.image_class(self.INSTANCE, self.NAME) |         image = self.image_class(self.INSTANCE, self.NAME) | ||||||
| @@ -83,7 +84,7 @@ class _ImageTestCase(test.TestCase): | |||||||
|         os.path.exists(self.TEMPLATE_PATH).AndReturn(False) |         os.path.exists(self.TEMPLATE_PATH).AndReturn(False) | ||||||
|         fn = self.mox.CreateMockAnything() |         fn = self.mox.CreateMockAnything() | ||||||
|         fn(target=self.TEMPLATE_PATH) |         fn(target=self.TEMPLATE_PATH) | ||||||
|         self.mox.StubOutWithMock(imagebackend.utils, 'ensure_tree') |         self.mox.StubOutWithMock(imagebackend.fileutils, 'ensure_tree') | ||||||
|         self.mox.ReplayAll() |         self.mox.ReplayAll() | ||||||
|  |  | ||||||
|         image = self.image_class(self.INSTANCE, self.NAME) |         image = self.image_class(self.INSTANCE, self.NAME) | ||||||
| @@ -117,7 +118,8 @@ class RawTestCase(_ImageTestCase): | |||||||
|  |  | ||||||
|     def prepare_mocks(self): |     def prepare_mocks(self): | ||||||
|         fn = self.mox.CreateMockAnything() |         fn = self.mox.CreateMockAnything() | ||||||
|         self.mox.StubOutWithMock(imagebackend.utils.synchronized, '__call__') |         self.mox.StubOutWithMock(imagebackend.lockutils.synchronized, | ||||||
|  |                                  '__call__') | ||||||
|         self.mox.StubOutWithMock(imagebackend.libvirt_utils, 'copy_image') |         self.mox.StubOutWithMock(imagebackend.libvirt_utils, 'copy_image') | ||||||
|         self.mox.StubOutWithMock(imagebackend.disk, 'extend') |         self.mox.StubOutWithMock(imagebackend.disk, 'extend') | ||||||
|         return fn |         return fn | ||||||
| @@ -167,7 +169,8 @@ class Qcow2TestCase(_ImageTestCase): | |||||||
|  |  | ||||||
|     def prepare_mocks(self): |     def prepare_mocks(self): | ||||||
|         fn = self.mox.CreateMockAnything() |         fn = self.mox.CreateMockAnything() | ||||||
|         self.mox.StubOutWithMock(imagebackend.utils.synchronized, '__call__') |         self.mox.StubOutWithMock(imagebackend.lockutils.synchronized, | ||||||
|  |                                  '__call__') | ||||||
|         self.mox.StubOutWithMock(imagebackend.libvirt_utils, |         self.mox.StubOutWithMock(imagebackend.libvirt_utils, | ||||||
|                                  'create_cow_image') |                                  'create_cow_image') | ||||||
|         self.mox.StubOutWithMock(imagebackend.libvirt_utils, 'copy_image') |         self.mox.StubOutWithMock(imagebackend.libvirt_utils, 'copy_image') | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ from nova import context | |||||||
| from nova import db | from nova import db | ||||||
| from nova import exception | from nova import exception | ||||||
| from nova import flags | from nova import flags | ||||||
|  | from nova.openstack.common import fileutils | ||||||
| from nova.openstack.common import importutils | from nova.openstack.common import importutils | ||||||
| from nova.openstack.common import jsonutils | from nova.openstack.common import jsonutils | ||||||
| from nova.openstack.common import log as logging | from nova.openstack.common import log as logging | ||||||
| @@ -448,7 +449,7 @@ class CacheConcurrencyTestCase(test.TestCase): | |||||||
|         # use for tests. So, create the path here so utils.synchronized() |         # use for tests. So, create the path here so utils.synchronized() | ||||||
|         # won't delete it out from under one of the threads. |         # won't delete it out from under one of the threads. | ||||||
|         self.lock_path = os.path.join(FLAGS.instances_path, 'locks') |         self.lock_path = os.path.join(FLAGS.instances_path, 'locks') | ||||||
|         utils.ensure_tree(self.lock_path) |         fileutils.ensure_tree(self.lock_path) | ||||||
|  |  | ||||||
|         def fake_exists(fname): |         def fake_exists(fname): | ||||||
|             basedir = os.path.join(FLAGS.instances_path, FLAGS.base_dir_name) |             basedir = os.path.join(FLAGS.instances_path, FLAGS.base_dir_name) | ||||||
|   | |||||||
| @@ -24,7 +24,6 @@ from eventlet import greenthread | |||||||
|  |  | ||||||
| from nova import exception | from nova import exception | ||||||
| from nova import test | from nova import test | ||||||
| from nova import utils |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class ExceptionTestCase(test.TestCase): | class ExceptionTestCase(test.TestCase): | ||||||
| @@ -63,96 +62,3 @@ class ProjectTestCase(test.TestCase): | |||||||
|         helpful_msg = (_("The following migrations are missing a downgrade:" |         helpful_msg = (_("The following migrations are missing a downgrade:" | ||||||
|                          "\n\t%s") % '\n\t'.join(sorted(missing_downgrade))) |                          "\n\t%s") % '\n\t'.join(sorted(missing_downgrade))) | ||||||
|         self.assert_(not missing_downgrade, helpful_msg) |         self.assert_(not missing_downgrade, helpful_msg) | ||||||
|  |  | ||||||
|  |  | ||||||
| class LockTestCase(test.TestCase): |  | ||||||
|     def test_synchronized_wrapped_function_metadata(self): |  | ||||||
|         @utils.synchronized('whatever') |  | ||||||
|         def foo(): |  | ||||||
|             """Bar""" |  | ||||||
|             pass |  | ||||||
|         self.assertEquals(foo.__doc__, 'Bar', "Wrapped function's docstring " |  | ||||||
|                                               "got lost") |  | ||||||
|         self.assertEquals(foo.__name__, 'foo', "Wrapped function's name " |  | ||||||
|                                                "got mangled") |  | ||||||
|  |  | ||||||
|     def test_synchronized_internally(self): |  | ||||||
|         """We can lock across multiple green threads""" |  | ||||||
|         saved_sem_num = len(utils._semaphores) |  | ||||||
|         seen_threads = list() |  | ||||||
|  |  | ||||||
|         @utils.synchronized('testlock2', external=False) |  | ||||||
|         def f(id): |  | ||||||
|             for x in range(10): |  | ||||||
|                 seen_threads.append(id) |  | ||||||
|                 greenthread.sleep(0) |  | ||||||
|  |  | ||||||
|         threads = [] |  | ||||||
|         pool = greenpool.GreenPool(10) |  | ||||||
|         for i in range(10): |  | ||||||
|             threads.append(pool.spawn(f, i)) |  | ||||||
|  |  | ||||||
|         for thread in threads: |  | ||||||
|             thread.wait() |  | ||||||
|  |  | ||||||
|         self.assertEquals(len(seen_threads), 100) |  | ||||||
|         # Looking at the seen threads, split it into chunks of 10, and verify |  | ||||||
|         # that the last 9 match the first in each chunk. |  | ||||||
|         for i in range(10): |  | ||||||
|             for j in range(9): |  | ||||||
|                 self.assertEquals(seen_threads[i * 10], |  | ||||||
|                                   seen_threads[i * 10 + 1 + j]) |  | ||||||
|  |  | ||||||
|         self.assertEqual(saved_sem_num, len(utils._semaphores), |  | ||||||
|                          "Semaphore leak detected") |  | ||||||
|  |  | ||||||
|     def test_nested_external_works(self): |  | ||||||
|         """We can nest external syncs""" |  | ||||||
|         with utils.tempdir() as tempdir: |  | ||||||
|             self.flags(lock_path=tempdir) |  | ||||||
|             sentinel = object() |  | ||||||
|  |  | ||||||
|             @utils.synchronized('testlock1', external=True) |  | ||||||
|             def outer_lock(): |  | ||||||
|  |  | ||||||
|                 @utils.synchronized('testlock2', external=True) |  | ||||||
|                 def inner_lock(): |  | ||||||
|                     return sentinel |  | ||||||
|                 return inner_lock() |  | ||||||
|  |  | ||||||
|             self.assertEqual(sentinel, outer_lock()) |  | ||||||
|  |  | ||||||
|     def test_synchronized_externally(self): |  | ||||||
|         """We can lock across multiple processes""" |  | ||||||
|         with utils.tempdir() as tempdir: |  | ||||||
|             self.flags(lock_path=tempdir) |  | ||||||
|             rpipe1, wpipe1 = os.pipe() |  | ||||||
|             rpipe2, wpipe2 = os.pipe() |  | ||||||
|  |  | ||||||
|             @utils.synchronized('testlock1', external=True) |  | ||||||
|             def f(rpipe, wpipe): |  | ||||||
|                 try: |  | ||||||
|                     os.write(wpipe, "foo") |  | ||||||
|                 except OSError, e: |  | ||||||
|                     self.assertEquals(e.errno, errno.EPIPE) |  | ||||||
|                     return |  | ||||||
|  |  | ||||||
|                 rfds, _wfds, _efds = select.select([rpipe], [], [], 1) |  | ||||||
|                 self.assertEquals(len(rfds), 0, "The other process, which was" |  | ||||||
|                                                 " supposed to be locked, " |  | ||||||
|                                                 "wrote on its end of the " |  | ||||||
|                                                 "pipe") |  | ||||||
|                 os.close(rpipe) |  | ||||||
|  |  | ||||||
|             pid = os.fork() |  | ||||||
|             if pid > 0: |  | ||||||
|                 os.close(wpipe1) |  | ||||||
|                 os.close(rpipe2) |  | ||||||
|  |  | ||||||
|                 f(rpipe1, wpipe2) |  | ||||||
|             else: |  | ||||||
|                 os.close(rpipe1) |  | ||||||
|                 os.close(wpipe2) |  | ||||||
|  |  | ||||||
|                 f(rpipe2, wpipe1) |  | ||||||
|                 os._exit(0) |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jenkins
					Jenkins