From 1ecd71b08d14450e475dc9512d40828da6fcfe15 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Thu, 9 Feb 2017 18:41:11 -0500 Subject: [PATCH] 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. Change-Id: I6d9a975876c5652ef544c587f65b1bdd1543848b Related-Bug: #1607714 --- nova/tests/unit/virt/libvirt/test_driver.py | 163 +++++++++++--------- 1 file changed, 87 insertions(+), 76 deletions(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 874d6b553c9b..7ebf2e48ee82 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -375,14 +375,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 = uuids.fake 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: @@ -16545,8 +16547,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase): self._test_inject_data(instance, injection_info, "/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=""" @@ -16571,91 +16572,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(""" - - - - - - """) - 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(""" - - - - - -
- """, 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( - self.context, instance, fake_image_meta, network_info[0]) - elif method == 'detach_interface': - self.drvr.detach_interface( - self.context, instance, network_info[0]) + self.drvr.attach_interface( + self.context, 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=""" + + + + + + + +
+ + + """, + info=[power_state, 1, 2, 3, 4]) + guest = libvirt_guest.Guest(domain) + + expected_cfg = vconfig.LibvirtConfigGuestInterface() + expected_cfg.parse_str(""" + + + + + + """) + + 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(self.context, 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') @@ -16707,7 +16726,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) @@ -16729,15 +16748,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase): self.drvr._host).AndReturn(expected) expected_flags = (fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG | fakelibvirt.VIR_DOMAIN_AFFECT_LIVE) - domain.detachDeviceFlags(""" - - - - - -
- """, expected_flags) + domain.detachDeviceFlags(expected.to_xml(), flags=expected_flags) self.mox.ReplayAll() self.drvr.detach_interface(self.context, instance, network_info[0]) self.mox.VerifyAll()