概述
基于yoga版本学习neutron,通过源码、官方文档、部署环境进行学习
neutron-dhcp-agent
neutron.agent.dhcp_agent.main
创建server,调oslo_service launch server,最后实际调了server的start方法
neutron.service.Service.start
Service创建时会传入一个manager路径,Service.start实际会调manager的一些方法启动业务,主要调了manager的init_host和after_start方法,after_start方法默认为空,主要是init_host
neutron没有prepare_service,而是把配置项注册汇聚到一个函数,可手动尝试
start方法周期运行service的report_state方法,这个方法默认为空,应该没啥用
neutron.agent.dhcp.agent.DhcpAgentWithStateReport.__init__
neutron.agent.dhcp.agent.DhcpAgent._populate_networks_cache
DhcpAgent初始化时从neutron 拿数据放入cache
然后调Dnsmasq的existing_dhcp_networks,实际获取/var/lib/neutron/dhcp底下的形如uuid的文件名作为已存在网络id,然后用id创dhcp对象,塞到cache
neutron.agent.dhcp.agent.DhcpAgentWithStateReport.init_host
实际调用了sync_state方法
neutron.agent.dhcp.agent.DhcpAgentWithStateReport.sync_state
从cache获取已存在的网络id,cache的东西初始从/var/lib/neutron/dhcp读取目录下所有形如uuid的文件名
DhcpAgent.plugin_rpc.get_active_networks_info
plugin_rpc传入target和transport,封装了一个oslo_messaging的RPCClient,topic从neutron_lib的topics常量文件读取,是q-plugin,transport用默认的rabbit,最后通过transport发消息到target
看了下rpc可能是core_plugins启的,不知道谁调core_plugins,后面再看
neutron-l3-agent
概述
主要在after_start,init_host没啥东西
流程
neutron.cmd.eventlet.agents.l3:main ->
neutron.agent.l3_agent.main ->
neutron.agent.l3.agent.L3NATAgentWithStateReport.after_start
neutron.agent.l3.agent.L3NATAgentWithStateReport._process_routers_loop
neutron.agent.l3.agent.L3NATAgentWithStateReport._report_state
neutron.agent.l3.agent.L3NATAgentWithStateReport.pd.after_start
neutron-linuxbridge-agent
流程
neutron.cmd.eventlet.plugins.linuxbridge_neutron_agent:main ->
neutron.plugins.ml2.drivers.linuxbridge.agent.linuxbridge_neutron_agent.main ->
neutron.plugins.ml2.drivers.agent._common_agent.CommonAgentLoop.start ->
neutron.plugins.ml2.drivers.linuxbridge.agent.linuxbridge_neutron_agent.main
physical_interface_mappings和bridge_mappings从配置文件读取,冒号分隔,可能是配的,返回一个mapping
neutron.plugins.ml2.drivers.agent._common_agent.CommonAgentLoop.start
self.ext_manager.names
太难了