components/openstack/neutron/files/evs/db/l3nat.py
branchs11u2-sru
changeset 4156 4b1def16fe9b
parent 4146 097063f324c0
child 4157 92532a6159e7
--- a/components/openstack/neutron/files/evs/db/l3nat.py	Thu Apr 16 01:36:32 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright 2012 Nicira Networks, Inc.  All rights reserved.
-#
-# Copyright (c) 2014, 2015, 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
-#
-#         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.
-#
-# @author: Dan Wendlandt, Nicira, Inc
-# @author: Girish Moodalbail, Oracle, Inc.
-#
-
-"""
-Based off generic l3_agent (neutron/agent/l3_agent) code
-"""
-
-import sqlalchemy as sa
-
-from neutron.api.v2 import attributes
-from neutron.common import constants as l3_constants
-from neutron.common import exceptions as q_exc
-from neutron.db import l3_db
-from neutron.extensions import l3
-from neutron.extensions import external_net
-from neutron.openstack.common import log as logging
-from neutron.openstack.common import uuidutils
-from neutron.plugins.evs.db import api as evs_db
-
-
-LOG = logging.getLogger(__name__)
-
-DEVICE_OWNER_ROUTER_INTF = l3_constants.DEVICE_OWNER_ROUTER_INTF
-DEVICE_OWNER_ROUTER_GW = l3_constants.DEVICE_OWNER_ROUTER_GW
-DEVICE_OWNER_FLOATINGIP = l3_constants.DEVICE_OWNER_FLOATINGIP
-
-
-class Router(evs_db.EVS_DB_BASE):
-    """Represents a v2 neutron router."""
-
-    id = sa.Column(sa.String(36), primary_key=True,
-                   default=uuidutils.generate_uuid)
-    name = sa.Column(sa.String(255))
-    status = sa.Column(sa.String(16))
-    admin_state_up = sa.Column(sa.Boolean)
-    tenant_id = sa.Column(sa.String(255))
-    gw_port_id = sa.Column(sa.String(36))
-    gw_port_network_id = sa.Column(sa.String(36))
-
-
-class FloatingIP(evs_db.EVS_DB_BASE):
-    """Represents a floating IP address.
-
-    This IP address may or may not be allocated to a tenant, and may or
-    may not be associated with an internal port/ip address/router.
-    """
-
-    id = sa.Column(sa.String(36), primary_key=True,
-                   default=uuidutils.generate_uuid)
-    floating_ip_address = sa.Column(sa.String(64), nullable=False)
-    floating_network_id = sa.Column(sa.String(36), nullable=False)
-    floating_port_id = sa.Column(sa.String(36), nullable=False)
-    fixed_port_id = sa.Column(sa.String(36))
-    fixed_ip_address = sa.Column(sa.String(64))
-    router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id'))
-    tenant_id = sa.Column(sa.String(255))
-
-
-class EVS_L3_NAT_db_mixin(l3_db.L3_NAT_db_mixin):
-    """Mixin class to add L3/NAT router methods"""
-
-    Router = Router
-    FloatingIP = FloatingIP
-
-    def _make_router_dict(self, router, fields=None,
-                          process_extensions=True):
-        res = {'id': router['id'],
-               'name': router['name'],
-               'tenant_id': router['tenant_id'],
-               'admin_state_up': router['admin_state_up'],
-               'status': router['status'],
-               'external_gateway_info': None,
-               'gw_port_id': router['gw_port_id']}
-        if router['gw_port_id']:
-            nw_id = router['gw_port_network_id']
-            res['external_gateway_info'] = {'network_id': nw_id}
-        if process_extensions:
-            self._apply_dict_extend_functions(
-                l3.ROUTERS, res, router)
-        return self._fields(res, fields)
-
-    def create_router(self, context, router):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            create_router(evs_db.get_evs_context(context), router)
-
-    def update_router(self, context, id, router):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            update_router(evs_db.get_evs_context(context), id, router)
-
-    def _update_router_gw_info(self, context, router_id, info, router=None):
-        """This method overrides the base class method and it's contents
-        are exactly same as the base class method except that the Router
-        DB columns are different for EVS and OVS"""
-
-        router = router or self._get_router(context, router_id)
-        gw_port_id = router['gw_port_id']
-        # network_id attribute is required by API, so it must be present
-        gw_port_network_id = router['gw_port_network_id']
-
-        network_id = info.get('network_id', None) if info else None
-        if network_id:
-            self._get_network(context, network_id)
-            if not self._network_is_external(context, network_id):
-                msg = _("Network %s is not a valid external "
-                        "network") % network_id
-                raise q_exc.BadRequest(resource='router', msg=msg)
-
-        # figure out if we need to delete existing port
-        if gw_port_id and gw_port_network_id != network_id:
-            fip_count = self.get_floatingips_count(context.elevated(),
-                                                   {'router_id': [router_id]})
-            if fip_count:
-                raise l3.RouterExternalGatewayInUseByFloatingIp(
-                    router_id=router_id, net_id=gw_port_network_id)
-            with context.session.begin(subtransactions=True):
-                router['gw_port_id'] = None
-                router['gw_port_network_id'] = None
-                context.session.add(router)
-            self.delete_port(context.elevated(), gw_port_id,
-                             l3_port_check=False)
-
-        if network_id is not None and (gw_port_id is None or
-                                       gw_port_network_id != network_id):
-            subnets = self._get_subnets_by_network(context,
-                                                   network_id)
-            for subnet in subnets:
-                self._check_for_dup_router_subnet(context, router_id,
-                                                  network_id, subnet['id'],
-                                                  subnet['cidr'])
-
-            # Port has no 'tenant-id', as it is hidden from user
-            gw_port = self._core_plugin.create_port(context.elevated(), {
-                'port':
-                {'tenant_id': '',  # intentionally not set
-                 'network_id': network_id,
-                 'mac_address': attributes.ATTR_NOT_SPECIFIED,
-                 'fixed_ips': attributes.ATTR_NOT_SPECIFIED,
-                 'device_id': router_id,
-                 'device_owner': DEVICE_OWNER_ROUTER_GW,
-                 'admin_state_up': True,
-                 'name': ''}})
-
-            if not gw_port['fixed_ips']:
-                self._core_plugin.delete_port(context.elevated(),
-                                              gw_port['id'],
-                                              l3_port_check=False)
-                msg = (_('No IPs available for external network %s') %
-                       network_id)
-                raise q_exc.BadRequest(resource='router', msg=msg)
-
-            with context.session.begin(subtransactions=True):
-                router['gw_port_id'] = gw_port['id']
-                router['gw_port_network_id'] = gw_port['network_id']
-                context.session.add(router)
-
-    def delete_router(self, context, id):
-        super(EVS_L3_NAT_db_mixin, self).\
-            delete_router(evs_db.get_evs_context(context), id)
-
-    def get_router(self, context, id, fields=None):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            get_router(evs_db.get_evs_context(context), id, fields)
-
-    def get_routers(self, context, filters=None, fields=None,
-                    sorts=None, limit=None, marker=None, page_reverse=False):
-
-        query = evs_db.get_session().query(self.Router)
-        if filters is not None:
-            for key, value in filters.iteritems():
-                column = getattr(self.Router, key, None)
-                if column:
-                    query = query.filter(column.in_(value))
-
-        routers = query.all()
-        retlist = []
-        for router in routers:
-            retlist.append(self._make_router_dict(router, fields))
-        return retlist
-
-    def get_routers_count(self, context, filters=None):
-        return len(self.get_routers(context, filters))
-
-    def add_router_interface(self, context, router_id, interface_info):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            add_router_interface(evs_db.get_evs_context(context),
-                                 router_id, interface_info)
-
-    def remove_router_interface(self, context, router_id, interface_info):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            remove_router_interface(evs_db.get_evs_context(context),
-                                    router_id, interface_info)
-
-    def create_floatingip(self, context, floatingip):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            create_floatingip(evs_db.get_evs_context(context), floatingip)
-
-    def update_floatingip(self, context, id, floatingip):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            update_floatingip(evs_db.get_evs_context(context), id, floatingip)
-
-    def delete_floatingip(self, context, id):
-        super(EVS_L3_NAT_db_mixin, self).\
-            delete_floatingip(evs_db.get_evs_context(context), id)
-
-    def get_floatingip(self, context, id, fields=None):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            get_floatingip(evs_db.get_evs_context(context), id, fields)
-
-    def get_floatingips(self, context, filters=None, fields=None,
-                        sorts=None, limit=None, marker=None,
-                        page_reverse=False):
-
-        query = evs_db.get_session().query(self.FloatingIP)
-        if filters:
-            for key, value in filters.iteritems():
-                column = getattr(self.FloatingIP, key, None)
-                if column:
-                    query = query.filter(column.in_(value))
-
-        floatingips = query.all()
-        retlist = []
-        for floatingip in floatingips:
-            retlist.append(self._make_floatingip_dict(floatingip, fields))
-        return retlist
-
-    def get_floatingips_count(self, context, filters=None):
-        return len(self.get_floatingips(context, filters))
-
-    def prevent_l3_port_deletion(self, context, port_id):
-        """ Checks to make sure a port is allowed to be deleted, raising
-        an exception if this is not the case.  This should be called by
-        any plugin when the API requests the deletion of a port, since
-        some ports for L3 are not intended to be deleted directly via a
-        DELETE to /ports, but rather via other API calls that perform the
-        proper deletion checks.
-        """
-        port = self.get_port(context, port_id)
-        if not port:
-            return
-        if port['device_owner'] in [DEVICE_OWNER_ROUTER_INTF,
-                                    DEVICE_OWNER_ROUTER_GW,
-                                    DEVICE_OWNER_FLOATINGIP]:
-            raise l3.L3PortInUse(port_id=port_id,
-                                 device_owner=port['device_owner'])
-
-    def disassociate_floatingips(self, context, port_id):
-        super(EVS_L3_NAT_db_mixin, self).\
-            disassociate_floatingips(evs_db.get_evs_context(context), port_id)
-
-    def get_sync_data(self, context, router_ids=None, active=None):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            get_sync_data(evs_db.get_evs_context(context), router_ids, active)
-
-    def _get_by_id(self, context, model, id):
-        return context.session.query(model).\
-            filter(model.id == id).one()
-
-    def allow_l3_port_deletion(self, context, port_id):
-        """ If an L3 agent is using this port, then we need to send
-        a notification to L3 agent to release the port before we can
-        delete the port"""
-        pass