class APIRouter(wsgi.Router):
@classmethod
def factory(cls, global_config, **local_config):
return cls(**local_config)
def __init__(self, **local_config):
mapper = routes_mapper.Mapper()
plugin = manager.NeutronManager.get_plugin()
ext_mgr = extensions.PluginAwareExtensionManager.get_instance()
ext_mgr.extend_resources("2.0", attributes.RESOURCE_ATTRIBUTE_MAP)
extensions.py#616
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls(get_extensions_path(),
manager.NeutronManager.get_service_plugins())
return cls._instance
#neutron.conf
#service_plugins =
#neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
#neutron.services.loadbalancer.plugin.LoadBalancerPlugin,
#neutron.services.vpn.plugin.VPNDriverPlugin,
#neutron.services.firewall.fwaas_plugin.FirewallPlugin
manager.NeutronManager.get_service_plugins()
#{'L3_ROUTER_NAT':<neutron.services.l3_router.l3_router_plugin.L3RouterPlugin object at 0x2c91850>,
#'CORE': <neutron.plugins.ml2.plugin.Ml2Plugin object at 0x3715f50>,
#'VPN': <neutron.services.vpn.plugin.VPNDriverPlugin object at 0x40c9c50>,
#'LOADBALANCER': <neutron.services.loadbalancer.plugin.LoadBalancerPlugin object at 0x3bf33d0>,
#'FIREWALL': <neutron.services.firewall.fwaas_plugin.FirewallPlugin object at 0x420b690>}
====================
#db.l3_db.py
def create_router(self, context, router):
.................router_db=Router(..) #Router class....
return self._make_router_dict(router_db, process_extensions=False)
#db.l3_db.py
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_GW_INFO: None,
'gw_port_id': router['gw_port_id']}
if router['gw_port_id']:
nw_id = router.gw_port['network_id']
res[EXTERNAL_GW_INFO] = {'network_id': nw_id}
# NOTE(salv-orlando): The following assumes this mixin is used in a
# class inheriting from CommonDbMixin, which is true for all existing
# plugins.
if process_extensions:
self._apply_dict_extend_functions(
l3.ROUTERS, res, router)
return self._fields(res, fields)
#db.db_base_plugin_v2.py
def _apply_dict_extend_functions(self, resource_type,
response, db_object): #routers,res, router
for func in self._dict_extend_functions.get(
resource_type, []):
args = (response, db_object)
if isinstance(func, basestring):
func = getattr(self, func, None)
else:
# must call unbound method - use self as 1st argument
args = (self,) + args
if func:
func(*args)
#db.db_base_plugin_v2.py ----> _dict_extend_functions={} init in CommonDbMixin class
@classmethod
def register_dict_extend_funcs(cls, resource, funcs):
cur_funcs = cls._dict_extend_functions.get(resource, [])
cur_funcs.extend(funcs)
cls._dict_extend_functions[resource] = cur_funcs
1.0 #db.extraoute_db.py
class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin):
"""Mixin class to support extra route configuration on router."""
def _extend_router_dict_extraroute(self, router_res, router_db):
router_res['routes'] = (ExtraRoute_db_mixin.
_make_extra_route_list(
router_db['route_list']
))
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
l3.ROUTERS, ['_extend_router_dict_extraroute'])
#2.0 db.l3_gwmode_db.py
class L3_NAT_db_mixin(l3_db.L3_NAT_db_mixin):
"""Mixin class to add configurable gateway modes."""
# Register dict extend functions for ports and networks
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
l3.ROUTERS, ['_extend_router_dict_gw_mode'])