Merge "Remove plug_ovs_hybrid, unplug_ovs_hybrid"
This commit is contained in:
commit
dce9e93bfc
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user