libvirt: fix and break up _test_attach_detach_interface
The detach_interface flow in this test was broken because it wasn't mocking out domain.detachDeviceFlags so the xml it was expecting to be passed to that method wasn't actually being verified. The same thing is broken in test test_detach_interface_device_with_same_mac_address because it copies the other broken test code. This change breaks apart the monster attach/detach test method and converts the detach_interface portion to mock and fixes the broken assertion. test_detach_interface_device_with_same_mac_address is just fixed, not converted to mock. Conflicts: nova/tests/unit/virt/libvirt/test_driver.py NOTE(mriedem): The conflict is due to change I5c461a8242c51994d12ce9c6774d5f956232f950 not being in Newton. Change-Id: I6d9a975876c5652ef544c587f65b1bdd1543848b Related-Bug: #1607714 (cherry picked from commit1ecd71b08d
) (cherry picked from commitc0820944ea
)
This commit is contained in:
parent
059c5298e2
commit
70c44831a5
|
@ -378,14 +378,16 @@ def _concurrency(signal, wait, done, target, is_block_dev=False):
|
|||
|
||||
class FakeVirtDomain(object):
|
||||
|
||||
def __init__(self, fake_xml=None, uuidstr=None, id=None, name=None):
|
||||
def __init__(self, fake_xml=None, uuidstr=None, id=None, name=None,
|
||||
info=None):
|
||||
if uuidstr is None:
|
||||
uuidstr = str(uuid.uuid4())
|
||||
self.uuidstr = uuidstr
|
||||
self.id = id
|
||||
self.domname = name
|
||||
self._info = [power_state.RUNNING, 2048 * units.Mi, 1234 * units.Mi,
|
||||
None, None]
|
||||
self._info = info or (
|
||||
[power_state.RUNNING, 2048 * units.Mi,
|
||||
1234 * units.Mi, None, None])
|
||||
if fake_xml:
|
||||
self._fake_dom_xml = fake_xml
|
||||
else:
|
||||
|
@ -16539,8 +16541,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
|
|||
self._test_inject_data(driver_params, "/fail/path",
|
||||
disk_params, called=False)
|
||||
|
||||
def _test_attach_detach_interface(self, method, power_state,
|
||||
expected_flags):
|
||||
def _test_attach_interface(self, power_state, expected_flags):
|
||||
instance = self._create_instance()
|
||||
network_info = _fake_network_info(self, 1)
|
||||
domain = FakeVirtDomain(fake_xml="""
|
||||
|
@ -16565,91 +16566,109 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
|
|||
host.Host.get_domain(instance).AndReturn(domain)
|
||||
domain.info().AndReturn([power_state, 1, 2, 3, 4])
|
||||
|
||||
if method == 'attach_interface':
|
||||
self.drvr.firewall_driver.setup_basic_filtering(
|
||||
instance, [network_info[0]])
|
||||
fake_image_meta = objects.ImageMeta.from_dict(
|
||||
{'id': instance.image_ref})
|
||||
expected = self.drvr.vif_driver.get_config(
|
||||
instance, network_info[0], fake_image_meta, instance.flavor,
|
||||
CONF.libvirt.virt_type, self.drvr._host)
|
||||
self.mox.StubOutWithMock(self.drvr.vif_driver,
|
||||
'get_config')
|
||||
self.drvr.vif_driver.get_config(
|
||||
instance, network_info[0],
|
||||
mox.IsA(objects.ImageMeta),
|
||||
mox.IsA(objects.Flavor),
|
||||
CONF.libvirt.virt_type,
|
||||
self.drvr._host).AndReturn(expected)
|
||||
domain.attachDeviceFlags(expected.to_xml(), flags=expected_flags)
|
||||
elif method == 'detach_interface':
|
||||
expected = vconfig.LibvirtConfigGuestInterface()
|
||||
expected.parse_str("""
|
||||
<interface type='bridge'>
|
||||
<mac address='52:54:00:f6:35:8f'/>
|
||||
<model type='virtio'/>
|
||||
<source bridge='br0'/>
|
||||
<target dev='tap12345678'/>
|
||||
</interface>""")
|
||||
self.mox.StubOutWithMock(self.drvr.vif_driver,
|
||||
'get_config')
|
||||
self.drvr.vif_driver.get_config(
|
||||
instance, network_info[0],
|
||||
mox.IsA(objects.ImageMeta),
|
||||
mox.IsA(objects.Flavor),
|
||||
CONF.libvirt.virt_type,
|
||||
self.drvr._host).AndReturn(expected)
|
||||
domain.detachDeviceFlags("""
|
||||
<interface type='bridge'>
|
||||
<mac address='52:54:00:f6:35:8f'/>
|
||||
<model type='virtio'/>
|
||||
<source bridge='br0'/>
|
||||
<target dev='tap12345678'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00'
|
||||
slot='0x03' function='0x0'/>
|
||||
</interface>""", expected_flags)
|
||||
self.drvr.firewall_driver.setup_basic_filtering(
|
||||
instance, [network_info[0]])
|
||||
fake_image_meta = objects.ImageMeta.from_dict(
|
||||
{'id': instance.image_ref})
|
||||
expected = self.drvr.vif_driver.get_config(
|
||||
instance, network_info[0], fake_image_meta, instance.flavor,
|
||||
CONF.libvirt.virt_type, self.drvr._host)
|
||||
self.mox.StubOutWithMock(self.drvr.vif_driver,
|
||||
'get_config')
|
||||
self.drvr.vif_driver.get_config(
|
||||
instance, network_info[0],
|
||||
mox.IsA(objects.ImageMeta),
|
||||
mox.IsA(objects.Flavor),
|
||||
CONF.libvirt.virt_type,
|
||||
self.drvr._host).AndReturn(expected)
|
||||
domain.attachDeviceFlags(expected.to_xml(), flags=expected_flags)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
if method == 'attach_interface':
|
||||
self.drvr.attach_interface(
|
||||
instance, fake_image_meta, network_info[0])
|
||||
elif method == 'detach_interface':
|
||||
self.drvr.detach_interface(
|
||||
instance, network_info[0])
|
||||
self.drvr.attach_interface(
|
||||
instance, fake_image_meta, network_info[0])
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_attach_interface_with_running_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'attach_interface', power_state.RUNNING,
|
||||
self._test_attach_interface(
|
||||
power_state.RUNNING,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
|
||||
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
|
||||
|
||||
def test_attach_interface_with_pause_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'attach_interface', power_state.PAUSED,
|
||||
self._test_attach_interface(
|
||||
power_state.PAUSED,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
|
||||
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
|
||||
|
||||
def test_attach_interface_with_shutdown_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'attach_interface', power_state.SHUTDOWN,
|
||||
self._test_attach_interface(
|
||||
power_state.SHUTDOWN,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG))
|
||||
|
||||
def _test_detach_interface(self, power_state, expected_flags):
|
||||
# setup some mocks
|
||||
instance = self._create_instance()
|
||||
network_info = _fake_network_info(self, 1)
|
||||
domain = FakeVirtDomain(fake_xml="""
|
||||
<domain type='kvm'>
|
||||
<devices>
|
||||
<interface type='bridge'>
|
||||
<mac address='52:54:00:f6:35:8f'/>
|
||||
<model type='virtio'/>
|
||||
<source bridge='br0'/>
|
||||
<target dev='tap12345678'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00'
|
||||
slot='0x03' function='0x0'/>
|
||||
</interface>
|
||||
</devices>
|
||||
</domain>""",
|
||||
info=[power_state, 1, 2, 3, 4])
|
||||
guest = libvirt_guest.Guest(domain)
|
||||
|
||||
expected_cfg = vconfig.LibvirtConfigGuestInterface()
|
||||
expected_cfg.parse_str("""
|
||||
<interface type='bridge'>
|
||||
<mac address='52:54:00:f6:35:8f'/>
|
||||
<model type='virtio'/>
|
||||
<source bridge='br0'/>
|
||||
<target dev='tap12345678'/>
|
||||
</interface>""")
|
||||
|
||||
with test.nested(
|
||||
mock.patch.object(host.Host, 'get_guest', return_value=guest),
|
||||
mock.patch.object(self.drvr.vif_driver, 'get_config',
|
||||
return_value=expected_cfg),
|
||||
mock.patch.object(domain, 'detachDeviceFlags')
|
||||
) as (
|
||||
mock_get_guest, mock_get_config, mock_detach_device_flags
|
||||
):
|
||||
# run the detach method
|
||||
self.drvr.detach_interface(instance, network_info[0])
|
||||
|
||||
# make our assertions
|
||||
mock_get_guest.assert_called_once_with(instance)
|
||||
mock_get_config.assert_called_once_with(
|
||||
instance, network_info[0], test.MatchType(objects.ImageMeta),
|
||||
test.MatchType(objects.Flavor), CONF.libvirt.virt_type,
|
||||
self.drvr._host)
|
||||
mock_detach_device_flags.assert_called_once_with(
|
||||
expected_cfg.to_xml(), flags=expected_flags)
|
||||
|
||||
def test_detach_interface_with_running_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'detach_interface', power_state.RUNNING,
|
||||
self._test_detach_interface(
|
||||
power_state.RUNNING,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
|
||||
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
|
||||
|
||||
def test_detach_interface_with_pause_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'detach_interface', power_state.PAUSED,
|
||||
self._test_detach_interface(
|
||||
power_state.PAUSED,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
|
||||
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
|
||||
|
||||
def test_detach_interface_with_shutdown_instance(self):
|
||||
self._test_attach_detach_interface(
|
||||
'detach_interface', power_state.SHUTDOWN,
|
||||
self._test_detach_interface(
|
||||
power_state.SHUTDOWN,
|
||||
expected_flags=(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG))
|
||||
|
||||
@mock.patch('nova.virt.libvirt.driver.LOG')
|
||||
|
@ -16701,7 +16720,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
|
|||
self.mox.StubOutWithMock(host.Host, 'get_domain')
|
||||
self.mox.StubOutWithMock(self.drvr.firewall_driver,
|
||||
'setup_basic_filtering')
|
||||
self.mox.StubOutWithMock(domain, 'attachDeviceFlags')
|
||||
self.mox.StubOutWithMock(domain, 'detachDeviceFlags')
|
||||
self.mox.StubOutWithMock(domain, 'info')
|
||||
|
||||
host.Host.get_domain(instance).AndReturn(domain)
|
||||
|
@ -16723,15 +16742,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase):
|
|||
self.drvr._host).AndReturn(expected)
|
||||
expected_flags = (fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
|
||||
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE)
|
||||
domain.detachDeviceFlags("""
|
||||
<interface type='bridge'>
|
||||
<mac address='52:54:00:f6:35:8f'/>
|
||||
<model type='virtio'/>
|
||||
<source bridge='br0'/>
|
||||
<target dev='tap12345678'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00'
|
||||
slot='0x03' function='0x0'/>
|
||||
</interface>""", expected_flags)
|
||||
domain.detachDeviceFlags(expected.to_xml(), flags=expected_flags)
|
||||
self.mox.ReplayAll()
|
||||
self.drvr.detach_interface(instance, network_info[0])
|
||||
self.mox.VerifyAll()
|
||||
|
|
Loading…
Reference in New Issue