Neutron中的Quota

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。


你可能感兴趣的:(Neutron中的Quota)