🪐
OpenStack 源码分析之 Neutron
  • 前言
  • 整体结构
  • bin
  • doc
  • etc
    • init.d/
    • neutron/
    • api-paste.ini
    • dhcp_agent.ini
    • fwaas_driver.ini
    • l3_agent.ini
    • lbaas_agent.ini
    • metadata_agent.ini
    • metering_agent.ini
    • vpn_agent.ini
    • neutron.conf
    • policy.json
    • rootwrap.conf
    • services.conf
  • neutron
    • agent
      • common/
      • linux/
      • metadata/
      • dhcp_agent.py
      • firewall.py
      • l2population_rpc.py
      • l3_agent.py
      • l3_ha_agent.py
      • netns_cleanup_util.py
      • ovs_cleanup_util.py
      • rpc.py
      • securitygroups_rpc.py
    • api
      • rpc
      • v2
      • views
      • api_common.py
      • extensions.py
      • versions.py
    • cmd
    • common
      • config.py
      • constants.py
      • exceptions.py
      • ipv6_utils.py
      • log.py
      • rpc.py
      • test_lib.py
      • topics.py
      • utils.py
    • db
      • agents_db.py
      • agentschedulers_db.py
      • api.py
      • common_db_mixin.py
      • db_base_plugin_v2.py
      • migration
      • model_base.py
      • models_v2.py
      • securitygroups_rpc_base.py
      • sqlalchemyutils.py
      • 扩展资源和操作类
        • allowedaddresspairs_db.py
        • dvr_mac_db.py
        • external_net_db.py
        • extradhcpopt_db.py
        • extraroute_db.py
        • firewall
        • l3_agentschedulers_db.py
        • l3_attrs_db.py
        • l3_db.py
        • l3_dvr_db.py
        • l3_dvrscheduler_db.py
        • l3_gwmode_db.py
        • l3_hamode_db.py
        • l3_hascheduler_db.py
        • loadbalancer
        • metering
        • portbindings_base.py
        • portbindings_db.py
        • portsecurity_db.py
        • quota_db.py
        • routedserviceinsertion_db.py
        • routerservicetype_db.py
        • securitygroups_db.py
        • servicetype_db.py
        • vpn
    • debug
      • commands.py
      • debug_agent.py
      • shell.py
    • extensions
      • agent.py
      • allowedaddresspairs.py
      • dhcpagentscheduler.py
      • dvr.py
      • external_net.py
      • extraroute.py
      • extra_dhcp_opt.py
      • firewall.py
      • flavor.py
      • l3.py
      • l3agentscheduler.py
      • l3_ext_gw_mode.py
      • l3_ext_ha_mode.py
      • lbaas_agentscheduler.py
      • loadbalancer.py
      • metering.py
      • multiprovidernet.py
      • portbindings.py
      • portsecurity.py
      • providernet.py
      • quotasv2.py
      • routedserviceinsertion.py
      • routerservicetype.py
      • securitygroup.py
      • servicetype.py
      • vpnaas.py
      • init.py
    • hacking
      • checks.py
      • init.py
    • locale
    • notifiers
      • nova.py
      • init.py
    • openstack
      • common
        • cache
        • context.py
        • eventlet_backdoor.py
        • fileutils.py
        • fixture
        • local.py
        • lockutils.py
        • log.py
        • loopingcall.py
        • middleware
        • periodic_task.py
        • policy.py
        • processutils.py
        • service.py
        • systemd.py
        • threadgroup.py
        • uuidutils.py
        • versionutils.py
        • _i18n.py
    • plugins
      • bigswitch
        • agent
        • config.py
        • db
        • extensions
        • l3_router_plugin.py
        • plugin.py
        • routerrule_db.py
        • servermanager.py
        • tests
        • vcsversion.py
        • version.py
        • init.py
      • brocade
        • db
        • NeutronPlugin.py
        • nos
        • tests
        • vlanbm.py
        • init.py
      • cisco
        • cfg_agent
        • common
        • db
        • extensions
        • l2device_plugin_base.py
        • l3
        • models
        • n1kv
        • network_plugin.py
        • service_plugins
        • init.py
      • common
        • constants.py
        • utils.py
        • init.py
      • embrane
        • agent
        • base_plugin.py
        • common
        • l2base
        • plugins
        • init.py
      • hyperv
        • agent
        • agent_notifier_api.py
        • common
        • db.py
        • hyperv_neutron_plugin.py
        • model.py
        • rpc_callbacks.py
        • init.py
      • ibm
        • agent
        • common
        • sdnve_api.py
        • sdnve_api_fake.py
        • sdnve_neutron_plugin.py
      • linuxbridge
        • agent
        • common
        • db
        • init.py
      • metaplugin
        • common
        • meta_db_v2.py
        • meta_models_v2.py
        • meta_neutron_plugin.py
        • proxy_neutron_plugin.py
        • init.py
      • midonet
        • agent
        • common
        • midonet_lib.py
        • plugin.py
        • init.py
      • ml2
        • common
        • config.py
        • db.py
        • drivers
        • driver_api.py
        • driver_context.py
        • managers.py
        • models.py
        • plugin.py
        • rpc.py
      • mlnx
        • agent
        • agent_notify_api.py
        • common
        • db
        • mlnx_plugin.py
        • rpc_callbacks.py
        • init.py
      • nec
        • agent
        • common
        • db
        • drivers
        • extensions
        • nec_plugin.py
        • nec_router.py
        • ofc_driver_base.py
        • ofc_manager.py
        • packet_filter.py
        • router_drivers.py
        • init.py
      • nuage
        • common
        • extensions
        • nuagedb.py
        • nuage_models.py
        • plugin.py
        • syncmanager.py
        • init.py
      • ofagent
        • agent
        • common
      • oneconvergence
        • agent
        • lib
        • plugin.py
        • init.py
      • opencontrail
        • common
        • contrail_plugin.py
        • init.py
      • openvswitch
        • agent
        • common
        • ovs_models_v2.py
        • init.py
      • plumgrid
        • common
        • drivers
        • plumgrid_plugin
        • init.py
      • sriovnicagent
        • common
        • eswitch_manager.py
        • pci_lib.py
        • sriov_nic_agent.py
        • init.py
      • vmware
        • api_client
        • check_nsx_config.py
        • common
        • dbexts
        • dhcpmeta_modes.py
        • dhcp_meta
        • extensions
        • nsxlib
        • nsx_cluster.py
        • plugin.py
        • plugins
        • shell
        • vshield
        • init.py
    • scheduler
      • dhcp_agent_scheduler.py
      • l3_agent_scheduler.py
    • server
    • service.py
    • services
      • firewall
        • agents
        • drivers
        • fwaas_plugin.py
      • l3_router
        • brocade
        • l3_apic.py
        • l3_arista.py
        • l3_router_plugin.py
        • init.py
      • loadbalancer
        • agent
        • agent_scheduler.py
        • constants.py
        • drivers
        • plugin.py
      • metering
        • agents
        • drivers
        • metering_plugin.py
      • provider_configuration.py
      • service_base.py
      • vpn
        • agent.py
        • common
        • device_drivers
        • plugin.py
        • service_drivers
        • init.py
      • init.py
    • tests
      • base.py
      • common
        • agents
        • init.py
      • etc
        • rootwrap.d
      • fake_notifier.py
      • functional
        • agent
        • base.py
        • contrib
        • db
        • sanity
        • init.py
      • post_mortem_debug.py
      • tools.py
      • unit
      • var
      • init.py
    • auth.py
    • context.py
    • hooks.py
    • i18n.py
    • manager.py
    • neutron_plugin_base_v2.py
    • policy.py
    • quota.py
    • service.py
    • version.py
    • wsgi.py
  • rally-jobs
    • extra
      • README.rst
    • plugins
      • README.rst
      • init.py
    • neutron-neutron.yaml
    • README.rst
  • tools
    • check_bash.sh
    • check_i18n.py
    • check_i18n_test_case.txt
    • clean.sh
    • i18n_cfg.py
    • install_venv.py
    • install_venv_common.py
    • pretty_tox.sh
    • with_venv.sh
  • 理解代码
    • 调用逻辑
    • REST API 专题
    • RPC 专题
      • agent RPC
      • plugin RPC
      • neutron-server RPC
    • Plugin 专题
    • Extension 专题
    • Agent 专题
    • Driver 专题
Powered by GitBook
On this page

Was this helpful?

  1. etc

api-paste.ini

定义了WSGI应用和路由信息。利用Paste来实例化Neutron的APIRouter类,将资源(端口、网络、子网)映射到URL上,以及各个资源的控制器。 在neutron-server启动的时候,一般会指定参数--config-file neutron.conf --config-file xxx.ini。看neutron/server/init.py的代码: main()主程序中会调用config.parse(sys.argv[1:])来读取这些配置文件中的信息。而api-paste.ini信息中定义了neutron、neutronapi_v2_0、若干filter和两个app。

[composite:neutron]
use = egg:Paste#urlmap
/: neutronversions
/v2.0: neutronapi_v2_0

[composite:neutronapi_v2_0]
use = call:neutron.auth:pipeline_factory
noauth = request_id catch_errors extensions neutronapiapp_v2_0
keystone = request_id catch_errors authtoken keystonecontext extensions neutronapiapp_v2_0

[filter:request_id]
paste.filter_factory = oslo.middleware:RequestId.factory

[filter:catch_errors]
paste.filter_factory = oslo.middleware:CatchErrors.factory

[filter:keystonecontext]
paste.filter_factory = neutron.auth:NeutronKeystoneContext.factory

[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory

[filter:extensions]
paste.filter_factory = neutron.api.extensions:plugin_aware_extension_middleware_factory

[app:neutronversions]
paste.app_factory = neutron.api.versions:Versions.factory

[app:neutronapiapp_v2_0]
paste.app_factory = neutron.api.v2.router:APIRouter.factory

neutron-server在读取完配置信息后,会执行neutron/common/config.py:load_paste_app(“neutron”),即将neutron应用load进来。从api-paste.ini中可以看到,neutron实际上是一个composite,分别将URL“/”和“/v2.0”映射到neutronversions应用和neutronapi_v2_0(也是一个composite)。

前者实际上调用了 neutron.api.versions 模块中的 Versions.factory 来处理传入的请求。

后者则要复杂一些,首先调用 neutron.auth 模块中的pipeline_factory 处理。如果是 noauth,则传入参数为 request_id,catch_errors,extensions 这些 filter和 neutronapiapp_v2_0 应用;如果是 keystone,则多传入一个 authtoken filter,最后一个参数仍然是 neutronapiapp_v2_0 应用。来看 neutron.auth 模块中的 pipeline_factory 处理代码。

def pipeline_factory(loader, global_conf, **local_conf):
    """Create a paste pipeline based on the 'auth_strategy' config option."""
    pipeline = local_conf[cfg.CONF.auth_strategy]
    pipeline = pipeline.split()
    filters = [loader.get_filter(n) for n in pipeline[:-1]]
    app = loader.get_app(pipeline[-1])
    filters.reverse()
    for filter in filters:
        app = filter(app)
    return app

最终的代码入口是neutron.api.v2.router:APIRouter.factory。该方法主要代码为

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)

        col_kwargs = dict(collection_actions=COLLECTION_ACTIONS,
                          member_actions=MEMBER_ACTIONS)

        def _map_resource(collection, resource, params, parent=None):
            allow_bulk = cfg.CONF.allow_bulk
            allow_pagination = cfg.CONF.allow_pagination
            allow_sorting = cfg.CONF.allow_sorting
            controller = base.create_resource(
                collection, resource, plugin, params, allow_bulk=allow_bulk,
                parent=parent, allow_pagination=allow_pagination,
                allow_sorting=allow_sorting)
            path_prefix = None
            if parent:
                path_prefix = "/%s/{%s_id}/%s" % (parent['collection_name'],
                                                  parent['member_name'],
                                                  collection)
            mapper_kwargs = dict(controller=controller,
                                 requirements=REQUIREMENTS,
                                 path_prefix=path_prefix,
                                 **col_kwargs)
            return mapper.collection(collection, resource,
                                     **mapper_kwargs)

        mapper.connect('index', '/', controller=Index(RESOURCES))
        for resource in RESOURCES:
            _map_resource(RESOURCES[resource], resource,
                          attributes.RESOURCE_ATTRIBUTE_MAP.get(
                              RESOURCES[resource], dict()))

        for resource in SUB_RESOURCES:
            _map_resource(SUB_RESOURCES[resource]['collection_name'], resource,
                          attributes.RESOURCE_ATTRIBUTE_MAP.get(
                              SUB_RESOURCES[resource]['collection_name'],
                              dict()),
                          SUB_RESOURCES[resource]['parent'])

neutron server启动后,根据配置文件动态加载对应的core plugin 和 service plugin。neturon server 中会对收到的 rest api 请求进行解析,并最终转换成对该 plugin(core or service) 中相应方法的调用。

Previousneutron/Nextdhcp_agent.ini

Last updated 5 years ago

Was this helpful?