diff options
Diffstat (limited to 'nova/tests/virt/libvirt/test_vif.py')
-rw-r--r-- | nova/tests/virt/libvirt/test_vif.py | 959 |
1 files changed, 0 insertions, 959 deletions
diff --git a/nova/tests/virt/libvirt/test_vif.py b/nova/tests/virt/libvirt/test_vif.py deleted file mode 100644 index 256ca58046..0000000000 --- a/nova/tests/virt/libvirt/test_vif.py +++ /dev/null @@ -1,959 +0,0 @@ -# Copyright 2012 Nicira, Inc -# -# 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 contextlib - -from lxml import etree -import mock -from oslo.concurrency import processutils -from oslo.config import cfg - -from nova import exception -from nova.network import linux_net -from nova.network import model as network_model -from nova import test -from nova.tests.virt.libvirt import fakelibvirt -from nova import utils -from nova.virt.libvirt import config as vconfig -from nova.virt.libvirt import vif - -CONF = cfg.CONF - - -class LibvirtVifTestCase(test.NoDBTestCase): - - gateway_bridge_4 = network_model.IP(address='101.168.1.1', type='gateway') - dns_bridge_4 = network_model.IP(address='8.8.8.8', type=None) - ips_bridge_4 = [network_model.IP(address='101.168.1.9', type=None)] - subnet_bridge_4 = network_model.Subnet(cidr='101.168.1.0/24', - dns=[dns_bridge_4], - gateway=gateway_bridge_4, - routes=None, - dhcp_server='191.168.1.1') - - gateway_bridge_6 = network_model.IP(address='101:1db9::1', type='gateway') - subnet_bridge_6 = network_model.Subnet(cidr='101:1db9::/64', - dns=None, - gateway=gateway_bridge_6, - ips=None, - routes=None) - - network_bridge = network_model.Network(id='network-id-xxx-yyy-zzz', - bridge='br0', - label=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - bridge_interface='eth0', - vlan=99) - - vif_bridge = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_bridge, - type=network_model.VIF_TYPE_BRIDGE, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid=None) - - network_bridge_neutron = network_model.Network(id='network-id-xxx-yyy-zzz', - bridge=None, - label=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - bridge_interface='eth0', - vlan=99) - - vif_bridge_neutron = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_bridge_neutron, - type=None, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - network_ovs = network_model.Network(id='network-id-xxx-yyy-zzz', - bridge='br0', - label=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - bridge_interface=None, - vlan=99) - - network_ivs = network_model.Network(id='network-id-xxx-yyy-zzz', - bridge='br0', - label=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - bridge_interface=None, - vlan=99) - - vif_ovs = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ovs, - type=network_model.VIF_TYPE_OVS, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_ovs_hybrid = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ovs, - type=network_model.VIF_TYPE_OVS, - details={'ovs_hybrid_plug': True, - 'port_filter': True}, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_ovs_filter_cap = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ovs, - type=network_model.VIF_TYPE_OVS, - details={'port_filter': True}, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_ovs_legacy = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ovs, - type=None, - devname=None, - ovs_interfaceid=None) - - vif_ivs = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ivs, - type=network_model.VIF_TYPE_IVS, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_ivs_legacy = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ovs, - type=None, - devname=None, - ovs_interfaceid='aaa') - - vif_ivs_filter_direct = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ivs, - type=network_model.VIF_TYPE_IVS, - details={'port_filter': True}, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_ivs_filter_hybrid = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_ivs, - type=network_model.VIF_TYPE_IVS, - details={ - 'port_filter': True, - 'ovs_hybrid_plug': True}, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid='aaa-bbb-ccc') - - vif_none = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_bridge, - type=None, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid=None) - - network_8021 = network_model.Network(id='network-id-xxx-yyy-zzz', - bridge=None, - label=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - interface='eth0', - vlan=99) - - vif_8021qbh = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_8021, - type=network_model.VIF_TYPE_802_QBH, - vnic_type=network_model.VNIC_TYPE_DIRECT, - ovs_interfaceid=None, - details={ - network_model.VIF_DETAILS_PROFILEID: - 'MyPortProfile'}, - profile={'pci_vendor_info': '1137:0043', - 'pci_slot': '0000:0a:00.1', - 'physical_network': 'phynet1'}) - - vif_hw_veb = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_8021, - type=network_model.VIF_TYPE_HW_VEB, - vnic_type=network_model.VNIC_TYPE_DIRECT, - ovs_interfaceid=None, - details={ - network_model.VIF_DETAILS_VLAN: '100'}, - profile={'pci_vendor_info': '1137:0043', - 'pci_slot': '0000:0a:00.1', - 'physical_network': 'phynet1'}) - - vif_8021qbg = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_8021, - type=network_model.VIF_TYPE_802_QBG, - ovs_interfaceid=None, - qbg_params=network_model.VIF8021QbgParams( - managerid="xxx-yyy-zzz", - typeid="aaa-bbb-ccc", - typeidversion="1", - instanceid="ddd-eee-fff")) - - network_mlnx = network_model.Network(id='network-id-xxx-yyy-zzz', - label=None, - bridge=None, - subnets=[subnet_bridge_4, - subnet_bridge_6], - interface='eth0') - - network_midonet = network_model.Network(id='network-id-xxx-yyy-zzz', - label=None, - bridge=None, - subnets=[subnet_bridge_4], - interface='eth0') - - vif_mlnx = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_mlnx, - type=network_model.VIF_TYPE_MLNX_DIRECT, - devname='tap-xxx-yyy-zzz') - - vif_mlnx_net = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_mlnx, - type=network_model.VIF_TYPE_MLNX_DIRECT, - details={'physical_network': - 'fake_phy_network'}, - devname='tap-xxx-yyy-zzz') - - vif_midonet = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_midonet, - type=network_model.VIF_TYPE_MIDONET, - devname='tap-xxx-yyy-zzz') - - vif_iovisor = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=network_bridge, - type=network_model.VIF_TYPE_IOVISOR, - devname='tap-xxx-yyy-zzz', - ovs_interfaceid=None) - - instance = { - 'name': 'instance-name', - 'uuid': 'instance-uuid' - } - - bandwidth = { - 'quota:vif_inbound_peak': '200', - 'quota:vif_outbound_peak': '20', - 'quota:vif_inbound_average': '100', - 'quota:vif_outbound_average': '10', - 'quota:vif_inbound_burst': '300', - 'quota:vif_outbound_burst': '30' - } - - def setUp(self): - super(LibvirtVifTestCase, self).setUp() - self.flags(allow_same_net_traffic=True) - self.executes = [] - - def fake_execute(*cmd, **kwargs): - self.executes.append(cmd) - return None, None - - self.stubs.Set(utils, 'execute', fake_execute) - - def _get_conn(self, uri="qemu:///session", ver=None): - def __inner(): - if ver is None: - return fakelibvirt.Connection(uri, False) - else: - return fakelibvirt.Connection(uri, False, ver) - return __inner - - def _get_node(self, xml): - doc = etree.fromstring(xml) - ret = doc.findall('./devices/interface') - self.assertEqual(len(ret), 1) - return ret[0] - - def _assertMacEquals(self, node, vif): - mac = node.find("mac").get("address") - self.assertEqual(mac, vif['address']) - - def _assertTypeEquals(self, node, type, attr, source, br_want, - prefix=None): - self.assertEqual(node.get("type"), type) - br_name = node.find(attr).get(source) - if prefix is None: - self.assertEqual(br_name, br_want) - else: - self.assertTrue(br_name.startswith(prefix)) - - def _assertTypeAndMacEquals(self, node, type, attr, source, vif, - br_want=None, size=0, prefix=None): - ret = node.findall("filterref") - self.assertEqual(len(ret), size) - self._assertTypeEquals(node, type, attr, source, br_want, - prefix) - self._assertMacEquals(node, vif) - - def _assertModel(self, xml, model_want=None, driver_want=None): - node = self._get_node(xml) - if model_want is None: - ret = node.findall("model") - self.assertEqual(len(ret), 0) - else: - model = node.find("model").get("type") - self.assertEqual(model, model_want) - if driver_want is None: - ret = node.findall("driver") - self.assertEqual(len(ret), 0) - else: - driver = node.find("driver").get("name") - self.assertEqual(driver, driver_want) - - def _assertTypeAndPciEquals(self, node, type, vif): - self.assertEqual(node.get("type"), type) - address = node.find("source").find("address") - addr_type = address.get("type") - self.assertEqual("pci", addr_type) - pci_slot = "%(domain)s:%(bus)s:%(slot)s.%(func)s" % { - 'domain': address.get("domain")[2:], - 'bus': address.get("bus")[2:], - 'slot': address.get("slot")[2:], - 'func': address.get("function")[2:]} - - pci_slot_want = vif['profile']['pci_slot'] - self.assertEqual(pci_slot, pci_slot_want) - - def _get_conf(self): - conf = vconfig.LibvirtConfigGuest() - conf.virt_type = "qemu" - conf.name = "fake-name" - conf.uuid = "fake-uuid" - conf.memory = 100 * 1024 - conf.vcpus = 4 - return conf - - def _get_instance_xml(self, driver, vif, image_meta=None): - default_inst_type = { - 'memory_mb': 128, 'root_gb': 0, 'deleted_at': None, - 'name': 'm1.micro', 'deleted': 0, 'created_at': None, - 'ephemeral_gb': 0, 'updated_at': None, - 'disabled': False, 'vcpus': 1, - 'swap': 0, 'rxtx_factor': 1.0, 'is_public': True, - 'flavorid': '1', 'vcpu_weight': None, 'id': 2, - 'extra_specs': dict(self.bandwidth) - } - conf = self._get_conf() - nic = driver.get_config(self.instance, vif, image_meta, - default_inst_type, CONF.libvirt.virt_type) - conf.add_device(nic) - return conf.to_xml() - - def test_multiple_nics(self): - conf = self._get_conf() - # Tests multiple nic configuration and that target_dev is - # set for each - nics = [{'net_type': 'bridge', - 'mac_addr': '00:00:00:00:00:0b', - 'source_dev': 'b_source_dev', - 'target_dev': 'b_target_dev'}, - {'net_type': 'ethernet', - 'mac_addr': '00:00:00:00:00:0e', - 'source_dev': 'e_source_dev', - 'target_dev': 'e_target_dev'}, - {'net_type': 'direct', - 'mac_addr': '00:00:00:00:00:0d', - 'source_dev': 'd_source_dev', - 'target_dev': 'd_target_dev'}] - - for nic in nics: - nic_conf = vconfig.LibvirtConfigGuestInterface() - nic_conf.net_type = nic['net_type'] - nic_conf.target_dev = nic['target_dev'] - nic_conf.mac_addr = nic['mac_addr'] - nic_conf.source_dev = nic['source_dev'] - conf.add_device(nic_conf) - - xml = conf.to_xml() - doc = etree.fromstring(xml) - for nic in nics: - path = "./devices/interface/[@type='%s']" % nic['net_type'] - node = doc.find(path) - self.assertEqual(nic['net_type'], node.get("type")) - self.assertEqual(nic['mac_addr'], - node.find("mac").get("address")) - self.assertEqual(nic['target_dev'], - node.find("target").get("dev")) - - def test_model_novirtio(self): - self.flags(use_virtio_for_bridges=False, - virt_type='kvm', - group='libvirt') - - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, self.vif_bridge) - self._assertModel(xml) - - def test_model_kvm(self): - self.flags(use_virtio_for_bridges=True, - virt_type='kvm', - group='libvirt') - - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, self.vif_bridge) - self._assertModel(xml, network_model.VIF_MODEL_VIRTIO) - - def test_model_kvm_qemu_custom(self): - for virt in ('kvm', 'qemu'): - self.flags(use_virtio_for_bridges=True, - virt_type=virt, - group='libvirt') - - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - supported = (network_model.VIF_MODEL_NE2K_PCI, - network_model.VIF_MODEL_PCNET, - network_model.VIF_MODEL_RTL8139, - network_model.VIF_MODEL_E1000, - network_model.VIF_MODEL_SPAPR_VLAN) - for model in supported: - image_meta = {'properties': {'hw_vif_model': model}} - xml = self._get_instance_xml(d, self.vif_bridge, - image_meta) - self._assertModel(xml, model) - - def test_model_kvm_bogus(self): - self.flags(use_virtio_for_bridges=True, - virt_type='kvm', - group='libvirt') - - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - image_meta = {'properties': {'hw_vif_model': 'acme'}} - self.assertRaises(exception.UnsupportedHardware, - self._get_instance_xml, - d, - self.vif_bridge, - image_meta) - - def _test_model_qemu(self, *vif_objs, **kw): - libvirt_version = kw.get('libvirt_version') - self.flags(use_virtio_for_bridges=True, - virt_type='qemu', - group='libvirt') - - for vif_obj in vif_objs: - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - if libvirt_version is not None: - d.libvirt_version = libvirt_version - - xml = self._get_instance_xml(d, vif_obj) - - doc = etree.fromstring(xml) - - bandwidth = doc.find('./devices/interface/bandwidth') - self.assertNotEqual(bandwidth, None) - - inbound = bandwidth.find('inbound') - self.assertEqual(inbound.get("average"), - self.bandwidth['quota:vif_inbound_average']) - self.assertEqual(inbound.get("peak"), - self.bandwidth['quota:vif_inbound_peak']) - self.assertEqual(inbound.get("burst"), - self.bandwidth['quota:vif_inbound_burst']) - - outbound = bandwidth.find('outbound') - self.assertEqual(outbound.get("average"), - self.bandwidth['quota:vif_outbound_average']) - self.assertEqual(outbound.get("peak"), - self.bandwidth['quota:vif_outbound_peak']) - self.assertEqual(outbound.get("burst"), - self.bandwidth['quota:vif_outbound_burst']) - - self._assertModel(xml, network_model.VIF_MODEL_VIRTIO, "qemu") - - def test_model_qemu_no_firewall(self): - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - self._test_model_qemu( - self.vif_bridge, - self.vif_8021qbg, - self.vif_iovisor, - self.vif_mlnx, - self.vif_ovs, - ) - - def test_model_qemu_iptables(self): - self.flags(firewall_driver="nova.virt.firewall.IptablesFirewallDriver") - self._test_model_qemu( - self.vif_bridge, - self.vif_ovs, - self.vif_ivs, - self.vif_8021qbg, - self.vif_iovisor, - self.vif_mlnx, - ) - - def test_model_xen(self): - self.flags(use_virtio_for_bridges=True, - virt_type='xen', - group='libvirt') - - d = vif.LibvirtGenericVIFDriver(self._get_conn("xen:///system")) - xml = self._get_instance_xml(d, self.vif_bridge) - self._assertModel(xml) - - def test_generic_driver_none(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - self.assertRaises(exception.NovaException, - self._get_instance_xml, - d, - self.vif_none) - - def _check_bridge_driver(self, d, vif, br_want): - xml = self._get_instance_xml(d, vif) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - self.vif_bridge, br_want, 1) - - def test_generic_driver_bridge(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - self._check_bridge_driver(d, - self.vif_bridge, - self.vif_bridge['network']['bridge']) - - def _check_ivs_ethernet_driver(self, d, vif, dev_prefix): - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, vif) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", - self.vif_ivs, prefix=dev_prefix) - script = node.find("script").get("path") - self.assertEqual(script, "") - - def test_unplug_ivs_ethernet(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - with mock.patch.object(linux_net, 'delete_ivs_vif_port') as delete: - delete.side_effect = processutils.ProcessExecutionError - d.unplug_ivs_ethernet(None, self.vif_ovs) - - def test_plug_ovs_hybrid(self): - calls = { - 'device_exists': [mock.call('qbrvif-xxx-yyy'), - mock.call('qvovif-xxx-yyy')], - '_create_veth_pair': [mock.call('qvbvif-xxx-yyy', - 'qvovif-xxx-yyy')], - 'execute': [mock.call('brctl', 'addbr', 'qbrvif-xxx-yyy', - run_as_root=True), - mock.call('brctl', 'setfd', 'qbrvif-xxx-yyy', 0, - run_as_root=True), - mock.call('brctl', 'stp', 'qbrvif-xxx-yyy', 'off', - run_as_root=True), - mock.call('tee', ('/sys/class/net/qbrvif-xxx-yyy' - '/bridge/multicast_snooping'), - process_input='0', run_as_root=True, - check_exit_code=[0, 1]), - mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'up', - run_as_root=True), - mock.call('brctl', 'addif', 'qbrvif-xxx-yyy', - 'qvbvif-xxx-yyy', run_as_root=True)], - 'create_ovs_vif_port': [mock.call('br0', - 'qvovif-xxx-yyy', 'aaa-bbb-ccc', - 'ca:fe:de:ad:be:ef', - 'instance-uuid')] - } - with contextlib.nested( - mock.patch.object(linux_net, 'device_exists', - return_value=False), - mock.patch.object(utils, 'execute'), - mock.patch.object(linux_net, '_create_veth_pair'), - mock.patch.object(linux_net, 'create_ovs_vif_port') - ) as (device_exists, execute, _create_veth_pair, create_ovs_vif_port): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - d.plug_ovs_hybrid(self.instance, self.vif_ovs) - device_exists.assert_has_calls(calls['device_exists']) - _create_veth_pair.assert_has_calls(calls['_create_veth_pair']) - execute.assert_has_calls(calls['execute']) - create_ovs_vif_port.assert_has_calls(calls['create_ovs_vif_port']) - - def test_unplug_ovs_hybrid(self): - calls = { - 'device_exists': [mock.call('qbrvif-xxx-yyy')], - 'execute': [mock.call('brctl', 'delif', 'qbrvif-xxx-yyy', - 'qvbvif-xxx-yyy', run_as_root=True), - mock.call('ip', 'link', 'set', - 'qbrvif-xxx-yyy', 'down', run_as_root=True), - mock.call('brctl', 'delbr', - 'qbrvif-xxx-yyy', run_as_root=True)], - 'delete_ovs_vif_port': [mock.call('br0', 'qvovif-xxx-yyy')] - } - with contextlib.nested( - mock.patch.object(linux_net, 'device_exists', - return_value=True), - mock.patch.object(utils, 'execute'), - mock.patch.object(linux_net, 'delete_ovs_vif_port') - ) as (device_exists, execute, delete_ovs_vif_port): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - d.unplug_ovs_hybrid(None, self.vif_ovs) - device_exists.assert_has_calls(calls['device_exists']) - execute.assert_has_calls(calls['execute']) - delete_ovs_vif_port.assert_has_calls(calls['delete_ovs_vif_port']) - - def test_unplug_ovs_hybrid_bridge_does_not_exist(self): - calls = { - 'device_exists': [mock.call('qbrvif-xxx-yyy')], - 'delete_ovs_vif_port': [mock.call('br0', 'qvovif-xxx-yyy')] - } - with contextlib.nested( - mock.patch.object(linux_net, 'device_exists', - return_value=False), - mock.patch.object(linux_net, 'delete_ovs_vif_port') - ) as (device_exists, delete_ovs_vif_port): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - d.unplug_ovs_hybrid(None, self.vif_ovs) - device_exists.assert_has_calls(calls['device_exists']) - delete_ovs_vif_port.assert_has_calls(calls['delete_ovs_vif_port']) - - def test_plug_ivs_hybrid(self): - calls = { - 'device_exists': [mock.call('qbrvif-xxx-yyy'), - mock.call('qvovif-xxx-yyy')], - '_create_veth_pair': [mock.call('qvbvif-xxx-yyy', - 'qvovif-xxx-yyy')], - 'execute': [mock.call('brctl', 'addbr', 'qbrvif-xxx-yyy', - run_as_root=True), - mock.call('brctl', 'setfd', 'qbrvif-xxx-yyy', 0, - run_as_root=True), - mock.call('brctl', 'stp', 'qbrvif-xxx-yyy', 'off', - run_as_root=True), - mock.call('tee', ('/sys/class/net/qbrvif-xxx-yyy' - '/bridge/multicast_snooping'), - process_input='0', run_as_root=True, - check_exit_code=[0, 1]), - mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'up', - run_as_root=True), - mock.call('brctl', 'addif', 'qbrvif-xxx-yyy', - 'qvbvif-xxx-yyy', run_as_root=True)], - 'create_ivs_vif_port': [mock.call('qvovif-xxx-yyy', 'aaa-bbb-ccc', - 'ca:fe:de:ad:be:ef', - 'instance-uuid')] - } - with contextlib.nested( - mock.patch.object(linux_net, 'device_exists', - return_value=False), - mock.patch.object(utils, 'execute'), - mock.patch.object(linux_net, '_create_veth_pair'), - mock.patch.object(linux_net, 'create_ivs_vif_port') - ) as (device_exists, execute, _create_veth_pair, create_ivs_vif_port): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - d.plug_ivs_hybrid(self.instance, self.vif_ivs) - device_exists.assert_has_calls(calls['device_exists']) - _create_veth_pair.assert_has_calls(calls['_create_veth_pair']) - execute.assert_has_calls(calls['execute']) - create_ivs_vif_port.assert_has_calls(calls['create_ivs_vif_port']) - - def test_unplug_ivs_hybrid(self): - calls = { - 'execute': [mock.call('brctl', 'delif', 'qbrvif-xxx-yyy', - 'qvbvif-xxx-yyy', run_as_root=True), - mock.call('ip', 'link', 'set', - 'qbrvif-xxx-yyy', 'down', run_as_root=True), - mock.call('brctl', 'delbr', - 'qbrvif-xxx-yyy', run_as_root=True)], - 'delete_ivs_vif_port': [mock.call('qvovif-xxx-yyy')] - } - with contextlib.nested( - mock.patch.object(utils, 'execute'), - mock.patch.object(linux_net, 'delete_ivs_vif_port') - ) as (execute, delete_ivs_vif_port): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - d.unplug_ivs_hybrid(None, self.vif_ivs) - execute.assert_has_calls(calls['execute']) - delete_ivs_vif_port.assert_has_calls(calls['delete_ivs_vif_port']) - - def test_unplug_ivs_hybrid_bridge_does_not_exist(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - execute.side_effect = processutils.ProcessExecutionError - d.unplug_ivs_hybrid(None, self.vif_ivs) - - def test_unplug_iovisor(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - execute.side_effect = processutils.ProcessExecutionError - mynetwork = network_model.Network(id='network-id-xxx-yyy-zzz', - label='mylabel') - myvif = network_model.VIF(id='vif-xxx-yyy-zzz', - address='ca:fe:de:ad:be:ef', - network=mynetwork) - d.unplug_iovisor(None, myvif) - - @mock.patch('nova.network.linux_net.device_exists') - def test_plug_iovisor(self, device_exists): - device_exists.return_value = True - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - execute.side_effect = processutils.ProcessExecutionError - instance = { - 'name': 'instance-name', - 'uuid': 'instance-uuid', - 'project_id': 'myproject' - } - d.plug_iovisor(instance, self.vif_ivs) - - def test_unplug_mlnx_with_details(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - execute.side_effect = processutils.ProcessExecutionError - d.unplug_mlnx_direct(None, self.vif_mlnx_net) - execute.assert_called_once_with('ebrctl', 'del-port', - 'fake_phy_network', - 'ca:fe:de:ad:be:ef', - run_as_root=True) - - def test_plug_mlnx_with_details(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - d.plug_mlnx_direct(self.instance, self.vif_mlnx_net) - execute.assert_called_once_with('ebrctl', 'add-port', - 'ca:fe:de:ad:be:ef', - 'instance-uuid', - 'fake_phy_network', - 'mlnx_direct', - 'eth-xxx-yyy-zzz', - run_as_root=True) - - def test_plug_mlnx_no_physical_network(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - with mock.patch.object(utils, 'execute') as execute: - self.assertRaises(exception.NovaException, - d.plug_mlnx_direct, - self.instance, - self.vif_mlnx) - self.assertEqual(0, execute.call_count) - - def test_ivs_ethernet_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) - self._check_ivs_ethernet_driver(d, - self.vif_ivs, - "tap") - - def _check_ivs_virtualport_driver(self, d, vif, want_iface_id): - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, vif) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", - vif, vif['devname']) - - def _check_ovs_virtualport_driver(self, d, vif, want_iface_id): - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, vif) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - vif, "br0") - vp = node.find("virtualport") - self.assertEqual(vp.get("type"), "openvswitch") - iface_id_found = False - for p_elem in vp.findall("parameters"): - iface_id = p_elem.get("interfaceid", None) - if iface_id: - self.assertEqual(iface_id, want_iface_id) - iface_id_found = True - - self.assertTrue(iface_id_found) - - def test_generic_ovs_virtualport_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9011)) - want_iface_id = self.vif_ovs['ovs_interfaceid'] - self._check_ovs_virtualport_driver(d, - self.vif_ovs, - want_iface_id) - - def test_generic_ivs_virtualport_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9011)) - want_iface_id = self.vif_ivs['ovs_interfaceid'] - self._check_ivs_virtualport_driver(d, - self.vif_ivs, - want_iface_id) - - def test_ivs_plug_with_nova_firewall(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = "qbr" + self.vif_ivs['id'] - br_want = br_want[:network_model.NIC_NAME_LEN] - xml = self._get_instance_xml(d, self.vif_ivs) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - self.vif_ivs, br_want, 1) - - def test_ivs_plug_with_port_filter_direct_no_nova_firewall(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = "qbr" + self.vif_ivs_filter_hybrid['id'] - br_want = br_want[:network_model.NIC_NAME_LEN] - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, self.vif_ivs_filter_hybrid) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - self.vif_ivs_filter_hybrid, br_want, 0) - - def test_ivs_plug_with_port_filter_hybrid_no_nova_firewall(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = self.vif_ivs_filter_direct['devname'] - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, self.vif_ivs_filter_direct) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", - self.vif_ivs_filter_direct, br_want, 0) - - def test_hybrid_plug_without_nova_firewall(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = "qbr" + self.vif_ovs_hybrid['id'] - br_want = br_want[:network_model.NIC_NAME_LEN] - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - xml = self._get_instance_xml(d, self.vif_ovs_hybrid) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - self.vif_ovs_hybrid, br_want, 0) - - def test_direct_plug_with_port_filter_cap_no_nova_firewall(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = self.vif_midonet['devname'] - xml = self._get_instance_xml(d, self.vif_ovs_filter_cap) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "target", "dev", - self.vif_ovs_filter_cap, br_want) - - def _check_neutron_hybrid_driver(self, d, vif, br_want): - self.flags(firewall_driver="nova.virt.firewall.IptablesFirewallDriver") - xml = self._get_instance_xml(d, vif) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", - vif, br_want, 1) - - def test_generic_hybrid_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = "qbr" + self.vif_ovs['id'] - br_want = br_want[:network_model.NIC_NAME_LEN] - self._check_neutron_hybrid_driver(d, - self.vif_ovs, - br_want) - - def test_ivs_hybrid_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - br_want = "qbr" + self.vif_ivs['id'] - br_want = br_want[:network_model.NIC_NAME_LEN] - self._check_neutron_hybrid_driver(d, - self.vif_ivs, - br_want) - - def test_mlnx_direct_vif_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, - self.vif_mlnx) - node = self._get_node(xml) - self.assertEqual(node.get("type"), "direct") - self._assertTypeEquals(node, "direct", "source", - "dev", "eth-xxx-yyy-zzz") - self._assertTypeEquals(node, "direct", "source", - "mode", "passthrough") - self._assertMacEquals(node, self.vif_mlnx) - self._assertModel(xml, network_model.VIF_MODEL_VIRTIO) - - def test_midonet_ethernet_vif_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - br_want = self.vif_midonet['devname'] - xml = self._get_instance_xml(d, self.vif_midonet) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", - self.vif_midonet, br_want) - - def test_generic_8021qbh_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, self.vif_8021qbh) - node = self._get_node(xml) - self._assertTypeAndPciEquals(node, "hostdev", self.vif_8021qbh) - self._assertMacEquals(node, self.vif_8021qbh) - vp = node.find("virtualport") - self.assertEqual(vp.get("type"), "802.1Qbh") - profile_id_found = False - for p_elem in vp.findall("parameters"): - details = self.vif_8021qbh["details"] - profile_id = p_elem.get("profileid", None) - if profile_id: - self.assertEqual(profile_id, - details[network_model.VIF_DETAILS_PROFILEID]) - profile_id_found = True - - self.assertTrue(profile_id_found) - - def test_hw_veb_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, self.vif_hw_veb) - node = self._get_node(xml) - self._assertTypeAndPciEquals(node, "hostdev", self.vif_hw_veb) - self._assertMacEquals(node, self.vif_hw_veb) - vlan = node.find("vlan").find("tag").get("id") - vlan_want = self.vif_hw_veb["details"]["vlan"] - self.assertEqual(vlan, vlan_want) - - def test_generic_iovisor_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") - br_want = self.vif_ivs['devname'] - xml = self._get_instance_xml(d, self.vif_ivs) - node = self._get_node(xml) - self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", - self.vif_ivs, br_want) - - def test_generic_8021qbg_driver(self): - d = vif.LibvirtGenericVIFDriver(self._get_conn()) - xml = self._get_instance_xml(d, self.vif_8021qbg) - - node = self._get_node(xml) - self._assertTypeEquals(node, "direct", "source", "dev", "eth0") - self._assertMacEquals(node, self.vif_8021qbg) - - vp = node.find("virtualport") - self.assertEqual(vp.get("type"), "802.1Qbg") - manager_id_found = False - type_id_found = False - typeversion_id_found = False - instance_id_found = False - for p_elem in vp.findall("parameters"): - wantparams = self.vif_8021qbg['qbg_params'] - manager_id = p_elem.get("managerid", None) - type_id = p_elem.get("typeid", None) - typeversion_id = p_elem.get("typeidversion", None) - instance_id = p_elem.get("instanceid", None) - if manager_id: - self.assertEqual(manager_id, - wantparams['managerid']) - manager_id_found = True - if type_id: - self.assertEqual(type_id, - wantparams['typeid']) - type_id_found = True - if typeversion_id: - self.assertEqual(typeversion_id, - wantparams['typeidversion']) - typeversion_id_found = True - if instance_id: - self.assertEqual(instance_id, - wantparams['instanceid']) - instance_id_found = True - - self.assertTrue(manager_id_found) - self.assertTrue(type_id_found) - self.assertTrue(typeversion_id_found) - self.assertTrue(instance_id_found) |