neutron surround you(2)

来源:互联网 发布:知果果 知呱呱 编辑:程序博客网 时间:2024/06/15 17:31

说到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的东西要少一些


0 0