diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index ae914be033..50c1dcdceb 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -37,7 +37,6 @@ import six import nova.conf from nova import exception from nova.i18n import _ -from nova.network import model as network_model from nova import objects from nova.pci import utils as pci_utils from nova import utils @@ -1263,42 +1262,6 @@ def _ovs_vsctl(args): raise exception.OvsConfigurationFailure(inner_exception=e) -def _create_ovs_vif_cmd(bridge, dev, iface_id, mac, - instance_id, interface_type=None): - cmd = ['--', '--if-exists', 'del-port', dev, '--', - 'add-port', bridge, dev, - '--', 'set', 'Interface', dev, - 'external-ids:iface-id=%s' % iface_id, - 'external-ids:iface-status=active', - 'external-ids:attached-mac=%s' % mac, - 'external-ids:vm-uuid=%s' % instance_id] - if interface_type: - cmd += ['type=%s' % interface_type] - return cmd - - -def create_ovs_vif_port(bridge, dev, iface_id, mac, instance_id, - mtu=None, interface_type=None): - _ovs_vsctl(_create_ovs_vif_cmd(bridge, dev, iface_id, - mac, instance_id, - interface_type)) - # Note at present there is no support for setting the - # mtu for vhost-user type ports. - if interface_type != network_model.OVS_VHOSTUSER_INTERFACE_TYPE: - _set_device_mtu(dev, mtu) - else: - LOG.debug("MTU not set on %(interface_name)s interface " - "of type %(interface_type)s.", - {'interface_name': dev, - 'interface_type': interface_type}) - - -def delete_ovs_vif_port(bridge, dev, delete_dev=True): - _ovs_vsctl(['--', '--if-exists', 'del-port', bridge, dev]) - if delete_dev: - delete_net_dev(dev) - - def create_ivs_vif_port(dev, iface_id, mac, instance_id): utils.execute('ivs-ctl', 'add-port', dev, run_as_root=True) diff --git a/nova/network/model.py b/nova/network/model.py index 763e56d68d..ecbc2e512c 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -84,8 +84,6 @@ VIF_DETAILS_VHOSTUSER_FP_PLUG = 'vhostuser_fp_plug' # create a vrouter netdevice interface # TODO(mhenkel): Consider renaming this to be contrail-specific. VIF_DETAILS_VHOSTUSER_VROUTER_PLUG = 'vhostuser_vrouter_plug' -# ovs vhost user interface type name -OVS_VHOSTUSER_INTERFACE_TYPE = 'dpdkvhostuser' # Constants for dictionary keys in the 'vif_details' field that are # valid for VIF_TYPE_TAP. diff --git a/nova/tests/unit/network/test_linux_net.py b/nova/tests/unit/network/test_linux_net.py index 221882723b..992603330c 100644 --- a/nova/tests/unit/network/test_linux_net.py +++ b/nova/tests/unit/network/test_linux_net.py @@ -32,7 +32,6 @@ from nova import db from nova import exception from nova.network import driver from nova.network import linux_net -from nova.network import model as network_model from nova import objects from nova import test from nova.tests import uuidsentinel as uuids @@ -40,8 +39,6 @@ from nova import utils CONF = nova.conf.CONF -HOST = "testhost" - instances = {uuids.instance_1: {'id': 0, 'uuid': uuids.instance_1, @@ -123,31 +120,6 @@ networks = [{'id': 0, 'vpn_public_address': '192.168.1.2', 'mtu': None, 'enable_dhcp': True, - 'share_address': False}, - {'id': 2, - 'uuid': "cccccccc-cccc-cccc-cccc-cccccccccccc", - 'label': 'test2', - 'injected': False, - 'multi_host': True, - 'cidr': '192.168.2.0/24', - 'cidr_v6': '2001:db10::/64', - 'gateway_v6': '2001:db10::1', - 'netmask_v6': '64', - 'netmask': '255.255.255.0', - 'bridge': 'fa2', - 'bridge_interface': 'fake_fa2', - 'gateway': '192.168.2.1', - 'broadcast': '192.168.2.255', - 'dns1': '192.168.0.1', - 'dns2': '192.168.0.2', - 'dhcp_server': '192.168.2.1', - 'dhcp_start': '192.168.100.1', - 'vlan': None, - 'host': None, - 'project_id': 'fake_project', - 'vpn_public_address': '192.168.2.2', - 'mtu': None, - 'enable_dhcp': True, 'share_address': False}] @@ -1217,67 +1189,6 @@ class LinuxNetworkTestCase(test.NoDBTestCase): linux_net._set_device_mtu('fake-dev') ex.assert_has_calls(calls) - def _ovs_vif_port(self, calls, interface_type=None): - with mock.patch.object(utils, 'execute', return_value=('', '')) as ex: - linux_net.create_ovs_vif_port('fake-bridge', 'fake-dev', - 'fake-iface-id', 'fake-mac', - 'fake-instance-uuid', - interface_type=interface_type) - ex.assert_has_calls(calls) - - def test_ovs_vif_port_cmd(self): - expected = ['--', '--if-exists', - 'del-port', 'fake-dev', '--', 'add-port', - 'fake-bridge', 'fake-dev', - '--', 'set', 'Interface', 'fake-dev', - 'external-ids:iface-id=fake-iface-id', - 'external-ids:iface-status=active', - 'external-ids:attached-mac=fake-mac', - 'external-ids:vm-uuid=fake-instance-uuid' - ] - cmd = linux_net._create_ovs_vif_cmd('fake-bridge', 'fake-dev', - 'fake-iface-id', 'fake-mac', - 'fake-instance-uuid') - - self.assertEqual(expected, cmd) - - expected += ['type=fake-type'] - cmd = linux_net._create_ovs_vif_cmd('fake-bridge', 'fake-dev', - 'fake-iface-id', 'fake-mac', - 'fake-instance-uuid', - 'fake-type') - self.assertEqual(expected, cmd) - - def test_ovs_vif_port(self): - calls = [ - mock.call('ovs-vsctl', '--timeout=120', '--', '--if-exists', - 'del-port', 'fake-dev', '--', 'add-port', - 'fake-bridge', 'fake-dev', - '--', 'set', 'Interface', 'fake-dev', - 'external-ids:iface-id=fake-iface-id', - 'external-ids:iface-status=active', - 'external-ids:attached-mac=fake-mac', - 'external-ids:vm-uuid=fake-instance-uuid', - run_as_root=True) - ] - self._ovs_vif_port(calls) - - @mock.patch.object(linux_net, '_ovs_vsctl') - @mock.patch.object(linux_net, '_create_ovs_vif_cmd') - @mock.patch.object(linux_net, '_set_device_mtu') - def test_ovs_vif_port_with_type_vhostuser(self, mock_set_device_mtu, - mock_create_cmd, mock_vsctl): - linux_net.create_ovs_vif_port( - 'fake-bridge', - 'fake-dev', 'fake-iface-id', 'fake-mac', - "fake-instance-uuid", mtu=1500, - interface_type=network_model.OVS_VHOSTUSER_INTERFACE_TYPE) - mock_create_cmd.assert_called_once_with('fake-bridge', - 'fake-dev', 'fake-iface-id', 'fake-mac', - "fake-instance-uuid", network_model.OVS_VHOSTUSER_INTERFACE_TYPE) - self.assertFalse(mock_set_device_mtu.called) - self.assertTrue(mock_vsctl.called) - def _create_veth_pair(self, calls): with mock.patch.object(utils, 'execute', return_value=('', '')) as ex: linux_net._create_veth_pair('fake-dev1', 'fake-dev2') diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index f7e52b68cc..39e8b73a99 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -566,7 +566,14 @@ class LibvirtGenericVIFDriver(object): return func(instance, vif, image_meta, inst_type, virt_type, host) - def _plug_bridge_with_port(self, instance, vif, port): + def plug_ivs_hybrid(self, instance, vif): + """Plug using hybrid strategy (same as OVS) + + Create a per-VIF linux bridge, then link that bridge to the OVS + integration bridge via a veth device, setting up the other end + of the veth device just like a normal IVS port. Then boot the + VIF on the linux bridge using standard libvirt mechanisms. + """ iface_id = self.get_ovs_interfaceid(vif) br_name = self.get_br_name(vif['id']) v1_name, v2_name = self.get_veth_pair_names(vif['id']) @@ -594,24 +601,8 @@ class LibvirtGenericVIFDriver(object): linux_net._create_veth_pair(v1_name, v2_name, mtu) utils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True) utils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True) - if port == 'ovs': - linux_net.create_ovs_vif_port(self.get_bridge_name(vif), - v2_name, iface_id, - vif['address'], instance.uuid, - mtu) - elif port == 'ivs': - linux_net.create_ivs_vif_port(v2_name, iface_id, - vif['address'], instance.uuid) - - def plug_ovs_hybrid(self, instance, vif): - """Plug using hybrid strategy - - Create a per-VIF linux bridge, then link that bridge to the OVS - integration bridge via a veth device, setting up the other end - of the veth device just like a normal OVS port. Then boot the - VIF on the linux bridge using standard libvirt mechanisms. - """ - self._plug_bridge_with_port(instance, vif, port='ovs') + linux_net.create_ivs_vif_port(v2_name, iface_id, + vif['address'], instance.uuid) def plug_ivs_ethernet(self, instance, vif): iface_id = self.get_ovs_interfaceid(vif) @@ -620,16 +611,6 @@ class LibvirtGenericVIFDriver(object): linux_net.create_ivs_vif_port(dev, iface_id, vif['address'], instance.uuid) - def plug_ivs_hybrid(self, instance, vif): - """Plug using hybrid strategy (same as OVS) - - Create a per-VIF linux bridge, then link that bridge to the OVS - integration bridge via a veth device, setting up the other end - of the veth device just like a normal IVS port. Then boot the - VIF on the linux bridge using standard libvirt mechanisms. - """ - self._plug_bridge_with_port(instance, vif, port='ivs') - def plug_ivs(self, instance, vif): if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled(): self.plug_ivs_hybrid(instance, vif) @@ -810,36 +791,6 @@ class LibvirtGenericVIFDriver(object): "vif_type=%s") % vif_type) func(instance, vif) - def unplug_ovs_hybrid(self, instance, vif): - """UnPlug using hybrid strategy - - Unhook port from OVS, unhook port from bridge, delete - bridge, and delete both veth devices. - """ - try: - br_name = self.get_br_name(vif['id']) - v1_name, v2_name = self.get_veth_pair_names(vif['id']) - - if linux_net.device_exists(br_name): - utils.execute('brctl', 'delif', br_name, v1_name, - run_as_root=True) - utils.execute('ip', 'link', 'set', br_name, 'down', - run_as_root=True) - utils.execute('brctl', 'delbr', br_name, - run_as_root=True) - - linux_net.delete_ovs_vif_port(self.get_bridge_name(vif), - v2_name) - except processutils.ProcessExecutionError: - LOG.exception(_("Failed while unplugging vif"), instance=instance) - - def unplug_ivs_ethernet(self, instance, vif): - """Unplug the VIF by deleting the port from the bridge.""" - try: - linux_net.delete_ivs_vif_port(self.get_vif_devname(vif)) - except processutils.ProcessExecutionError: - LOG.exception(_("Failed while unplugging vif"), instance=instance) - def unplug_ivs_hybrid(self, instance, vif): """UnPlug using hybrid strategy (same as OVS) @@ -858,6 +809,13 @@ class LibvirtGenericVIFDriver(object): except processutils.ProcessExecutionError: LOG.exception(_("Failed while unplugging vif"), instance=instance) + def unplug_ivs_ethernet(self, instance, vif): + """Unplug the VIF by deleting the port from the bridge.""" + try: + linux_net.delete_ivs_vif_port(self.get_vif_devname(vif)) + except processutils.ProcessExecutionError: + LOG.exception(_("Failed while unplugging vif"), instance=instance) + def unplug_ivs(self, instance, vif): if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled(): self.unplug_ivs_hybrid(instance, vif)