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. Committags/2014.2.2f0ff4d5105
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 commit79bfb1bf34
)
@@ -2192,14 +2192,15 @@ class LibvirtConnTestCase(test.TestCase): | |||
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') | |||
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) | |||
fake_flavor = objects.Flavor.get_by_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) | |||
@@ -2232,6 +2233,16 @@ class LibvirtConnTestCase(test.TestCase): | |||
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): | |||
self.flags(virt_type='kvm', group='libvirt') | |||
@@ -4094,8 +4094,16 @@ class LibvirtDriver(driver.ComputeDriver): | |||
raise exception.PciDeviceUnsupportedHypervisor( | |||
type=CONF.libvirt.virt_type) | |||
watchdog_action = flavor.extra_specs.get('hw_watchdog_action', | |||
'disabled') | |||
if 'hw_watchdog_action' in flavor.extra_specs: | |||
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 | |||
image_meta.get('properties', {}).get('hw_watchdog_action')): | |||
watchdog_action = image_meta['properties']['hw_watchdog_action'] |