summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/test_utils.py29
-rw-r--r--nova/utils.py14
-rw-r--r--nova/virt/libvirt/connection.py18
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)