说到APIRouter中的 plugin = manager.NeutronManager.get_plugin(),实例化一个NeutronManager并得到instance的manager,从entry_points和CONF中可以知道
self.plugin就是core_plugins下的配置,一般的我们选用ml2。
core plugin作为service plugins中的一个,因此对于manager来说除了指定core plugins还有别的plugins 需要load 进来。
self.service_plugins = {constants.CORE: self.plugin} #core plugin属于service_plugins
ml2 neutron manager初始化的时候会初始化三个manager:type_manager,extension_manager,mechanism_manager,看看setup.cfg中的
neutron.ml2.type_drivers
neutron.ml2.mechanism_drivers
neutron.ml2.extension_drivers
很快就会对应起来了
先接着看 self._load_service_plugins()#我们来重点看看这个函数做了什么
1. self._load_services_from_core_plugin()
#首先获得core plugin支持的扩展aliases 列表,其由两部分组成,_supported_extension_aliases和extension_manager.extension_aliases()
以ml2为例: _supported_extension_aliases = ["provider", "external-net", "binding",
"quotas", "security-group", "agent",
"dhcp_agent_scheduler",
"multi-provider", "allowed-address-pairs",
"extra_dhcp_opt"]
extension_manager.extension_aliases()就是拿到ml2配置中指定的cfg.CONF.ml2.extension_drivers的别名,ml2在kilo中支持的extension_drivers为:
neutron.ml2.extension_drivers =
test = neutron.tests.unit.ml2.drivers.ext_test:TestExtensionDriver
testdb = neutron.tests.unit.ml2.drivers.ext_test:TestDBExtensionDriver
port_security = neutron.plugins.ml2.extensions.port_security:PortSecurityExtensionDriver
一般来说配置文件中不配置extension_drivers
再使用sg_rpc.disable_security_group_extension_by_config(aliases) filter一下:如果防火墙没有配置就将security-group,allowed-address-pairs禁掉
如果extension_aliases在指定的(extension, service) mapping中:
EXT_TO_SERVICE_MAPPING = {
'dummy': DUMMY,
'lbaas': LOADBALANCER,
'lbaasv2': LOADBALANCERV2,
'fwaas': FIREWALL,
'vpnaas': VPN,
'metering': METERING,
'router': L3_ROUTER_NAT
}
那么说明该core plugin也支持这些service,“ self.service_plugins[service_type] = self.plugin”,即指明core_plugins提供的额外service功能
2. 找到配置的service_plugins,并放在service_plugins中
plugin_providers = cfg.CONF.service_plugins, core_plugin可能会原生支持一些service,比如vpn,metering等,如果没有看看是否配置了service_plugin
service_plugins =neutron.services.l3_router.l3_router_plugin.L3RouterPlugin(/etc/neutron/neutron.conf中)
也可以 service_plugins = router,firewall,lbaas,vpnaas,metering(entry_points中有指定)
比如配置了router之后有service_plugins[‘L3_ROUTER_NAT’]= neutron.services.l3_router.l3_router_plugin.L3RouterPlugin
plugin = manager.NeutronManager.get_plugin()之后,在APIRouter中有两句:
ext_mgr = extensions.PluginAwareExtensionManager.get_instance()
get_instance()是PluginAwareExtensionManager的类方法,cls(get_extensions_path(), manager.NeutronManager.get_service_plugins())
其中:
1. get_extensions_path()#这个返回的path包括三部分:
a. neutron/extensions,
b. (neutron_lbaas,neutron_fwaas,neutron_vpnaas 三个module,如果存在,引入其extensions,可以在setup.cfg中找到他们),
c. 以及cfg.CONF.api_extensions_path(配置文件中指明的extensions)
2. manager.NeutronManager.get_service_plugins() 上面已经提到是什么
在PluginAwareExtensionManager父类ExtensionManager中会根据这些path,将extensions load进来,同时在PluginAwareExtensionManager中check一下,
这个和前面说nova中extensions的load过程很像
ext_mgr.extend_resources("2.0", attributes.RESOURCE_ATTRIBUTE_MAP)
用attributes.RESOURCE_ATTRIBUTE_MAP更新各个extensions中的RESOURCE_ATTRIBUTE_MAP
这些attribute还挺强大的,指明了在request中的属性,有鉴权的意味,举一个例子:
'enable_dhcp': {'allow_post': True, 'allow_put': True,
'default': True,
'convert_to': convert_to_boolean,
'is_visible': True},
allow_post和allow_put表示在request中是否运行再post和put中出现,其实就表示字段是只读的还是可以更新的,还有其他的字段,什么primary_key,is_visible
等等,具体可参考code
进来一个rest call或者从client call进来会走到对应的core plugin中,比如此处的ML2Plugin中,有network,subnet,port等的所有操作,而在core plugin中会
用到前面说的type_drivers,.mechanism_drivers,extension_drivers
ML2是统一二层网络的一层,涉及到router等走extension,在service_plugins中处理,若未在配置文件中进行配置,service_plugins的功能就没有
OK!到这里,我们实际上只是从rest call 到 core plugin 再到 drivers,才开头, 但是对于配置文件neutron/neutron.conf, neutron/plugin.ini, neutron/plugins/ml2/xxx
哪些东西在哪里配已经有了大概的印象
除了ML2的plugin我们在neutron/plugins中可以看到ibm,思科,brocade等厂商的plugins,他们本身有自己的SDN解决方案用于创建网路,子网,端口等,这里用的时候
导入自己的库,用client封装起来调用,相比ml2的东西要少一些