summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorAlvaro Lopez Garcia <aloga@ifca.unican.es>2011-12-02 14:18:38 +0100
committerAlvaro Lopez Garcia <aloga@ifca.unican.es>2011-12-15 18:09:21 +0100
commitf68abf9b0e3e2ba206c560c19db321c6f88670f1 (patch)
tree3e798b368e928c79d15dc7d8337db976324e4e0d /nova
parent36791875b599da16d90578b1b53759f82f8e04bb (diff)
downloadnova-f68abf9b0e3e2ba206c560c19db321c6f88670f1.tar.gz
nova-f68abf9b0e3e2ba206c560c19db321c6f88670f1.tar.xz
nova-f68abf9b0e3e2ba206c560c19db321c6f88670f1.zip
Fixes bug 723235
The XML templates have been converted into properties, thus we can compare the mtime of the XML templates (libvirt and cpuinfo) each time they are needed, checking if they have been modified and reloading them. Added a function to read cached files. Change-Id: I6cf0229c6435300e73f9d9a6b10b0bf9bf144a55
Diffstat (limited to 'nova')
-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)