在 L3RouterPlugin
初始化是会创建一个 DriverController
实例
neutron/service/l3_router/service_providers/driver_controller.py
作用:根据 router 的类型,为其找到合适的 provider driver,并在数据库 ProviderResourceAssociation
中记录 router id 与 driver name 的绑定
def __init__(self, l3_plugin):
self.l3_plugin = l3_plugin
self._stm = st_db.ServiceTypeManager.get_instance()
self._stm.add_provider_configuration(
constants.L3_ROUTER_NAT, _LegacyPlusProviderConfiguration())
self._load_drivers()
registry.subscribe(self._set_router_provider,
resources.ROUTER, events.PRECOMMIT_CREATE)
registry.subscribe(self._update_router_provider,
resources.ROUTER, events.PRECOMMIT_UPDATE)
registry.subscribe(self._clear_router_provider,
resources.ROUTER, events.PRECOMMIT_DELETE)
- 创建一个
ServiceTypeManager
的实例 - 调用
ServiceTypeManager.add_provider_configuration
为L3_ROUTER_NAT
增加一个配置实例 - 调用
_load_drivers
加载所有的 provider driver - 对感兴趣的资源注册监听事件:
- router : PRECOMMIT_CREATE : _set_router_provider
- router : PRECOMMIT_UPDATE : _update_router_provider
- router : PRECOMMIT_DELETE : _clear_router_provider
调用 service_base.load_drivers
加载所有的 provider driver
获取 FLAVORS plugin 实例
- 调用
_flavor_specified
检查 router 数据中是否包含flavor_id
属性 - 调用
_get_provider_for_create
获取能处理 router 属性的 provider service driver - 调用
_ensure_driver_supports_request
检查上一步获取的 driver 是否支持当前的 ha 和 distributed 的属性设定 - 调用
ServiceTypeManager.add_resource_association
创建数据库的记录(将 driver name 和 router id 绑定)
- 若 router 数据不包含
flavor_id
属性,则调用_attrs_to_driver
根据 ha 和 distributed 属性获取合适的 service provider driver - 若 router 数据包含
flavor_id
属性,则调用_get_l3_driver_by_flavor
获取支持 flavor 操作的 driver
- 调用
_is_distributed
判断 router 中是否包含distributed
属性 - 调用
_is_ha
判断 router 中是否包含ha
属性 - 调用
_is_driver_compatible
查找到支持当前属性的 driver,若查找不到则引发异常
调用 flavor plugin 的相关方法获取支持 flavor 相关操作的 driver
调用 ServiceTypeManager.del_resource_associations
删除数据库的记录(与 router id 绑定的记录)
def _update_router_provider(self, resource, event, trigger, context, router_id, router, old_router, router_db, **kwargs)
- 调用
_get_provider_for_router
获取与该 router 相关联的 service provider driver - router 不支持 flavor id 的更新
- 调用
_ensure_driver_supports_request
判断更新前为该 router 绑定的 driver 是否支持新 router 的属性,若不支持,则: - 调用
_attrs_to_driver
为新的 router 数据找到和是的 driver - 删除之前在数据库中的绑定记录,创建新的绑定记录
先查询数据库是否有为该 router 绑定过 provider driver,若有的话则返回,若没有的话则查找到合适的并创建数据库记录
根据支持该 router 的 driver,判断该 router 是否支持调度
- 调用
ServiceTypeManager.get_service_providers
获取该 service_type 的 provider - 根据获取的 provider 导入其 driver
- 调用
ServiceTypeManager.get_default_service_provider
获取其默认的 provider 名称