~ubuntu-branches/ubuntu/raring/nova/raring-proposed

« back to all changes in this revision

Viewing changes to nova/virt/libvirt/vif.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Adam Gandelman, Chuck Short
  • Date: 2012-11-23 09:04:58 UTC
  • mfrom: (1.1.66)
  • Revision ID: package-import@ubuntu.com-20121123090458-91565o7aev1i1h71
Tags: 2013.1~g1-0ubuntu1
[ Adam Gandelman ]
* debian/control: Ensure novaclient is upgraded with nova,
  require python-keystoneclient >= 1:2.9.0. (LP: #1073289)
* debian/patches/{ubuntu/*, rbd-security.patch}: Dropped, applied
  upstream.
* debian/control: Add python-testtools to Build-Depends.

[ Chuck Short ]
* New upstream version.
* Refreshed debian/patches/avoid_setuptools_git_dependency.patch.
* debian/rules: FTBFS if missing binaries.
* debian/nova-scheudler.install: Add missing rabbit-queues and
  nova-rpc-zmq-receiver.
* Remove nova-volume since it doesnt exist anymore, transition to cinder-*.
* debian/rules: install apport hook in the right place.
* debian/patches/ubuntu-show-tests.patch: Display test failures.
* debian/control: Add depends on genisoimage
* debian/control: Suggest guestmount.
* debian/control: Suggest websockify. (LP: #1076442)
* debian/nova.conf: Disable nova-volume service.
* debian/control: Depend on xen-system-* rather than the hypervisor.
* debian/control, debian/mans/nova-conductor.8, debian/nova-conductor.init,
  debian/nova-conductor.install, debian/nova-conductor.logrotate
  debian/nova-conductor.manpages, debian/nova-conductor.postrm
  debian/nova-conductor.upstart.in: Add nova-conductor service.
* debian/control: Add python-fixtures as a build deps.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
"""VIF drivers for libvirt."""
21
21
 
22
22
from nova import exception
23
 
from nova import flags
24
23
from nova.network import linux_net
25
24
from nova.openstack.common import cfg
26
25
from nova.openstack.common import log as logging
28
27
from nova.virt import netutils
29
28
from nova.virt import vif
30
29
 
31
 
from nova.virt.libvirt import config
 
30
from nova.virt.libvirt import config as vconfig
32
31
 
33
32
LOG = logging.getLogger(__name__)
34
33
 
41
40
                help='Use virtio for bridge interfaces'),
42
41
]
43
42
 
44
 
FLAGS = flags.FLAGS
45
 
FLAGS.register_opts(libvirt_vif_opts)
46
 
flags.DECLARE('libvirt_type', 'nova.virt.libvirt.driver')
 
43
CONF = cfg.CONF
 
44
CONF.register_opts(libvirt_vif_opts)
 
45
CONF.import_opt('libvirt_type', 'nova.virt.libvirt.driver')
 
46
CONF.import_opt('use_ipv6', 'nova.config')
47
47
 
48
48
LINUX_DEV_LEN = 14
49
49
 
52
52
    """VIF driver for Linux bridge."""
53
53
 
54
54
    def _get_configurations(self, instance, network, mapping):
55
 
        """Get a dictionary of VIF configurations for bridge type."""
 
55
        """Get VIF configurations for bridge type."""
56
56
 
57
57
        mac_id = mapping['mac'].replace(':', '')
58
58
 
59
 
        conf = config.LibvirtConfigGuestInterface()
 
59
        conf = vconfig.LibvirtConfigGuestInterface()
60
60
        conf.net_type = "bridge"
61
61
        conf.mac_addr = mapping['mac']
62
62
        conf.source_dev = network['bridge']
63
63
        conf.script = ""
64
 
        if FLAGS.libvirt_use_virtio_for_bridges:
 
64
        if CONF.libvirt_use_virtio_for_bridges:
65
65
            conf.model = "virtio"
66
66
 
67
67
        conf.filtername = "nova-instance-" + instance['name'] + "-" + mac_id
69
69
        if mapping['dhcp_server']:
70
70
            conf.add_filter_param("DHCPSERVER", mapping['dhcp_server'])
71
71
 
72
 
        if FLAGS.use_ipv6:
 
72
        if CONF.use_ipv6:
73
73
            conf.add_filter_param("RASERVER",
74
74
                                  mapping.get('gateway_v6') + "/128")
75
75
 
76
 
        if FLAGS.allow_same_net_traffic:
 
76
        if CONF.allow_same_net_traffic:
77
77
            net, mask = netutils.get_net_and_mask(network['cidr'])
78
78
            conf.add_filter_param("PROJNET", net)
79
79
            conf.add_filter_param("PROJMASK", mask)
80
 
            if FLAGS.use_ipv6:
 
80
            if CONF.use_ipv6:
81
81
                net_v6, prefixlen_v6 = netutils.get_net_and_prefixlen(
82
82
                                           network['cidr_v6'])
83
83
                conf.add_filter_param("PROJNET6", net_v6)
91
91
        if (not network.get('multi_host') and
92
92
            mapping.get('should_create_bridge')):
93
93
            if mapping.get('should_create_vlan'):
94
 
                iface = FLAGS.vlan_interface or network['bridge_interface']
 
94
                iface = CONF.vlan_interface or network['bridge_interface']
95
95
                LOG.debug(_('Ensuring vlan %(vlan)s and bridge %(bridge)s'),
96
96
                          {'vlan': network['vlan'],
97
97
                           'bridge': network['bridge']},
101
101
                                             network['bridge'],
102
102
                                             iface)
103
103
            else:
104
 
                iface = FLAGS.flat_interface or network['bridge_interface']
 
104
                iface = CONF.flat_interface or network['bridge_interface']
105
105
                LOG.debug(_("Ensuring bridge %s"), network['bridge'],
106
106
                          instance=instance)
107
107
                linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(
127
127
 
128
128
    def create_ovs_vif_port(self, dev, iface_id, mac, instance_id):
129
129
        utils.execute('ovs-vsctl', '--', '--may-exist', 'add-port',
130
 
                FLAGS.libvirt_ovs_bridge, dev,
 
130
                CONF.libvirt_ovs_bridge, dev,
131
131
                '--', 'set', 'Interface', dev,
132
132
                'external-ids:iface-id=%s' % iface_id,
133
133
                'external-ids:iface-status=active',
136
136
                run_as_root=True)
137
137
 
138
138
    def delete_ovs_vif_port(self, dev):
139
 
        utils.execute('ovs-vsctl', 'del-port', FLAGS.libvirt_ovs_bridge,
 
139
        utils.execute('ovs-vsctl', 'del-port', CONF.libvirt_ovs_bridge,
140
140
                      dev, run_as_root=True)
141
141
        utils.execute('ip', 'link', 'delete', dev, run_as_root=True)
142
142
 
144
144
        network, mapping = vif
145
145
        iface_id = mapping['vif_uuid']
146
146
        dev = self.get_dev_name(iface_id)
147
 
        if not linux_net._device_exists(dev):
 
147
        if not linux_net.device_exists(dev):
148
148
            # Older version of the command 'ip' from the iproute2 package
149
149
            # don't have support for the tuntap option (lp:882568).  If it
150
150
            # turns out we're on an old version we work around this by using
161
161
        self.create_ovs_vif_port(dev, iface_id, mapping['mac'],
162
162
                                 instance['uuid'])
163
163
 
164
 
        conf = config.LibvirtConfigGuestInterface()
 
164
        conf = vconfig.LibvirtConfigGuestInterface()
165
165
 
166
 
        if FLAGS.libvirt_use_virtio_for_bridges:
 
166
        if CONF.libvirt_use_virtio_for_bridges:
167
167
            conf.model = "virtio"
168
168
        conf.net_type = "ethernet"
169
169
        conf.target_dev = dev
212
212
        br_name = self.get_br_name(iface_id)
213
213
        v1_name, v2_name = self.get_veth_pair_names(iface_id)
214
214
 
215
 
        if not linux_net._device_exists(br_name):
 
215
        if not linux_net.device_exists(br_name):
216
216
            utils.execute('brctl', 'addbr', br_name, run_as_root=True)
217
217
 
218
 
        if not linux_net._device_exists(v2_name):
 
218
        if not linux_net.device_exists(v2_name):
219
219
            linux_net._create_veth_pair(v1_name, v2_name)
220
220
            utils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True)
221
221
            utils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True)
255
255
        """ Pass data required to create OVS virtual port element"""
256
256
        network, mapping = vif
257
257
 
258
 
        conf = config.LibvirtConfigGuestInterface()
 
258
        conf = vconfig.LibvirtConfigGuestInterface()
259
259
 
260
260
        conf.net_type = "bridge"
261
 
        conf.source_dev = FLAGS.libvirt_ovs_bridge
 
261
        conf.source_dev = CONF.libvirt_ovs_bridge
262
262
        conf.mac_addr = mapping['mac']
263
 
        if FLAGS.libvirt_use_virtio_for_bridges:
 
263
        if CONF.libvirt_use_virtio_for_bridges:
264
264
            conf.model = "virtio"
265
265
        conf.vporttype = "openvswitch"
266
266
        conf.add_vport_param("interfaceid", mapping['vif_uuid'])
275
275
class QuantumLinuxBridgeVIFDriver(vif.VIFDriver):
276
276
    """VIF driver for Linux Bridge when running Quantum."""
277
277
 
 
278
    def get_bridge_name(self, network_id):
 
279
        return ("brq" + network_id)[:LINUX_DEV_LEN]
 
280
 
278
281
    def get_dev_name(self, iface_id):
279
282
        return ("tap" + iface_id)[:LINUX_DEV_LEN]
280
283
 
283
286
        iface_id = mapping['vif_uuid']
284
287
        dev = self.get_dev_name(iface_id)
285
288
 
286
 
        if FLAGS.libvirt_type != 'xen':
287
 
            linux_net.QuantumLinuxBridgeInterfaceDriver.create_tap_dev(dev)
288
 
 
289
 
        conf = config.LibvirtConfigGuestInterface()
290
 
 
291
 
        if FLAGS.libvirt_use_virtio_for_bridges:
292
 
            conf.model = 'virtio'
293
 
        conf.net_type = "ethernet"
 
289
        bridge = self.get_bridge_name(network['id'])
 
290
        linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(bridge, None,
 
291
                                                           filtering=False)
 
292
 
 
293
        conf = vconfig.LibvirtConfigGuestInterface()
294
294
        conf.target_dev = dev
295
 
        conf.script = ""
 
295
        conf.net_type = "bridge"
296
296
        conf.mac_addr = mapping['mac']
 
297
        conf.source_dev = bridge
 
298
        if CONF.libvirt_use_virtio_for_bridges:
 
299
            conf.model = "virtio"
297
300
 
298
301
        return conf
299
302
 
300
303
    def unplug(self, instance, vif):
301
 
        """Unplug the VIF by deleting the port from the bridge."""
302
 
        network, mapping = vif
303
 
        dev = self.get_dev_name(mapping['vif_uuid'])
304
 
        try:
305
 
            utils.execute('ip', 'link', 'delete', dev, run_as_root=True)
306
 
        except exception.ProcessExecutionError:
307
 
            LOG.warning(_("Failed while unplugging vif"), instance=instance)
308
 
            raise
 
304
        """No action needed.  Libvirt takes care of cleanup"""
 
305
        pass