ml2入口:
ml2 = neutron.plugins.ml2.plugin:Ml2Plugin
首先看下ML2Plugin这个类,从__init__初始化方法看起:
def __init__(self):
# First load drivers, then initialize DB, then initialize drivers
self.type_manager = managers.TypeManager()
self.extension_manager = managers.ExtensionManager()
self.mechanism_manager = managers.MechanismManager()
super(Ml2Plugin, self).__init__()
self.type_manager.initialize()
self.extension_manager.initialize()
self.mechanism_manager.initialize()
self._setup_dhcp()
self._start_rpc_notifiers()
self.add_agent_status_check_worker(self.agent_health_check)
self.add_workers(self.mechanism_manager.get_workers())
self._verify_service_plugins_requirements()
LOG.info("Modular L2 Plugin initialization complete")
从第一行的注册就可以看懂这个方法了,“加载驱动,初始化数据库,初始化驱动”;以type为例,可以跟踪源码看一下大概过程:
进入这个方法:
self.type_manager = managers.TypeManager()
这个managers是import的,返回了一个typemanager对象实例,看下TypeManage这个类的初始化:
def __init__(self):
# Mapping from type name to DriverManager
self.drivers = {}
LOG.info("Configured type driver names: %s",
cfg.CONF.ml2.type_drivers)
super(TypeManager, self).__init__('neutron.ml2.type_drivers',
cfg.CONF.ml2.type_drivers,
invoke_on_load=True)
LOG.info("Loaded type driver names: %s", self.names())
self._register_types()
self._check_tenant_network_types(cfg.CONF.ml2.tenant_network_types)
self._check_external_network_type(cfg.CONF.ml2.external_network_type)
首先是调用父类,完成插件的加载,简单说就是通过cfg.CONF.ml2.type_drivers将配置文件(etc/neutorn/plugins/ml2/ml2_conf.ini)中的配置项type_drivers读入;继而完成注册,检查配置文件中的tenant_network_types(需同type_drivers的类型一致,不能出现额外type)和external_network_type(默认为none)。
现在返回Ml2Plugin类,_setup_dhcp()初始化组件,支持DHCP代理功能;以及开启RPC通知机制......
总之是读取两个配置文件(ml2_conf.ini和neutron.conf)的配置项完成初始化操作,详细可参考各配置项的注解。
ml2作为openstack中的core plugin,主要完成network/subnet/port的增删改查系列操作,接下来会以port为例,进行源码分析。