components/openstack/neutron/patches/02-l3-agent-add-solaris.patch
branchs11-update
changeset 3178 77584387a894
child 3998 5bd484384122
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/neutron/patches/02-l3-agent-add-solaris.patch	Fri Jun 13 09:10:23 2014 -0700
@@ -0,0 +1,384 @@
+--- neutron-2013.2.3/neutron/agent/l3_agent.py.orig	2014-04-03 11:49:01.000000000 -0700
++++ neutron-2013.2.3/neutron/agent/l3_agent.py	2014-06-02 02:31:42.660207857 -0700
+@@ -2,6 +2,8 @@
+ #
+ # Copyright 2012 Nicira Networks, Inc.  All rights reserved.
+ #
++# Copyright (c) 2014, Oracle and/or its affiliates. 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
+@@ -15,8 +17,11 @@
+ #    under the License.
+ #
+ # @author: Dan Wendlandt, Nicira, Inc
++# @author: Girish Moodalbail, Oracle, Inc
+ #
+ 
++import platform
++
+ import eventlet
+ import netaddr
+ from oslo.config import cfg
+@@ -28,6 +33,8 @@
+ from neutron.agent.linux import iptables_manager
+ from neutron.agent.linux import utils
+ from neutron.agent import rpc as agent_rpc
++from neutron.agent.solaris import ipfilters_manager
++from neutron.agent.solaris import net_lib
+ from neutron.common import constants as l3_constants
+ from neutron.common import legacy
+ from neutron.common import topics
+@@ -150,6 +157,7 @@
+             Per rpc versioning rules,  it is backwards compatible.
+     """
+     RPC_API_VERSION = '1.1'
++    RouterInfo = RouterInfo
+ 
+     OPTS = [
+         cfg.StrOpt('external_network_bridge', default='br-ex',
+@@ -292,8 +300,8 @@
+                 raise
+ 
+     def _router_added(self, router_id, router):
+-        ri = RouterInfo(router_id, self.root_helper,
+-                        self.conf.use_namespaces, router)
++        ri = self.RouterInfo(router_id, self.root_helper,
++                             self.conf.use_namespaces, router)
+         self.router_info[router_id] = ri
+         if self.conf.use_namespaces:
+             self._create_router_namespace(ri)
+@@ -380,12 +388,11 @@
+         for p in new_ports:
+             self._set_subnet_info(p)
+             ri.internal_ports.append(p)
+-            self.internal_network_added(ri, p['network_id'], p['id'],
+-                                        p['ip_cidr'], p['mac_address'])
++            self.internal_network_added(ri, p)
+ 
+         for p in old_ports:
+             ri.internal_ports.remove(p)
+-            self.internal_network_removed(ri, p['id'], p['ip_cidr'])
++            self.internal_network_removed(ri, p)
+ 
+         internal_cidrs = [p['ip_cidr'] for p in ri.internal_ports]
+         # TODO(salv-orlando): RouterInfo would be a better place for
+@@ -572,23 +579,24 @@
+             rules.extend(self.internal_network_nat_rules(ex_gw_ip, cidr))
+         return rules
+ 
+-    def internal_network_added(self, ri, network_id, port_id,
+-                               internal_cidr, mac_address):
+-        interface_name = self.get_internal_device_name(port_id)
++    def internal_network_added(self, ri, port):
++        interface_name = self.get_internal_device_name(port['id'])
+         if not ip_lib.device_exists(interface_name,
+                                     root_helper=self.root_helper,
+                                     namespace=ri.ns_name()):
+-            self.driver.plug(network_id, port_id, interface_name, mac_address,
++            self.driver.plug(port['network_id'], port['id'], interface_name,
++                             port['mac_address'],
+                              namespace=ri.ns_name(),
+                              prefix=INTERNAL_DEV_PREFIX)
++        internal_cidr = port['ip_cidr']
+ 
+         self.driver.init_l3(interface_name, [internal_cidr],
+                             namespace=ri.ns_name())
+         ip_address = internal_cidr.split('/')[0]
+         self._send_gratuitous_arp_packet(ri, interface_name, ip_address)
+ 
+-    def internal_network_removed(self, ri, port_id, internal_cidr):
+-        interface_name = self.get_internal_device_name(port_id)
++    def internal_network_removed(self, ri, port):
++        interface_name = self.get_internal_device_name(port['id'])
+         if ip_lib.device_exists(interface_name,
+                                 root_helper=self.root_helper,
+                                 namespace=ri.ns_name()):
+@@ -839,6 +847,8 @@
+     config.register_root_helper(conf)
+     conf.register_opts(interface.OPTS)
+     conf.register_opts(external_process.OPTS)
++    if platform.system() == "SunOS":
++        manager = 'neutron.agent.evs_l3_agent.EVSL3NATAgent'
+     conf(project='neutron')
+     config.setup_logging(conf)
+     legacy.modernize_quantum_config(conf)
+--- neutron-2013.2.3/neutron/db/l3_db.py.~1~	2014-04-03 11:49:01.000000000 -0700
++++ neutron-2013.2.3/neutron/db/l3_db.py	2014-06-02 23:20:58.933635798 -0700
+@@ -2,6 +2,8 @@
+ 
+ # Copyright 2012 Nicira Networks, Inc.  All rights reserved.
+ #
++# Copyright (c) 2014, Oracle and/or its affiliates. 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
+@@ -15,6 +17,7 @@
+ #    under the License.
+ #
+ # @author: Dan Wendlandt, Nicira, Inc
++# @author: Girish Moodalbail, Oracle, Inc
+ #
+ 
+ import netaddr
+@@ -56,7 +59,7 @@
+     status = sa.Column(sa.String(16))
+     admin_state_up = sa.Column(sa.Boolean)
+     gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id'))
+-    gw_port = orm.relationship(models_v2.Port)
++    gw_port = orm.relationship(models_v2.Port, lazy='joined')
+ 
+ 
+ class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
+@@ -79,6 +82,8 @@
+     """Mixin class to add L3/NAT router methods to db_plugin_base_v2."""
+ 
+     l3_rpc_notifier = l3_rpc_agent_api.L3AgentNotify
++    Router = Router
++    FloatingIP = FloatingIP
+ 
+     @property
+     def _core_plugin(self):
+@@ -86,7 +91,7 @@
+ 
+     def _get_router(self, context, id):
+         try:
+-            router = self._get_by_id(context, Router, id)
++            router = self._get_by_id(context, self.Router, id)
+         except exc.NoResultFound:
+             raise l3.RouterNotFound(router_id=id)
+         return router
+@@ -122,11 +127,11 @@
+         with context.session.begin(subtransactions=True):
+             # pre-generate id so it will be available when
+             # configuring external gw port
+-            router_db = Router(id=uuidutils.generate_uuid(),
+-                               tenant_id=tenant_id,
+-                               name=r['name'],
+-                               admin_state_up=r['admin_state_up'],
+-                               status="ACTIVE")
++            router_db = self.Router(id=uuidutils.generate_uuid(),
++                                    tenant_id=tenant_id,
++                                    name=r['name'],
++                                    admin_state_up=r['admin_state_up'],
++                                    status="ACTIVE")
+             context.session.add(router_db)
+             if has_gw_info:
+                 self._update_router_gw_info(context, router_db['id'], gw_info)
+@@ -237,7 +242,10 @@
+             if vpnservice:
+                 vpnservice.check_router_in_use(context, id)
+ 
+-            # delete any gw port
++            context.session.delete(router)
++
++            # Delete the gw port after the router has been removed to
++            # avoid a constraint violation.
+             device_filter = {'device_id': [id],
+                              'device_owner': [DEVICE_OWNER_ROUTER_GW]}
+             ports = self._core_plugin.get_ports(context.elevated(),
+@@ -246,7 +254,6 @@
+                 self._core_plugin._delete_port(context.elevated(),
+                                                ports[0]['id'])
+ 
+-            context.session.delete(router)
+         self.l3_rpc_notifier.router_deleted(context, id)
+ 
+     def get_router(self, context, id, fields=None):
+@@ -257,7 +264,7 @@
+                     sorts=None, limit=None, marker=None,
+                     page_reverse=False):
+         marker_obj = self._get_marker_obj(context, 'router', limit, marker)
+-        return self._get_collection(context, Router,
++        return self._get_collection(context, self.Router,
+                                     self._make_router_dict,
+                                     filters=filters, fields=fields,
+                                     sorts=sorts,
+@@ -266,14 +273,14 @@
+                                     page_reverse=page_reverse)
+ 
+     def get_routers_count(self, context, filters=None):
+-        return self._get_collection_count(context, Router,
++        return self._get_collection_count(context, self.Router,
+                                           filters=filters)
+ 
+     def _check_for_dup_router_subnet(self, context, router_id,
+                                      network_id, subnet_id, subnet_cidr):
+         try:
+-            rport_qry = context.session.query(models_v2.Port)
+-            rports = rport_qry.filter_by(device_id=router_id)
++            filters = {'device_id': [router_id]}
++            rports = self._core_plugin.get_ports(context, filters)
+             # It's possible these ports are on the same network, but
+             # different subnets.
+             new_ipnet = netaddr.IPNetwork(subnet_cidr)
+@@ -329,8 +336,11 @@
+                                                   port['network_id'],
+                                                   subnet['id'],
+                                                   subnet['cidr'])
+-                port.update({'device_id': router_id,
+-                             'device_owner': DEVICE_OWNER_ROUTER_INTF})
++                self._core_plugin.update_port(context,
++                                              interface_info['port_id'],
++                                              {'device_id': router_id,
++                                               'device_owner':
++                                               DEVICE_OWNER_ROUTER_INTF})
+         elif 'subnet_id' in interface_info:
+             subnet_id = interface_info['subnet_id']
+             subnet = self._core_plugin._get_subnet(context, subnet_id)
+@@ -372,7 +382,7 @@
+                                              subnet_id):
+         subnet_db = self._core_plugin._get_subnet(context, subnet_id)
+         subnet_cidr = netaddr.IPNetwork(subnet_db['cidr'])
+-        fip_qry = context.session.query(FloatingIP)
++        fip_qry = context.session.query(self.FloatingIP)
+         for fip_db in fip_qry.filter_by(router_id=router_id):
+             if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr:
+                 raise l3.RouterInterfaceInUseByFloatingIP(
+@@ -409,22 +419,21 @@
+             subnet = self._core_plugin._get_subnet(context, subnet_id)
+             found = False
+ 
+-            try:
+-                rport_qry = context.session.query(models_v2.Port)
+-                ports = rport_qry.filter_by(
+-                    device_id=router_id,
+-                    device_owner=DEVICE_OWNER_ROUTER_INTF,
+-                    network_id=subnet['network_id'])
+-
+-                for p in ports:
+-                    if p['fixed_ips'][0]['subnet_id'] == subnet_id:
+-                        port_id = p['id']
+-                        self._core_plugin.delete_port(context, p['id'],
+-                                                      l3_port_check=False)
+-                        found = True
+-                        break
+-            except exc.NoResultFound:
++            filters = {
++                'device_id': router_id,
++                'device_owner': DEVICE_OWNER_ROUTER_INTF,
++                'network_id': subnet['network_id']
++            }
++            ports = self._core_plugin.get_ports(context, filters)
++            if not ports:
+                 pass
++            for p in ports:
++                if p['fixed_ips'][0]['subnet_id'] == subnet_id:
++                    port_id = p['id']
++                    self._core_plugin.delete_port(context, p['id'],
++                                                  l3_port_check=False)
++                    found = True
++                    break
+ 
+             if not found:
+                 raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id,
+@@ -444,7 +453,7 @@
+ 
+     def _get_floatingip(self, context, id):
+         try:
+-            floatingip = self._get_by_id(context, FloatingIP, id)
++            floatingip = self._get_by_id(context, self.FloatingIP, id)
+         except exc.NoResultFound:
+             raise l3.FloatingIPNotFound(floatingip_id=id)
+         return floatingip
+@@ -470,19 +479,22 @@
+             raise q_exc.BadRequest(resource='floatingip', msg=msg)
+ 
+         # find router interface ports on this network
+-        router_intf_qry = context.session.query(models_v2.Port)
+-        router_intf_ports = router_intf_qry.filter_by(
+-            network_id=internal_port['network_id'],
+-            device_owner=DEVICE_OWNER_ROUTER_INTF)
+-
++        router_intf_filter = {
++            'network_id': internal_port['network_id'],
++            'device_owner': DEVICE_OWNER_ROUTER_INTF
++        }
++        router_intf_ports = self._core_plugin.get_ports(
++            context, filters=router_intf_filter)
+         for intf_p in router_intf_ports:
+             if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id:
+                 router_id = intf_p['device_id']
+-                router_gw_qry = context.session.query(models_v2.Port)
+-                has_gw_port = router_gw_qry.filter_by(
+-                    network_id=external_network_id,
+-                    device_id=router_id,
+-                    device_owner=DEVICE_OWNER_ROUTER_GW).count()
++                filters = {
++                    'network_id': external_network_id,
++                    'device_id': router_id,
++                    'device_owner': DEVICE_OWNER_ROUTER_GW
++                }
++                has_gw_port = self._core_plugin.get_ports_count(
++                    context, filters)
+                 if has_gw_port:
+                     return router_id
+ 
+@@ -556,13 +568,13 @@
+                                                     floating_network_id)
+         # confirm that this router has a floating
+         # ip enabled gateway with support for this floating IP network
+-        try:
+-            port_qry = context.elevated().session.query(models_v2.Port)
+-            port_qry.filter_by(
+-                network_id=floating_network_id,
+-                device_id=router_id,
+-                device_owner=DEVICE_OWNER_ROUTER_GW).one()
+-        except exc.NoResultFound:
++        filters = {
++            'network_id': floating_network_id,
++            'device_id': router_id,
++            'device_owner': DEVICE_OWNER_ROUTER_GW
++        }
++        ports = self._core_plugin.get_ports(context.elevated(), filters)
++        if not ports:
+             raise l3.ExternalGatewayForFloatingIPNotFound(
+                 subnet_id=internal_subnet_id,
+                 port_id=internal_port['id'])
+@@ -580,7 +592,7 @@
+                 context,
+                 fip,
+                 floatingip_db['floating_network_id'])
+-            fip_qry = context.session.query(FloatingIP)
++            fip_qry = context.session.query(self.FloatingIP)
+             try:
+                 fip_qry.filter_by(
+                     fixed_port_id=fip['port_id'],
+@@ -628,7 +640,7 @@
+ 
+             floating_fixed_ip = external_port['fixed_ips'][0]
+             floating_ip_address = floating_fixed_ip['ip_address']
+-            floatingip_db = FloatingIP(
++            floatingip_db = self.FloatingIP(
+                 id=fip_id,
+                 tenant_id=tenant_id,
+                 floating_network_id=fip['floating_network_id'],
+@@ -697,7 +709,7 @@
+                 if key in filters:
+                     filters[val] = filters.pop(key)
+ 
+-        return self._get_collection(context, FloatingIP,
++        return self._get_collection(context, self.FloatingIP,
+                                     self._make_floatingip_dict,
+                                     filters=filters, fields=fields,
+                                     sorts=sorts,
+@@ -706,7 +718,7 @@
+                                     page_reverse=page_reverse)
+ 
+     def get_floatingips_count(self, context, filters=None):
+-        return self._get_collection_count(context, FloatingIP,
++        return self._get_collection_count(context, self.FloatingIP,
+                                           filters=filters)
+ 
+     def prevent_l3_port_deletion(self, context, port_id):
+@@ -737,7 +749,7 @@
+     def disassociate_floatingips(self, context, port_id):
+         with context.session.begin(subtransactions=True):
+             try:
+-                fip_qry = context.session.query(FloatingIP)
++                fip_qry = context.session.query(self.FloatingIP)
+                 floating_ip = fip_qry.filter_by(fixed_port_id=port_id).one()
+                 router_id = floating_ip['router_id']
+                 floating_ip.update({'fixed_port_id': None,