Fix libvirt watchdog support

Using the flavor extra_specs property "hw_watchdog_action" was broken.
Scheduling of a new instance always failed with NoValidHostFound error
because of ComputeCapabilitiesFilter, which treated this property as a
host capability to be checked.

Commit f0ff4d5105 caused the problem.

To fix this watchdog_action property is put into 'hw:' scope, so
that it will be ignored by ComputeCapabilitiesFilter in scheduler and
handled in libvirt driver. The doc must be fixed accordingly.

Now driver accepts both 'hw_watchdog_action' and
'hw:watchdog_action', tests were edited for these cases.
Were added TODO items to delete the compat code in L release.

DocImpact
Closes-Bug: #1367344

Conflicts:
	nova/tests/virt/libvirt/test_driver.py

Change-Id: Ic5344ec34a130ee5a0ed2c7348af0b9d79e3508e
(cherry picked from commit 79bfb1bf34)
This commit is contained in:
pkholkin 2014-09-12 19:31:54 +04:00
parent b86bcb9358
commit 8a3b609580
2 changed files with 23 additions and 4 deletions

View File

@ -2192,14 +2192,15 @@ class LibvirtConnTestCase(test.TestCase):
self.assertEqual("none", cfg.devices[7].action) self.assertEqual("none", cfg.devices[7].action)
def test_get_guest_config_with_watchdog_action_through_flavor(self): def _test_get_guest_config_with_watchdog_action_flavor(self,
hw_watchdog_action="hw:watchdog_action"):
self.flags(virt_type='kvm', group='libvirt') self.flags(virt_type='kvm', group='libvirt')
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
fake_flavor = objects.Flavor.get_by_id( fake_flavor = objects.Flavor.get_by_id(
self.context, self.test_instance['instance_type_id']) self.context, self.test_instance['instance_type_id'])
fake_flavor.extra_specs = {'hw_watchdog_action': 'none'} fake_flavor.extra_specs = {hw_watchdog_action: 'none'}
instance_ref = db.instance_create(self.context, self.test_instance) instance_ref = db.instance_create(self.context, self.test_instance)
@ -2232,6 +2233,16 @@ class LibvirtConnTestCase(test.TestCase):
self.assertEqual("none", cfg.devices[7].action) self.assertEqual("none", cfg.devices[7].action)
def test_get_guest_config_with_watchdog_action_through_flavor(self):
self._test_get_guest_config_with_watchdog_action_flavor()
# TODO(pkholkin): the test accepting old property name 'hw_watchdog_action'
# should be removed in L release
def test_get_guest_config_with_watchdog_action_through_flavor_no_scope(
self):
self._test_get_guest_config_with_watchdog_action_flavor(
hw_watchdog_action="hw_watchdog_action")
def test_get_guest_config_with_watchdog_action_meta_overrides_flavor(self): def test_get_guest_config_with_watchdog_action_meta_overrides_flavor(self):
self.flags(virt_type='kvm', group='libvirt') self.flags(virt_type='kvm', group='libvirt')

View File

@ -4094,8 +4094,16 @@ class LibvirtDriver(driver.ComputeDriver):
raise exception.PciDeviceUnsupportedHypervisor( raise exception.PciDeviceUnsupportedHypervisor(
type=CONF.libvirt.virt_type) type=CONF.libvirt.virt_type)
watchdog_action = flavor.extra_specs.get('hw_watchdog_action', if 'hw_watchdog_action' in flavor.extra_specs:
'disabled') LOG.warn(_LW('Old property name "hw_watchdog_action" is now '
'deprecated and will be removed in L release. '
'Use updated property name '
'"hw:watchdog_action" instead'))
# TODO(pkholkin): accepting old property name 'hw_watchdog_action'
# should be removed in L release
watchdog_action = (flavor.extra_specs.get('hw_watchdog_action') or
flavor.extra_specs.get('hw:watchdog_action')
or 'disabled')
if (image_meta is not None and if (image_meta is not None and
image_meta.get('properties', {}).get('hw_watchdog_action')): image_meta.get('properties', {}).get('hw_watchdog_action')):
watchdog_action = image_meta['properties']['hw_watchdog_action'] watchdog_action = image_meta['properties']['hw_watchdog_action']