Neutron配额管理源码分析




本文基于Mitaka版本源码进行分析。

Neutron跟Nova的配额管理流程有一些不同,但设计思想都是类似的。

相关命令

相关配置项

默认配额是在neutron.conf中配置的,具体配置项如下,没有加入到配置项里面的,用default_quota配置项的值作为默认配额,需注意’track_quota_usage’的默认值为True。

其他配置项不用管,实际上neutron.conf中[quotas]段不需要进行配置,除非你想对network、subnet、port等资源设置不同的默认配额。

相关数据库表

quotas:保存租户各种资源(network、port等)配额限制信息

quotausages:保存租户各种资源的配额使用量信息

reservations:保存资源预留信息(预留过期时间),一般是操作过程中用到,操作结束后清理

resourcedeltas:同上,保存资源预留信息(预留资源量)

配额使用量查询

Mitaka版本没有提供,据说Pike版本提供了,http://www.cnblogs.com/sammyliu/p/7453548.html,但没有来及的分析源码。

也就是说没有API用来查询配额使用量,在做相关web或者对外API开发的时候就比较郁闷了,只能自己增加接口,直接查询quotausages表,或者直接在相关资源的表如ports中统计使用量。

配额管理流程

以network为例,其他资源管理流程基本完全相同。API请求转发流程可以参考:http://aspirer.wang/?p=690

资源注册

router中注册network的controller过程中会同步注册到配额管理模块,

–> neutron.api.v2.router.APIRouter:

–> neutron.quota.resource_registry.register_resource_by_name –> neutron.quota.resource_registry.ResourceRegistry#register_resource_by_name –> neutron.quota.resource_registry.ResourceRegistry#_create_resource_instance:

其中_tracked_resource_mappings属性的初始化流程是:

–> neutron.plugins.ml2.plugin.Ml2Plugin#__init__:

–> neutron.quota.resource_registry.tracked_resources:

–> neutron.quota.resource_registry.ResourceRegistry#set_tracked_resource:

数据库表内容变更回调注册

–> neutron.api.v2.router.APIRouter#__init__:

–> neutron.quota.resource_registry.register_resource_by_name –> neutron.quota.resource_registry.ResourceRegistry#register_resource_by_name –> neutron.quota.resource_registry.ResourceRegistry#register_resource –> neutron.quota.resource.TrackedResource#register_events:

–> neutron.quota.resource.TrackedResource#_db_event_handler:

 

创建

neutron.api.v2.base.Controller#create –> neutron.api.v2.base.Controller#_create:

–> neutron.db.quota.driver.DbQuotaDriver#make_reservation:

–> neutron.db.quota.api.create_reservation:

回到开始的地方–> neutron.api.v2.base.Controller#_create:创建network成功后,发送notify消息,并提交配额变更,

–> neutron.db.quota.driver.DbQuotaDriver#commit_reservation:

–> neutron.quota.resource_registry.set_resources_dirty:

–> neutron.quota.resource.TrackedResource#dirty&#mark_dirty:

从上面的代码可以看出,实际上提交变更只是清理了资源预留表记录,并修改quotausages表中相关resource和tenant记录的dirty字段,并没有修改in_use字段。

删除

neutron.api.v2.base.Controller#delete  –> neutron.api.v2.base.Controller#_delete:

这里也跟创建流程类似,没有修改in_use字段。

修改

update方法中也是调用set_resources_dirty方法,同删除流程。

查询

index方法调用到_items

–> neutron.api.v2.base.Controller#_items:

–> neutron.quota.resource_registry.resync_resource:

上面的res变量是一个neutron.quota.resource.TrackedResource对象,

–> neutron.quota.resource.TrackedResource#resync&_resync&_set_quota_usage:

–> neutron.db.quota.api.set_quota_usage:

也就是说真正修改quotausages表中in_use字段的操作是index,也就是列出网络等资源,对应的命令时neutron net-list或neutron xxx-list。

show方法没有涉及到quota操作。