Quota的概念
和Openstack其他组件的Quota概念类似,Neutron中的Quota向管理员提供了控制租客资源的机制,这些资源包括floatingip,router,network等。
Quota的数据库结构
非常简单
各个字段的意义:
id:quota的uuid
tenant_id:租客id
resource:资源,比如floatingip, router, network
limit:每个resource的配额
Quota的工作流程
Quota Driver
默认的,Neutron通过neutron.quota.ConfDriver来提供Quota的相关API,其实就是一些数据库的操作。
Quota Show
通过db中的get_tenant_quotas函数来根据tenant_id提取quota信息
Quota List
通过db中的update_quota_limit函数来update相应信息,值得注意的是,当Neutron刚刚安装完成后,数据库是空的,只有对相关的Quota进行了update操作后,在数据库中才会有相关的记录信息。
Quota Register
Neutron Quota提供了两种方法提供注册一个新的quota。由于原生的Neutron中只针对resource进行了Quota限制,而我们更希望对某一个属性进行quota limit,比如portforwardings,router_routes等,通过下面的两种方法均可对某个属性进行quota limit。
方法1 通过添加配置文件注册
通过添加配置文件注册。代码:
cfg.IntOpt('quota_port', default=50, help=_('Number of ports allowed per tenant. ' 'A negative value means unlimited.')), cfg.CONF.register_opts(quota_opts, 'QUOTAS')
通过配置文件注册Quota的方法,和其他配置文件的注册方法一样,需要注意的是,配置选项需要以quota_开头,并且注册到QUOTAS组中
方法2 直接通过代码注册
直接通过代码注册。代码:
quota.QUOTAS.register_resource_by_name("portforwardings")
其实以上两种方法最后调用的函数都是一样的,均是在QuotaEngine中的字典_resources中新添加了一个数据。
Quota Check
Quota Check即检查quota是否到达quota上限。分两步:
步骤一 取待检查的数值
取待检查的数值。代码示例:
router = self._get_service_plugin(constants.L3_ROUTER_NAT) count = quota.QUOTAS.count(context, "pfs", router, "pfs" tenant_id, **kwargs)
在上面的代码中,Quota会到router plugin中找get_xx_count的方法,这是在quota/_count_resource函数中定义的,该get_xx_count函数就是数据库的一些操作了。这样就拿到了待检查的数据了。
步骤二 进行limit_check
拿到了上面待检查的数据后,进行limit_check。代码示例:
kwargs = {PORTFOWRADINGS: count + 1} quota.QUOTAS.limit_check(context, tenant_id, **kwargs)
参数kwargs是形如{'pfs': 10}这样的字典,limit_check函数(在db/quota_db.py中)会拿着{'pfs':10}这个字典到quotas数据库中找到相应的数据,并根据key进行比较,最后判断是否超过相关的Quota。