28
28
from nova.virt import netutils
29
29
from nova.virt import vif
31
from nova.virt.libvirt import config
32
33
LOG = logging.getLogger(__name__)
34
libvirt_ovs_bridge_opt = cfg.StrOpt('libvirt_ovs_bridge',
36
cfg.StrOpt('libvirt_ovs_bridge',
36
help='Name of Integration Bridge used by Open vSwitch')
38
help='Name of Integration Bridge used by Open vSwitch'),
39
cfg.BoolOpt('libvirt_use_virtio_for_bridges',
41
help='Use virtio for bridge interfaces'),
38
44
FLAGS = flags.FLAGS
39
FLAGS.register_opt(libvirt_ovs_bridge_opt)
45
FLAGS.register_opts(libvirt_vif_opts)
46
flags.DECLARE('libvirt_type', 'nova.virt.libvirt.connection')
42
49
class LibvirtBridgeDriver(vif.VIFDriver):
43
50
"""VIF driver for Linux bridge."""
45
def _get_configurations(self, network, mapping):
52
def _get_configurations(self, instance, network, mapping):
46
53
"""Get a dictionary of VIF configurations for bridge type."""
47
# Assume that the gateway also acts as the dhcp server.
48
gateway_v6 = mapping.get('gateway_v6')
49
55
mac_id = mapping['mac'].replace(':', '')
57
conf = config.LibvirtConfigGuestInterface()
58
conf.net_type = "bridge"
59
conf.mac_addr = mapping['mac']
60
conf.source_dev = network['bridge']
62
if FLAGS.libvirt_use_virtio_for_bridges:
65
conf.filtername = "nova-instance-" + instance['name'] + "-" + mac_id
66
conf.add_filter_param("IP", mapping['ips'][0]['ip'])
67
if mapping['dhcp_server']:
68
conf.add_filter_param("DHCPSERVER", mapping['dhcp_server'])
71
conf.add_filter_param("RASERVER",
72
mapping.get('gateway_v6') + "/128")
51
74
if FLAGS.allow_same_net_traffic:
52
template = "<parameter name=\"%s\" value=\"%s\" />\n"
53
75
net, mask = netutils.get_net_and_mask(network['cidr'])
54
values = [("PROJNET", net), ("PROJMASK", mask)]
76
conf.add_filter_param("PROJNET", net)
77
conf.add_filter_param("PROJMASK", mask)
56
79
net_v6, prefixlen_v6 = netutils.get_net_and_prefixlen(
57
80
network['cidr_v6'])
58
values.extend([("PROJNETV6", net_v6),
59
("PROJMASKV6", prefixlen_v6)])
61
extra_params = "".join([template % value for value in values])
67
'bridge_name': network['bridge'],
68
'mac_address': mapping['mac'],
69
'ip_address': mapping['ips'][0]['ip'],
70
'dhcp_server': mapping['dhcp_server'],
71
'extra_params': extra_params,
75
result['gateway_v6'] = gateway_v6 + "/128"
81
conf.add_filter_param("PROJNET6", net_v6)
82
conf.add_filter_param("PROJMASK6", prefixlen_v6)
79
86
def plug(self, instance, network, mapping):
80
87
"""Ensure that the bridge exists, and add VIF to it."""
84
91
iface = FLAGS.vlan_interface or network['bridge_interface']
85
92
LOG.debug(_('Ensuring vlan %(vlan)s and bridge %(bridge)s'),
86
93
{'vlan': network['vlan'],
87
'bridge': network['bridge']})
94
'bridge': network['bridge']},
88
96
linux_net.LinuxBridgeInterfaceDriver.ensure_vlan_bridge(
93
101
iface = FLAGS.flat_interface or network['bridge_interface']
94
LOG.debug(_("Ensuring bridge %s"), network['bridge'])
102
LOG.debug(_("Ensuring bridge %s"), network['bridge'],
95
104
linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(
96
105
network['bridge'],
99
return self._get_configurations(network, mapping)
108
return self._get_configurations(instance, network, mapping)
101
110
def unplug(self, instance, network, mapping):
102
111
"""No manual unplugging required."""
165
176
def plug(self, instance, network, mapping):
166
177
""" Pass data required to create OVS virtual port element"""
168
'bridge_name': FLAGS.libvirt_ovs_bridge,
169
'ovs_interfaceid': mapping['vif_uuid'],
170
'mac_address': mapping['mac']}
179
conf = config.LibvirtConfigGuestInterface()
181
conf.net_type = "bridge"
182
conf.source_dev = FLAGS.libvirt_ovs_bridge
183
conf.mac_addr = mapping['mac']
184
if FLAGS.libvirt_use_virtio_for_bridges:
185
conf.model = "virtio"
186
conf.vporttype = "openvswitch"
187
conf.add_vport_param("interfaceid", mapping['vif_uuid'])
172
191
def unplug(self, instance, network, mapping):
173
192
"""No action needed. Libvirt takes care of cleanup"""
183
202
def plug(self, instance, network, mapping):
184
203
iface_id = mapping['vif_uuid']
185
204
dev = self.get_dev_name(iface_id)
186
linux_net.QuantumLinuxBridgeInterfaceDriver.create_tap_dev(dev)
191
'mac_address': mapping['mac']}
206
if FLAGS.libvirt_type != 'xen':
207
linux_net.QuantumLinuxBridgeInterfaceDriver.create_tap_dev(dev)
209
conf = config.LibvirtConfigGuestInterface()
211
conf.net_type = "ethernet"
212
conf.target_dev = dev
214
conf.mac_addr = mapping['mac']
194
218
def unplug(self, instance, network, mapping):
195
219
"""Unplug the VIF from the network by deleting the port from