components/openstack/neutron/patches/02-dhcp-agent-add-solaris.patch
branchs11-update
changeset 3178 77584387a894
parent 3175 1ff833d174d4
child 3179 07c03b663108
--- a/components/openstack/neutron/patches/02-dhcp-agent-add-solaris.patch	Wed Jun 11 05:34:04 2014 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,251 +0,0 @@
-In-house patch to split out the Linux specific implementation details of the
-Neutron DHCP agent into a separate module. This allows for a common
-main DHCP agent module on different platforms.  This patch has not yet
-been submitted upstream.
-
---- quantum-2013.1.4/quantum/agent/dhcp_agent.py.~1~	2013-10-17 11:24:18.000000000 -0700
-+++ quantum-2013.1.4/quantum/agent/dhcp_agent.py	2014-03-13 01:37:26.539103862 -0700
-@@ -17,7 +17,6 @@
- 
- import os
- import socket
--import uuid
- 
- import eventlet
- import netaddr
-@@ -26,11 +25,8 @@
- from quantum.agent.common import config
- from quantum.agent.linux import dhcp
- from quantum.agent.linux import external_process
--from quantum.agent.linux import interface
--from quantum.agent.linux import ip_lib
- from quantum.agent import rpc as agent_rpc
- from quantum.common import constants
--from quantum.common import exceptions
- from quantum.common import topics
- from quantum import context
- from quantum import manager
-@@ -58,6 +54,9 @@
-         cfg.StrOpt('dhcp_driver',
-                    default='quantum.agent.linux.dhcp.Dnsmasq',
-                    help=_("The driver used to manage the DHCP server.")),
-+        cfg.StrOpt('devicemanager',
-+                   default='quantum.agent.linux.device.DeviceManager',
-+                   help=_("The driver to manage OS specific devices.")),
-         cfg.BoolOpt('use_namespaces', default=True,
-                     help=_("Allow overlapping IP.")),
-         cfg.BoolOpt('enable_isolated_metadata', default=False,
-@@ -77,7 +76,9 @@
-         self.dhcp_driver_cls = importutils.import_class(self.conf.dhcp_driver)
-         ctx = context.get_admin_context_without_session()
-         self.plugin_rpc = DhcpPluginApi(topics.PLUGIN, ctx)
--        self.device_manager = DeviceManager(self.conf, self.plugin_rpc)
-+        self.device_manager = \
-+            importutils.import_object(self.conf.devicemanager,
-+                                      self.conf, self.plugin_rpc)
-         self.lease_relay = DhcpLeaseRelay(self.update_lease)
- 
-         self.dhcp_version = self.dhcp_driver_cls.check_version()
-@@ -494,167 +495,6 @@
-                 'ports': num_ports}
- 
- 
--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
--        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))
--
--
- class DictModel(object):
-     """Convert dict into an object that provides attribute access to values."""
-     def __init__(self, d):
-@@ -783,11 +623,11 @@
-     cfg.CONF.register_opts(DhcpAgent.OPTS)
-     config.register_agent_state_opts_helper(cfg.CONF)
-     config.register_root_helper(cfg.CONF)
--    cfg.CONF.register_opts(DeviceManager.OPTS)
-     cfg.CONF.register_opts(DhcpLeaseRelay.OPTS)
-     cfg.CONF.register_opts(dhcp.OPTS)
--    cfg.CONF.register_opts(interface.OPTS)
-     cfg.CONF(project='quantum')
-+    if not cfg.CONF.devicemanager:
-+        raise SystemExit(_('You must specify a devicemanager'))
-     config.setup_logging(cfg.CONF)
-     server = quantum_service.Service.create(
-         binary='quantum-dhcp-agent',
---- quantum-2013.1.4/quantum/db/dhcp_rpc_base.py.~1~	2013-10-17 11:24:18.000000000 -0700
-+++ quantum-2013.1.4/quantum/db/dhcp_rpc_base.py	2014-03-13 01:27:46.731450967 -0700
-@@ -97,11 +97,14 @@
-                 for fixed_ip in port['fixed_ips']:
-                     if fixed_ip['subnet_id'] in dhcp_enabled_subnet_ids:
-                         dhcp_enabled_subnet_ids.remove(fixed_ip['subnet_id'])
--                port['fixed_ips'].extend(
--                    [dict(subnet_id=s) for s in dhcp_enabled_subnet_ids])
-+                if dhcp_enabled_subnet_ids:
-+                    port['fixed_ips'].extend(
-+                        [dict(subnet_id=s) for s in dhcp_enabled_subnet_ids])
- 
--                retval = plugin.update_port(context, port['id'],
--                                            dict(port=port))
-+                    retval = plugin.update_port(context, port['id'],
-+                                                dict(port=port))
-+                else:
-+                    retval = port
- 
-         except exc.NoResultFound:
-             pass