components/openstack/neutron/files/evs/db/l3nat.py
branchs11-update
changeset 3178 77584387a894
parent 3028 5e73a3a3f66a
child 3524 ad6a9e0880b9
child 3619 639868f63ef4
--- a/components/openstack/neutron/files/evs/db/l3nat.py	Wed Jun 11 05:34:04 2014 -0700
+++ b/components/openstack/neutron/files/evs/db/l3nat.py	Fri Jun 13 09:10:23 2014 -0700
@@ -21,19 +21,20 @@
 #
 
 """
-Based off generic l3_agent (quantum/agent/l3_agent) code
+Based off generic l3_agent (neutron/agent/l3_agent) code
 """
 
 import sqlalchemy as sa
 
-from quantum.api.v2 import attributes
-from quantum.common import constants as l3_constants
-from quantum.common import exceptions as q_exc
-from quantum.db import l3_db
-from quantum.extensions import l3
-from quantum.openstack.common import log as logging
-from quantum.openstack.common import uuidutils
-from quantum.plugins.evs.db import api as evs_db
+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__)
@@ -44,7 +45,7 @@
 
 
 class Router(evs_db.EVS_DB_BASE):
-    """Represents a v2 quantum router."""
+    """Represents a v2 neutron router."""
 
     id = sa.Column(sa.String(36), primary_key=True,
                    default=uuidutils.generate_uuid)
@@ -57,9 +58,11 @@
 
 
 class FloatingIP(evs_db.EVS_DB_BASE):
-    """Represents a floating IP, which may or many not be
-       allocated to a tenant, and may or may not be associated with
-       an internal port/ip address/router."""
+    """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)
@@ -78,16 +81,21 @@
     Router = Router
     FloatingIP = FloatingIP
 
-    def _make_router_dict(self, router, fields=None):
+    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}
+               '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):
@@ -98,13 +106,14 @@
         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):
+    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 = self._get_router(context, router_id)
+        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
@@ -139,7 +148,7 @@
                                                   subnet['cidr'])
 
             # Port has no 'tenant-id', as it is hidden from user
-            gw_port = self.create_port(context.elevated(), {
+            gw_port = self._core_plugin.create_port(context.elevated(), {
                 'port':
                 {'tenant_id': '',  # intentionally not set
                  'network_id': network_id,
@@ -150,9 +159,10 @@
                  'admin_state_up': True,
                  'name': ''}})
 
-            if not len(gw_port['fixed_ips']):
-                self.delete_port(context.elevated(), gw_port['id'],
-                                 l3_port_check=False)
+            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)
@@ -195,7 +205,7 @@
                                  router_id, interface_info)
 
     def remove_router_interface(self, context, router_id, interface_info):
-        super(EVS_L3_NAT_db_mixin, self).\
+        return super(EVS_L3_NAT_db_mixin, self).\
             remove_router_interface(evs_db.get_evs_context(context),
                                     router_id, interface_info)
 
@@ -254,51 +264,14 @@
         super(EVS_L3_NAT_db_mixin, self).\
             disassociate_floatingips(evs_db.get_evs_context(context), port_id)
 
-    def _network_is_external(self, context, net_id):
-        try:
-            evs = self.get_network(context, net_id)
-            return evs[l3.EXTERNAL]
-        except:
-            return False
-
     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_external_network_id(self, context):
-        return super(EVS_L3_NAT_db_mixin, self).\
-            get_external_network_id(evs_db.get_evs_context(context))
-
-    def _get_tenant_id_for_create(self, context, resource):
-        if context.is_admin and 'tenant_id' in resource:
-            tenant_id = resource['tenant_id']
-        elif ('tenant_id' in resource and
-              resource['tenant_id'] != context.tenant_id):
-            reason = _('Cannot create resource for another tenant')
-            raise q_exc.AdminRequired(reason=reason)
-        else:
-            tenant_id = context.tenant_id
-        return tenant_id
-
     def _get_by_id(self, context, model, id):
         return context.session.query(model).\
             filter(model.id == id).one()
 
-    def _get_network(self, context, network_id):
-        return self.get_network(context, network_id)
-
-    def _get_subnet(self, context, subnet_id):
-        return self.get_subnet(context, subnet_id)
-
-    def _get_port(self, context, port_id):
-        return self.get_port(context, port_id)
-
-    def _delete_port(self, context, port_id):
-        return self.delete_port(context, port_id)
-
-    def _get_subnets_by_network(self, context, network_id):
-        return self.get_subnets(context, filters={'network_id': network_id})
-
     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