diff options
| -rw-r--r-- | nova/tests/test_utils.py | 29 | ||||
| -rw-r--r-- | nova/utils.py | 14 | ||||
| -rw-r--r-- | nova/virt/libvirt/connection.py | 18 |
3 files changed, 59 insertions, 2 deletions
diff --git a/nova/tests/test_utils.py b/nova/tests/test_utils.py index 15ac0dc2d..d2b122121 100644 --- a/nova/tests/test_utils.py +++ b/nova/tests/test_utils.py @@ -14,6 +14,8 @@ # License for the specific language governing permissions and limitations # under the License. +import __builtin__ +import mox import datetime import os import tempfile @@ -330,6 +332,33 @@ class GenericUtilsTestCase(test.TestCase): actual_url = "http://%s:%d" % (FLAGS.glance_host, FLAGS.glance_port) self.assertEqual(generated_url, actual_url) + def test_read_cached_file(self): + self.mox.StubOutWithMock(os.path, "getmtime") + os.path.getmtime(mox.IgnoreArg()).AndReturn(1) + self.mox.ReplayAll() + + cache_data = {"data": 1123, "mtime": 1} + data = utils.read_cached_file("/this/is/a/fake", cache_data) + self.assertEqual(cache_data["data"], data) + + def test_read_modified_cached_file(self): + self.mox.StubOutWithMock(os.path, "getmtime") + self.mox.StubOutWithMock(__builtin__, 'open') + + os.path.getmtime(mox.IgnoreArg()).AndReturn(2) + + fake_contents = "lorem ipsum" + fake_file = self.mox.CreateMockAnything() + fake_file.read().AndReturn(fake_contents) + __builtin__.open(mox.IgnoreArg()).AndReturn(fake_file) + + self.mox.ReplayAll() + cache_data = {"data": 1123, "mtime": 1} + data = utils.read_cached_file("/this/is/a/fake", cache_data) + self.mox.VerifyAll() + self.mox.UnsetStubs() + self.assertEqual(data, fake_contents) + class IsUUIDLikeTestCase(test.TestCase): def assertUUIDLike(self, val, expected): diff --git a/nova/utils.py b/nova/utils.py index 1139e101e..992482223 100644 --- a/nova/utils.py +++ b/nova/utils.py @@ -1110,3 +1110,17 @@ def sanitize_hostname(hostname): hostname = hostname.strip('.-') return hostname + + +def read_cached_file(filename, cache_info): + """Return the contents of a file. If the file hasn't changed since the + last invocation, a cached version will be returned. + """ + mtime = os.path.getmtime(filename) + if cache_info and mtime == cache_info.get('mtime', None): + return cache_info['data'] + + data = open(filename).read() + cache_info['data'] = data + cache_info['mtime'] = mtime + return data diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 5dee8f0c7..bbd45ee13 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -185,8 +185,6 @@ class LibvirtConnection(driver.ComputeDriver): def __init__(self, read_only): super(LibvirtConnection, self).__init__() - self.libvirt_xml = open(FLAGS.libvirt_xml_template).read() - self.cpuinfo_xml = open(FLAGS.cpuinfo_xml_template).read() self._host_state = None self._wrapped_conn = None self.read_only = read_only @@ -220,6 +218,22 @@ class LibvirtConnection(driver.ComputeDriver): # NOTE(nsokolov): moved instance restarting to ComputeManager pass + @property + def libvirt_xml(self): + if not hasattr(self, '_libvirt_xml_cache_info'): + self._libvirt_xml_cache_info = {} + + return utils.read_cached_file(FLAGS.libvirt_xml_template, + self._libvirt_xml_cache_info) + + @property + def cpuinfo_xml(self): + if not hasattr(self, '_cpuinfo_xml_cache_info'): + self._cpuinfo_xml_cache_info = {} + + return utils.read_cached_file(FLAGS.cpuinfo_xml_template, + self._cpuinfo_xml_cache_info) + def _get_connection(self): if not self._wrapped_conn or not self._test_connection(): LOG.debug(_('Connecting to libvirt: %s'), self.uri) |
