Merge "Remove plug_ovs_hybrid, unplug_ovs_hybrid"
This commit is contained in:
commit
dce9e93bfc
@ -37,7 +37,6 @@ import six
|
|||||||
import nova.conf
|
import nova.conf
|
||||||
from nova import exception
|
from nova import exception
|
||||||
from nova.i18n import _
|
from nova.i18n import _
|
||||||
from nova.network import model as network_model
|
|
||||||
from nova import objects
|
from nova import objects
|
||||||
from nova.pci import utils as pci_utils
|
from nova.pci import utils as pci_utils
|
||||||
from nova import utils
|
from nova import utils
|
||||||
@ -1263,42 +1262,6 @@ def _ovs_vsctl(args):
|
|||||||
raise exception.OvsConfigurationFailure(inner_exception=e)
|
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):
|
def create_ivs_vif_port(dev, iface_id, mac, instance_id):
|
||||||
utils.execute('ivs-ctl', 'add-port',
|
utils.execute('ivs-ctl', 'add-port',
|
||||||
dev, run_as_root=True)
|
dev, run_as_root=True)
|
||||||
|
@ -84,8 +84,6 @@ VIF_DETAILS_VHOSTUSER_FP_PLUG = 'vhostuser_fp_plug'
|
|||||||
# create a vrouter netdevice interface
|
# create a vrouter netdevice interface
|
||||||
# TODO(mhenkel): Consider renaming this to be contrail-specific.
|
# TODO(mhenkel): Consider renaming this to be contrail-specific.
|
||||||
VIF_DETAILS_VHOSTUSER_VROUTER_PLUG = 'vhostuser_vrouter_plug'
|
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
|
# Constants for dictionary keys in the 'vif_details' field that are
|
||||||
# valid for VIF_TYPE_TAP.
|
# valid for VIF_TYPE_TAP.
|
||||||
|
@ -32,7 +32,6 @@ from nova import db
|
|||||||
from nova import exception
|
from nova import exception
|
||||||
from nova.network import driver
|
from nova.network import driver
|
||||||
from nova.network import linux_net
|
from nova.network import linux_net
|
||||||
from nova.network import model as network_model
|
|
||||||
from nova import objects
|
from nova import objects
|
||||||
from nova import test
|
from nova import test
|
||||||
from nova.tests import uuidsentinel as uuids
|
from nova.tests import uuidsentinel as uuids
|
||||||
@ -40,8 +39,6 @@ from nova import utils
|
|||||||
|
|
||||||
CONF = nova.conf.CONF
|
CONF = nova.conf.CONF
|
||||||
|
|
||||||
HOST = "testhost"
|
|
||||||
|
|
||||||
instances = {uuids.instance_1:
|
instances = {uuids.instance_1:
|
||||||
{'id': 0,
|
{'id': 0,
|
||||||
'uuid': uuids.instance_1,
|
'uuid': uuids.instance_1,
|
||||||
@ -123,31 +120,6 @@ networks = [{'id': 0,
|
|||||||
'vpn_public_address': '192.168.1.2',
|
'vpn_public_address': '192.168.1.2',
|
||||||
'mtu': None,
|
'mtu': None,
|
||||||
'enable_dhcp': True,
|
'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}]
|
'share_address': False}]
|
||||||
|
|
||||||
|
|
||||||
@ -1217,67 +1189,6 @@ class LinuxNetworkTestCase(test.NoDBTestCase):
|
|||||||
linux_net._set_device_mtu('fake-dev')
|
linux_net._set_device_mtu('fake-dev')
|
||||||
ex.assert_has_calls(calls)
|
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):
|
def _create_veth_pair(self, calls):
|
||||||
with mock.patch.object(utils, 'execute', return_value=('', '')) as ex:
|
with mock.patch.object(utils, 'execute', return_value=('', '')) as ex:
|
||||||
linux_net._create_veth_pair('fake-dev1', 'fake-dev2')
|
linux_net._create_veth_pair('fake-dev1', 'fake-dev2')
|
||||||
|
@ -566,7 +566,14 @@ class LibvirtGenericVIFDriver(object):
|
|||||||
return func(instance, vif, image_meta,
|
return func(instance, vif, image_meta,
|
||||||
inst_type, virt_type, host)
|
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)
|
iface_id = self.get_ovs_interfaceid(vif)
|
||||||
br_name = self.get_br_name(vif['id'])
|
br_name = self.get_br_name(vif['id'])
|
||||||
v1_name, v2_name = self.get_veth_pair_names(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)
|
linux_net._create_veth_pair(v1_name, v2_name, mtu)
|
||||||
utils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True)
|
utils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True)
|
||||||
utils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True)
|
utils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True)
|
||||||
if port == 'ovs':
|
linux_net.create_ivs_vif_port(v2_name, iface_id,
|
||||||
linux_net.create_ovs_vif_port(self.get_bridge_name(vif),
|
vif['address'], instance.uuid)
|
||||||
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')
|
|
||||||
|
|
||||||
def plug_ivs_ethernet(self, instance, vif):
|
def plug_ivs_ethernet(self, instance, vif):
|
||||||
iface_id = self.get_ovs_interfaceid(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'],
|
linux_net.create_ivs_vif_port(dev, iface_id, vif['address'],
|
||||||
instance.uuid)
|
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):
|
def plug_ivs(self, instance, vif):
|
||||||
if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled():
|
if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled():
|
||||||
self.plug_ivs_hybrid(instance, vif)
|
self.plug_ivs_hybrid(instance, vif)
|
||||||
@ -810,36 +791,6 @@ class LibvirtGenericVIFDriver(object):
|
|||||||
"vif_type=%s") % vif_type)
|
"vif_type=%s") % vif_type)
|
||||||
func(instance, vif)
|
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):
|
def unplug_ivs_hybrid(self, instance, vif):
|
||||||
"""UnPlug using hybrid strategy (same as OVS)
|
"""UnPlug using hybrid strategy (same as OVS)
|
||||||
|
|
||||||
@ -858,6 +809,13 @@ class LibvirtGenericVIFDriver(object):
|
|||||||
except processutils.ProcessExecutionError:
|
except processutils.ProcessExecutionError:
|
||||||
LOG.exception(_("Failed while unplugging vif"), instance=instance)
|
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):
|
def unplug_ivs(self, instance, vif):
|
||||||
if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled():
|
if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled():
|
||||||
self.unplug_ivs_hybrid(instance, vif)
|
self.unplug_ivs_hybrid(instance, vif)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user