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:
parent
8bc955375c
commit
0e1580e5eb
|
@ -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."""
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue