所有引用代理都使用一个通用的扩展机制,该机制允许引入和启用核心资源扩展而无需更改代理代码。此机制允许单个代理同时运行多个代理扩展。这种机制对位于Neutron代码树之外的第三方扩展特别有用。
在此框架下,代理向其每个扩展公开其API,从而允许扩展访问代理内部的资源。例如,在第2层,在每个端口事件上,代理可以触发其扩展中的handle_port方法。
与代理API对象的交互顺序如下:
- 代理初始化代理API对象。
- 代理将代理API对象传递到扩展管理器中。
- 管理器将代理API对象传递到每个扩展中。
- 扩展调用新的代理API对象方法来接收(例如)分配了cookie的网桥封装器。
+-----------+
| Agent API +--------------------------------------------------+
+-----+-----+ |
| +-----------+ |
|1 +--+ Extension +--+ |
| | +-----------+ | |
+---+-+-+---+ 2 +--------------+ 3 | | 4 |
| Agent +-----+ Ext. manager +-----+--+ .... +--+-----+
+-----------+ +--------------+ | |
| +-----------+ |
+--+ Extension +--+
+-----------+
每个扩展都可通过定义在特定命名空间中的stevedore入口点引用。例如,L2扩展通过neutron.agent.l2.extensions命名空间被引用。
相关模块包括:
-
neutron_lib.agent.extension:
此模块为所有L2及L3的代理扩展定义抽象扩展接口。
-
neutron_lib.agent.l2_extension:
-
neutron_lib.agent.l3_extension:
这些模块是neutron_lib.agent.extension.AgentExtension的子类和定义特定层的抽象扩展接口。
-
neutron.agent.agent_extensions_manager:
此模块包含一个管理器,它允许扩展在运行时自行加载。
-
neutron.agent.l2.l2_agent_extensions_manager:
-
neutron.agent.l3.l3_agent_extensions_manager:
每个模块都将核心资源事件传递给已加载的扩展。
Agent API 对象
每个代理都可以将“代理API对象”传递到其扩展中,以便以可控的方式将其内部开放给它们。为适应不同的代理,每个扩展可以定义一个consume_api()方法接收代理的对象。
此代理API对象是neutron第三方公共接口的一部分。对接口的所有更改将以向后兼容的方式进行管理。
此时,在L2端,只有L2 Open vSwitch代理为扩展提供代理API对象。
相关模块包括:
- neutron_lib.agent.extension
- neutron_lib.agent.l2_extension
- neutron_lib.agent.l3_extension
- neutron.agent.agent_extensions_manager
- neutron.agent.l2.l2_agent_extensions_manager
- neutron.agent.l3.l3_agent_extensions_manager