nova/nova/tests/unit/virt/libvirt/test_designer.py
Sean Mooney 127dd738c0 add mtu to libvirt xml for ethernet and bridge types
Where libvirt is creating the tap device e.g: OVS bridge
(hybrid=False). os-vif will just ensure that the OVS bridge exists. We
want libvirt to create the tap, configure the MTU and then plug the
tap into the right bridge.

- This change adds the mtu element to libvirt guest
  interface xml for vifs of type ethernet and bridge.
- This change adds a libvirt version check
  to enable setting the interface mtu on hosts with
  libvirt 3.3.0+

Conflicts:
        nova/virt/libvirt/vif.py

NOTE(lyarwood): This conflict is due to the removal of IVS plug/unplug
via dIcf948f6ee1c0da2327fb5eac61fec6e89ac30531 during Rocky, resulting
in the eventual master change having to reintroduce get_config_bridge
that is already present in stable/queens.

Change-Id: Iecc265fb25e88fa00a66f1fd38e215cad53e7669
Partial-bug: #1747496
(cherry picked from commit f02b380005)
2018-07-04 17:33:26 +01:00

187 lines
9.1 KiB
Python

# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import mock
from nova.pci import utils as pci_utils
from nova import test
from nova.tests.unit import matchers
from nova.virt.libvirt import config
from nova.virt.libvirt import designer
class DesignerTestCase(test.NoDBTestCase):
def test_set_vif_bandwidth_config_no_extra_specs(self):
# Test whether test_set_vif_bandwidth_config_no_extra_specs fails when
# its second parameter has no 'extra_specs' field.
try:
# The conf will never be user be used, so we can use 'None'.
# An empty dictionary is fine: all that matters it that there is no
# 'extra_specs' field.
designer.set_vif_bandwidth_config(None, {})
except KeyError as e:
self.fail('KeyError: %s' % e)
def test_set_vif_guest_frontend_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_guest_frontend_config(conf, 'fake-mac',
'fake-model', 'fake-driver',
'fake-queues')
self.assertEqual('fake-mac', conf.mac_addr)
self.assertEqual('fake-model', conf.model)
self.assertEqual('fake-driver', conf.driver_name)
self.assertEqual('fake-queues', conf.vhost_queues)
def test_set_vif_host_backend_bridge_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_bridge_config(conf, 'fake-bridge',
'fake-tap')
self.assertEqual('bridge', conf.net_type)
self.assertEqual('fake-bridge', conf.source_dev)
self.assertEqual('fake-tap', conf.target_dev)
def test_set_vif_host_backend_ethernet_config_libvirt_1_3_3(self):
conf = config.LibvirtConfigGuestInterface()
mock_host = mock.Mock(autospec='nova.virt.libvirt.host.Host')
mock_host.has_min_version.return_value = True
designer.set_vif_host_backend_ethernet_config(
conf, 'fake-tap', mock_host)
self.assertEqual('ethernet', conf.net_type)
self.assertEqual('fake-tap', conf.target_dev)
self.assertIsNone(conf.script)
def test_set_vif_host_backend_ethernet_config_libvirt_pre_1_3_3(self):
conf = config.LibvirtConfigGuestInterface()
mock_host = mock.Mock(autospec='nova.virt.libvirt.host.Host')
mock_host.has_min_version.return_value = False
designer.set_vif_host_backend_ethernet_config(
conf, 'fake-tap', mock_host)
self.assertEqual('ethernet', conf.net_type)
self.assertEqual('fake-tap', conf.target_dev)
self.assertEqual('', conf.script)
def test_set_vif_host_backend_802qbg_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_802qbg_config(conf, 'fake-devname',
'fake-managerid',
'fake-typeid',
'fake-typeidversion',
'fake-instanceid',
'fake-tap')
self.assertEqual('direct', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertEqual('vepa', conf.source_mode)
self.assertEqual('802.1Qbg', conf.vporttype)
expected = [{'key': 'managerid', 'value': 'fake-managerid'},
{'key': 'typeid', 'value': 'fake-typeid'},
{'key': 'typeidversion', 'value': 'fake-typeidversion'},
{'key': 'instanceid', 'value': 'fake-instanceid'}]
self.assertThat(expected, matchers.DictListMatches(conf.vportparams))
self.assertEqual('fake-tap', conf.target_dev)
@mock.patch.object(pci_utils, 'get_ifname_by_pci_address',
return_value='fake-devname')
def test_set_vif_host_backend_802qbh_config_direct(self,
mock_pci):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_802qbh_config(conf, 'direct',
'fake-pci-dev',
'fake-profileid',
'fake-tap')
self.assertEqual('direct', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertEqual('passthrough', conf.source_mode)
self.assertEqual('vhost', conf.driver_name)
mock_pci.assert_called_with('fake-pci-dev')
self.assertEqual('802.1Qbh', conf.vporttype)
self.assertEqual('fake-tap', conf.target_dev)
def test_set_vif_host_backend_802qbh_config_hostdev(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_802qbh_config(conf, 'hostdev',
'fake-devname',
'fake-profileid',
'fake-tap')
self.assertEqual('hostdev', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertIsNone(conf.model)
self.assertEqual('802.1Qbh', conf.vporttype)
self.assertEqual('fake-tap', conf.target_dev)
@mock.patch.object(pci_utils, 'get_ifname_by_pci_address',
return_value='fake-devname')
def test_set_vif_host_backend_hw_veb_direct(self,
mock_pci):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_hw_veb(conf, 'direct',
'fake-pci-dev',
'fake-vlan',
'fake-tap')
self.assertEqual('direct', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertEqual('passthrough', conf.source_mode)
self.assertEqual('vhost', conf.driver_name)
self.assertEqual('fake-tap', conf.target_dev)
mock_pci.assert_called_with('fake-pci-dev')
def test_set_vif_host_backend_hw_veb_hostdev(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_hw_veb(conf, 'hostdev',
'fake-devname',
'fake-vlan',
'fake-tap')
self.assertEqual('hostdev', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertIsNone(conf.model)
self.assertEqual('fake-vlan', conf.vlan)
self.assertEqual('fake-tap', conf.target_dev)
@mock.patch.object(pci_utils, 'get_pci_address_fields',
return_value=('fake-domain', 'fake-bus',
'fake-slot', 'fake-function'))
def test_set_vif_host_backend_hostdev_pci_config(self, mock_pci_fields):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_hostdev_pci_config(conf,
'fake-pci-slot')
self.assertEqual('fake-domain', conf.domain)
self.assertEqual('fake-bus', conf.bus)
self.assertEqual('fake-slot', conf.slot)
self.assertEqual('fake-function', conf.function)
mock_pci_fields.assert_called_with('fake-pci-slot')
def test_set_vif_host_backend_direct_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_direct_config(conf, 'fake-devname',
mode="passthrough")
self.assertEqual('direct', conf.net_type)
self.assertEqual('fake-devname', conf.source_dev)
self.assertEqual('passthrough', conf.source_mode)
self.assertEqual('virtio', conf.model)
def test_set_vif_host_backend_vhostuser_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_host_backend_vhostuser_config(conf, 'fake-mode',
'fake-path')
self.assertEqual('vhostuser', conf.net_type)
self.assertEqual('unix', conf.vhostuser_type)
self.assertEqual('fake-mode', conf.vhostuser_mode)
self.assertEqual('fake-path', conf.vhostuser_path)
def test_set_vif_mtu_config(self):
conf = config.LibvirtConfigGuestInterface()
designer.set_vif_mtu_config(conf, 9000)
self.assertEqual(9000, conf.mtu)