类似于Nova对API资源的管理方式,Neutron也将基于各种网络抽象得到的API资源分为核心资源(Core API)和扩展资源(Extension API)两种,Core资源只对应L2层的network/subnet/port三种抽象,其余各层抽象都涵盖在Extension API的范围。
Neutron API实现的主要代码位于neutron/api目录
--api_common.py -一些API实现通用的类和方法
--extensions.py
--rpc
|--agentnotifiers -通过RPC发送通知给Agent
|--handlers
--v2
|--attributes.py
|--base.py
|--resource_helper.py
|--resource.py -WSGI Resource封装代码
|--router.py
--versions.py -用户请求是版本号时,使用这个模块进行处理
--views
v2目录包括了几个L2层核心资源的实现代码。依照Openstack各个项目API的实现惯例,每个Neutron API资源都被封装成一个WSGI Application,Neutron API服务进程neutron-server接收到用户的HTTP请求后会通过Route模块将其路由到相关资源的Controller中去执行对应操作。
但是我们并没有在v2目录下发现形如network.py、subnet.py、port.py的文件去实现这几个核心资源,也没发现NetworkController/SubnetController/PortController这样的Controller类去处理具体用户请求。
这是因为对这三个核心资源来说,都使用base.py文件的类Controller去实现,只是在封成WSGI Application的时候调用这个文件的create_resource()函数根据不同的参数动态创建对应的Controller对象。
def create_resource(collection, resource, plugin, params, allow_bulk=False,
member_actions=None, parent=None, allow_pagination=False,
allow_sorting=False):
controller = Controller(plugin, collection, resource, params, allow_bulk,
member_actions=member_actions, parent=parent,
allow_pagination=allow_pagination,
allow_sorting=allow_sorting)
return wsgi_resource.Resource(controller, FAULT_MAP)
而对于其余扩展资源,Neutron依然使用传统的方式去实现,它们在neutron/extensions/目录下都分别有对应的实现文件与对应的Controller。位于neutron/api/目录下的extension.py文件只是一些基类和公用的代码。