Attach/detach interface to paused instance with affect live flag

Currently attach/detach interface to paused instance is only with
VIR_DOMAIN_AFFECT_CONFIG flags. After instance unpause, there isn't
any effect on the instance, unless restart the instance. So add
flag VIR_DOMAIN_AFFECT_LIVE when attach/detach interface.

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

Change-Id: Iedfc7f6fc06e72d8e3eecebede1274582c8043fd
Closes-Bug: #1299331
(cherry picked from commit a868fcedf8)
This commit is contained in:
He Jie Xu 2014-03-29 15:35:47 +08:00 committed by ChangBo Guo(gcb)
parent 8bc955375c
commit 0e1580e5eb
2 changed files with 85 additions and 3 deletions

View File

@ -8171,6 +8171,7 @@ class LibvirtDriverTestCase(test.TestCase):
super(LibvirtDriverTestCase, self).setUp()
self.libvirtconnection = libvirt_driver.LibvirtDriver(
fake.FakeVirtAPI(), read_only=True)
self.context = context.get_admin_context()
def _create_instance(self, params=None):
"""Create a test instance."""
@ -8198,7 +8199,7 @@ class LibvirtDriverTestCase(test.TestCase):
inst['system_metadata'] = sys_meta
inst.update(params)
return db.instance_create(context.get_admin_context(), inst)
return db.instance_create(self.context, inst)
def test_migrate_disk_and_power_off_exception(self):
"""Test for nova.virt.libvirt.libvirt_driver.LivirtConnection
@ -8765,6 +8766,87 @@ class LibvirtDriverTestCase(test.TestCase):
]
self._test_inject_data(driver_params, disk_params)
def _test_attach_detach_interface(self, method, power_state,
expected_flags):
instance = self._create_instance()
network_info = _fake_network_info(self.stubs, 1)
domain = FakeVirtDomain()
self.mox.StubOutWithMock(self.libvirtconnection, '_lookup_by_name')
self.mox.StubOutWithMock(self.libvirtconnection.firewall_driver,
'setup_basic_filtering')
self.mox.StubOutWithMock(domain, 'attachDeviceFlags')
self.mox.StubOutWithMock(domain, 'info')
self.libvirtconnection._lookup_by_name(
'instance-00000001').AndReturn(domain)
if method == 'attach_interface':
self.libvirtconnection.firewall_driver.setup_basic_filtering(
instance, [network_info[0]])
fake_flavor = flavor_obj.Flavor.get_by_id(
self.context, instance['instance_type_id'])
if method == 'attach_interface':
fake_image_meta = {'id': instance['image_ref']}
elif method == 'detach_interface':
fake_image_meta = None
expected = self.libvirtconnection.vif_driver.get_config(
instance, network_info[0], fake_image_meta, fake_flavor)
self.mox.StubOutWithMock(self.libvirtconnection.vif_driver,
'get_config')
self.libvirtconnection.vif_driver.get_config(
instance, network_info[0],
fake_image_meta,
mox.IsA(flavor_obj.Flavor)).AndReturn(expected)
domain.info().AndReturn([power_state])
if method == 'attach_interface':
domain.attachDeviceFlags(expected.to_xml(), expected_flags)
elif method == 'detach_interface':
domain.detachDeviceFlags(expected.to_xml(), expected_flags)
self.mox.ReplayAll()
if method == 'attach_interface':
self.libvirtconnection.attach_interface(
instance, fake_image_meta, network_info[0])
elif method == 'detach_interface':
self.libvirtconnection.detach_interface(
instance, network_info[0])
self.mox.VerifyAll()
def test_attach_interface_with_running_instance(self):
self._test_attach_detach_interface(
'attach_interface', power_state.RUNNING,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG |
libvirt.VIR_DOMAIN_AFFECT_LIVE))
def test_attach_interface_with_pause_instance(self):
self._test_attach_detach_interface(
'attach_interface', power_state.PAUSED,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG |
libvirt.VIR_DOMAIN_AFFECT_LIVE))
def test_attach_interface_with_shutdown_instance(self):
self._test_attach_detach_interface(
'attach_interface', power_state.SHUTDOWN,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG))
def test_detach_interface_with_running_instance(self):
self._test_attach_detach_interface(
'detach_interface', power_state.RUNNING,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG |
libvirt.VIR_DOMAIN_AFFECT_LIVE))
def test_detach_interface_with_pause_instance(self):
self._test_attach_detach_interface(
'detach_interface', power_state.PAUSED,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG |
libvirt.VIR_DOMAIN_AFFECT_LIVE))
def test_detach_interface_with_shutdown_instance(self):
self._test_attach_detach_interface(
'detach_interface', power_state.SHUTDOWN,
expected_flags=(libvirt.VIR_DOMAIN_AFFECT_CONFIG))
class LibvirtVolumeUsageTestCase(test.TestCase):
"""Test for LibvirtDriver.get_all_volume_usage."""

View File

@ -1412,7 +1412,7 @@ class LibvirtDriver(driver.ComputeDriver):
try:
flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG
state = LIBVIRT_POWER_STATE[virt_dom.info()[0]]
if state == power_state.RUNNING:
if state == power_state.RUNNING or state == power_state.PAUSED:
flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE
virt_dom.attachDeviceFlags(cfg.to_xml(), flags)
except libvirt.libvirtError:
@ -1431,7 +1431,7 @@ class LibvirtDriver(driver.ComputeDriver):
self.vif_driver.unplug(instance, vif)
flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG
state = LIBVIRT_POWER_STATE[virt_dom.info()[0]]
if state == power_state.RUNNING:
if state == power_state.RUNNING or state == power_state.PAUSED:
flags |= libvirt.VIR_DOMAIN_AFFECT_LIVE
virt_dom.detachDeviceFlags(cfg.to_xml(), flags)
except libvirt.libvirtError as ex: