diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py
index a02f7f2130ef..d21fd378148b 100644
--- a/nova/tests/unit/virt/libvirt/test_config.py
+++ b/nova/tests/unit/virt/libvirt/test_config.py
@@ -338,6 +338,26 @@ class LibvirtConfigCPUFeatureTest(LibvirtConfigBaseTest):
""")
+ def test_config_parse_require(self):
+ xml = """
+
+ """
+ xmldoc = etree.fromstring(xml)
+ obj = config.LibvirtConfigCPUFeature()
+ obj.parse_dom(xmldoc)
+
+ self.assertEqual(obj.policy, "require")
+
+ def test_config_parse_disable(self):
+ xml = """
+
+ """
+ xmldoc = etree.fromstring(xml)
+ obj = config.LibvirtConfigCPUFeature()
+ obj.parse_dom(xmldoc)
+
+ self.assertEqual(obj.policy, "disable")
+
class LibvirtConfigGuestCPUFeatureTest(LibvirtConfigBaseTest):
@@ -436,6 +456,27 @@ class LibvirtConfigCPUTest(LibvirtConfigBaseTest):
""")
+ def test_config_disabled_features(self):
+ obj = config.LibvirtConfigCPU()
+ obj.model = "Penryn"
+ obj.vendor = "Intel"
+ obj.arch = obj_fields.Architecture.X86_64
+
+ disabled_feature = config.LibvirtConfigCPUFeature("mtrr")
+ disabled_feature.policy = "disable"
+ obj.add_feature(disabled_feature)
+ obj.add_feature(config.LibvirtConfigCPUFeature("apic"))
+
+ xml = obj.to_xml()
+ self.assertXmlEqual(xml, """
+
+ x86_64
+ Penryn
+ Intel
+
+
+ """)
+
def test_only_uniq_cpu_featues(self):
obj = config.LibvirtConfigCPU()
obj.model = "Penryn"
diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py
index 23ecb2ccfda7..9ab5136bae29 100644
--- a/nova/virt/libvirt/config.py
+++ b/nova/virt/libvirt/config.py
@@ -674,11 +674,13 @@ class LibvirtConfigCPUFeature(LibvirtConfigObject):
**kwargs)
self.name = name
+ self.policy = "require"
def parse_dom(self, xmldoc):
super(LibvirtConfigCPUFeature, self).parse_dom(xmldoc)
self.name = xmldoc.get("name")
+ self.policy = xmldoc.get("policy", "require")
def format_dom(self):
ft = super(LibvirtConfigCPUFeature, self).format_dom()
@@ -730,7 +732,8 @@ class LibvirtConfigCPU(LibvirtConfigObject):
elif c.tag == "feature":
f = LibvirtConfigCPUFeature()
f.parse_dom(c)
- self.add_feature(f)
+ if f.policy != "disable":
+ self.add_feature(f)
def format_dom(self):
cpu = super(LibvirtConfigCPU, self).format_dom()
@@ -753,7 +756,8 @@ class LibvirtConfigCPU(LibvirtConfigObject):
# sorting the features to allow more predictable tests
for f in sorted(self.features, key=lambda x: x.name):
- cpu.append(f.format_dom())
+ if f.policy != "disable":
+ cpu.append(f.format_dom())
return cpu