components/openstack/neutron/files/agent/linux/device.py
branchs11-update
changeset 3178 77584387a894
parent 3175 1ff833d174d4
child 3179 07c03b663108
--- a/components/openstack/neutron/files/agent/linux/device.py	Wed Jun 11 05:34:04 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,197 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
-#    not use this file except in compliance with the License. You may obtain
-#    a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-#    License for the specific language governing permissions and limitations
-#    under the License.
-
-import socket
-import uuid
-
-import netaddr
-from oslo.config import cfg
-
-from quantum.agent.common import config
-from quantum.agent.linux import interface
-from quantum.agent.linux import ip_lib
-from quantum.common import exceptions
-from quantum.openstack.common import importutils
-from quantum.openstack.common import log as logging
-
-LOG = logging.getLogger(__name__)
-NS_PREFIX = 'qdhcp-'
-METADATA_DEFAULT_PREFIX = 16
-METADATA_DEFAULT_IP = '169.254.169.254/%d' % METADATA_DEFAULT_PREFIX
-
-
-class DeviceManager(object):
-    OPTS = [
-        cfg.StrOpt('interface_driver',
-                   help=_("The driver used to manage the virtual interface."))
-    ]
-
-    def __init__(self, conf, plugin):
-        self.conf = conf
-        self.root_helper = config.get_root_helper(conf)
-        self.plugin = plugin
-        cfg.CONF.register_opts(DeviceManager.OPTS)
-        cfg.CONF.register_opts(interface.OPTS)
-        if not conf.interface_driver:
-            raise SystemExit(_('You must specify an interface driver'))
-        try:
-            self.driver = importutils.import_object(conf.interface_driver,
-                                                    conf)
-        except:
-            msg = _("Error importing interface driver "
-                    "'%s'") % conf.interface_driver
-            raise SystemExit(msg)
-
-    def get_interface_name(self, network, port=None):
-        """Return interface(device) name for use by the DHCP process."""
-        if not port:
-            device_id = self.get_device_id(network)
-            port = self.plugin.get_dhcp_port(network.id, device_id)
-        return self.driver.get_device_name(port)
-
-    def get_device_id(self, network):
-        """Return a unique DHCP device ID for this host on the network."""
-        # There could be more than one dhcp server per network, so create
-        # a device id that combines host and network ids
-
-        host_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, socket.gethostname())
-        return 'dhcp%s-%s' % (host_uuid, network.id)
-
-    def _get_device(self, network):
-        """Return DHCP ip_lib device for this host on the network."""
-        device_id = self.get_device_id(network)
-        port = self.plugin.get_dhcp_port(network.id, device_id)
-        interface_name = self.get_interface_name(network, port)
-        namespace = NS_PREFIX + network.id
-        return ip_lib.IPDevice(interface_name,
-                               self.root_helper,
-                               namespace)
-
-    def _set_default_route(self, network):
-        """Sets the default gateway for this dhcp namespace.
-
-        This method is idempotent and will only adjust the route if adjusting
-        it would change it from what it already is.  This makes it safe to call
-        and avoids unnecessary perturbation of the system.
-        """
-        device = self._get_device(network)
-        gateway = device.route.get_gateway()
-
-        for subnet in network.subnets:
-            skip_subnet = (
-                subnet.ip_version != 4
-                or not subnet.enable_dhcp
-                or subnet.gateway_ip is None)
-
-            if skip_subnet:
-                continue
-
-            if gateway != subnet.gateway_ip:
-                m = _('Setting gateway for dhcp netns on net %(n)s to %(ip)s')
-                LOG.debug(m, {'n': network.id, 'ip': subnet.gateway_ip})
-
-                device.route.add_gateway(subnet.gateway_ip)
-
-            return
-
-        # No subnets on the network have a valid gateway.  Clean it up to avoid
-        # confusion from seeing an invalid gateway here.
-        if gateway is not None:
-            msg = _('Removing gateway for dhcp netns on net %s')
-            LOG.debug(msg, network.id)
-
-            device.route.delete_gateway(gateway)
-
-    def setup(self, network, reuse_existing=False):
-        """Create and initialize a device for network's DHCP on this host."""
-        device_id = self.get_device_id(network)
-        port = self.plugin.get_dhcp_port(network.id, device_id)
-
-        interface_name = self.get_interface_name(network, port)
-
-        if self.conf.use_namespaces:
-            namespace = NS_PREFIX + network.id
-        else:
-            namespace = None
-
-        if ip_lib.device_exists(interface_name,
-                                self.root_helper,
-                                namespace):
-            if not reuse_existing:
-                raise exceptions.PreexistingDeviceFailure(
-                    dev_name=interface_name)
-
-            LOG.debug(_('Reusing existing device: %s.'), interface_name)
-        else:
-            self.driver.plug(network.id,
-                             port.id,
-                             interface_name,
-                             port.mac_address,
-                             namespace=namespace)
-        ip_cidrs = []
-        for fixed_ip in port.fixed_ips:
-            subnet = fixed_ip.subnet
-            net = netaddr.IPNetwork(subnet.cidr)
-            ip_cidr = '%s/%s' % (fixed_ip.ip_address, net.prefixlen)
-            ip_cidrs.append(ip_cidr)
-
-        if (self.conf.enable_isolated_metadata and
-            self.conf.use_namespaces):
-            ip_cidrs.append(METADATA_DEFAULT_IP)
-
-        self.driver.init_l3(interface_name, ip_cidrs,
-                            namespace=namespace)
-
-        # ensure that the dhcp interface is first in the list
-        if namespace is None:
-            device = ip_lib.IPDevice(interface_name,
-                                     self.root_helper)
-            device.route.pullup_route(interface_name)
-
-        if self.conf.enable_metadata_network:
-            meta_cidr = netaddr.IPNetwork(METADATA_DEFAULT_IP)
-            metadata_subnets = [s for s in network.subnets if
-                                netaddr.IPNetwork(s.cidr) in meta_cidr]
-            if metadata_subnets:
-                # Add a gateway so that packets can be routed back to VMs
-                device = ip_lib.IPDevice(interface_name,
-                                         self.root_helper,
-                                         namespace)
-                # Only 1 subnet on metadata access network
-                gateway_ip = metadata_subnets[0].gateway_ip
-                device.route.add_gateway(gateway_ip)
-        elif self.conf.use_namespaces:
-            self._set_default_route(network)
-
-        return interface_name
-
-    def update(self, network):
-        """Update device settings for the network's DHCP on this host."""
-        if self.conf.use_namespaces and not self.conf.enable_metadata_network:
-            self._set_default_route(network)
-
-    def destroy(self, network, device_name):
-        """Destroy the device used for the network's DHCP on this host."""
-        if self.conf.use_namespaces:
-            namespace = NS_PREFIX + network.id
-        else:
-            namespace = None
-
-        self.driver.unplug(device_name, namespace=namespace)
-
-        self.plugin.release_dhcp_port(network.id,
-                                      self.get_device_id(network))