quota 功能及代码分析.docx
- 文档编号:25515866
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:17
- 大小:19.93KB
quota 功能及代码分析.docx
《quota 功能及代码分析.docx》由会员分享,可在线阅读,更多相关《quota 功能及代码分析.docx(17页珍藏版)》请在冰豆网上搜索。
quota功能及代码分析
Cinder配额使用介绍
1、封装抽象
quota相关功能实现在cinder\实现,包含了引擎、资源、驱动三个大类抽象封装。
看起来用的是设计模式“抽象工厂模式”,可选择引擎做不同的操作,引擎里又可选择驱动来操作管理资源,资源里可注册不同的配额项。
1.资源
资源其实就是对配额的封装,封装了资源名、默认值、数据库统计函数dbapi等。
资源分类列表:
类名
描述
属性
定义单个配额资源
name(资源名)、flag(控制默认值)、parent_project_id(当前租户的附租户)、quota方法用于获取资源的使用量、default方法用户获取默认值
无预留的资源
pass无定义
可预留的资源
sync(dbapi方法名,统计配额使用信息。
如范例)
可统计的资源,cinder代码里没看到使用
count(统计函数)
为卷类型定义的资源,继承ReservableResource
volume_type_name(卷类型名)、volume_type_id(卷类型id)
注意:
ReservableResource:
相比BaseResource,多了sync方法,sync会被驱动调用,用于在计算配额之前,先同步配额信息(到本地和数据库)。
ReservableResource只能用于project绑定的资源。
CountableResource:
相比BaseResource,多了count方法,count方法必须给出一个函数,自己计算配额,其返回值里会包含配额实际使用值。
sync范例:
ReservableResource资源'volume'的sync:
:
def_sync_volumes(context,project_id,session,volume_type_id=None,
volume_type_name=None):
#根据volume_type_id和project_id统计卷数量和卷空间使用量
(volumes,_gigs)=_volume_data_get_for_project(
context,project_id,volume_type_id=volume_type_id,session=session)
key='volumes'
ifvolume_type_name:
key+='_'+volume_type_name
return{key:
volumes}
2.引擎
定义了资源集。
调用驱动来实现查询统计功能。
引擎列表:
类名
描述
resources
配额引擎,基类
卷类型配额引擎
'volumes',
'per_volume_gigabytes',
'snapshots',
'gigabytes',
'backups',
'backup_gigabytes'
一致性组的配额的引擎
consistencygroups
组配额的引擎
groups
3.驱动
('quota_driver',
default=,
help='Defaultdrivertouseforquotachecks')
驱动列表:
名称
描述
Numberofvolumegigabytesallowedpertenant
NumberofBlockStoragesnapshotsallowedpertenant.
2、quota主要操作四张数据表:
1.reservations表,定义每个项目配额的增量。
2.quota_usage表,定义每个项目配额的已使用量和预留量。
3.quota_classes表,定义了配额类的配额。
操作界面上的默认配额就是保存在这个表里。
4.quotas表,定义了项目的配额。
是如果仅仅是调用API接口或者client指令?
openstackprojectcreatepro3?
创建项目,是不会同时创建项目对应的专用配额的。
但是如果在管理界面上创建项目,horizon会同时调用cinder的quota接口创建三个“gigabytes”、“volumes”、“snapshots”cinder专用配额,另外还会调neutron、nova的配额接口创建它们专用的配额。
3、Quotadriver介绍
Driver类关系图:
1)取得单个配额
方法名
说明
defget_by_project(self,context,project_id,resource_name)
根据项目id、配额名称查询配额,quotas表
defget_by_class(self,context,quota_class,resource_name)
根据配额类型、配额名称查询配额,quota_classes表
defget_default(self,context,resource,project_id)
根据项目id、配额名称查询默认配额,quota_classes表
2)取得配额列表
方法名
说明
defget_defaults(self,context,resources,project_id=None)
查询默认配额列表,quota_classes表
defget_class_quotas(self,context,resources,quota_class,defaults=True)
根据配额类型查询配额列表,quota_classes表
defget_project_quotas(self,context,resources,project_id,quota_class=None,defaults=True,usages=True)
根据项目id查quotas表,如果quotas表没有,就查询quota_classes表,得项目配额列表
3)其他方法
方法名
说明
def_get_quotas(self,context,resources,keys,has_sync,project_id=None)
用于查询指定多个配额,先查项目quota,再查quota_classes
deflimit_check(self,context,resources,values,project_id=None)
调用_get_quotas()检查values是否有超过相应的配额
def_reserve(self,context,resources,quotas,deltas,expire,project_id)
根据增量deltas计算quota_usage表里使用量、预留量记录,插入预留作为reservations字典返回。
这里没有update数据库。
defreserve(self,context,resources,deltas,expire=None,project_id=None)
调用_reserve()计算预留、使用量,作为reservations字典返回。
defcommit(self,context,reservations,project_id=None)
将reservations字典提交修改进数据库。
defrollback(self,context,reservations,project_id=None)
回退之前提交修改的reservations。
defdestroy_by_project(self,context,project_id)
根据project_id删除其所有配额
defexpire(self,context)
把过期的reservation回退
。
咱们在目前不用树形项目。
方法名
说明
defvalidate_nested_setup(self,ctxt,resources,project_tree,fix_allocated_quotas=False)
确认project_tree有嵌套型配额
def_get_cur_project_allocated(self,ctxt,resource,project_tree)
检查当前项目的配额
defget_default(self,context,resource,project_id)
获得单个默认配额,调用父类DbQuotaDriver方法get_default。
如果项目有父项目,配额为0。
defget_defaults(self,context,resources,project_id=None)
获得默认配额列表,调用父类DbQuotaDriver方法get_defaults。
如果项目有父项目,配额列表全为0。
def_reserve(self,context,resources,quotas,deltas,expire,project_id)
预留
4、指令功能介绍及代码分析
quotas相关的指令:
指令
说明
quota-class-show
Listsquotasforaquotaclass.
quota-class-update
Updatesquotasforaquotaclass.
quota-defaults
Listsdefaultquotasforatenant.
quota-delete
Deletethequotasforatenant.
quota-show
Listsquotasforatenant.
quota-update
Updatesquotasforatenant.
quota-usage
Listsquotausageforatenant.
quota-class-show、quota-class-update、quota-defaults是对quota_classes表操作;
quota-delete、quota-show、quota-update主要对quota表操作;
quota-usage是对quota_classes、quota_usage操作。
1.列出默认配额列表
$cinderquota-defaultstenantID
[root@node1~]#cinderquota-defaultsadmin
+------------------------------+-------+
|Property|Value|
+------------------------------+-------+
|backup_gigabytes|1000|
|backups|10|
|gigabytes|1000|
|gigabytes_netapp_volume_type|-1|
|gigabytes_nfs_common|-1|
|gigabytes_vmware|-1|
|gigabytes_vmware-type|-1|
|per_volume_gigabytes|-1|
|snapshots|10|
|snapshots_netapp_volume_type|-1|
|snapshots_nfs_common|-1|
|snapshots_vmware|-1|
|snapshots_vmware-type|-1|
|volumes|10|
|volumes_netapp_volume_type|-1|
|volumes_nfs_common|-1|
|volumes_vmware|-1|
|volumes_vmware-type|-1|
+------------------------------+-------+
代码分析:
return(id,(context,project_id=id))
defget_defaults(self,context,project_id=None):
return,
project_id)
默认使用
@property
def_driver(self):
#_driver_class是__init__构造函数里传入设置的,没传为None
if:
return
ifnot:
=
ifisinstance,:
#动态导入类对象
=(
=
return
defget_defaults(self,context,resources,project_id=None):
quotas={}
default_quotas={}
#('use_default_quota_class',default=True,
if:
#查询'quota_classes'表,过滤出class_name='defualt'的记录,
default_quotas=(context)
forresourcein():
ifdefault_quotas:
ifnotindefault_quotas:
(LOG,_(
"Defaultquotaforresource:
%(res)sisset"
"bythedefaultquotaflag:
quota_%(res)s,"
"itisnowdeprecated.Pleaseusethe"
"defaultquotaclassfordefault"
"quota.")%{'res':
})
#default_quotas的值复写resources,如果default_quotas里不包含resource,则使用resource的default属性。
default属性说明见下文!
quotas[]=,
returnquotas
@property
defresources(self):
"""Fetchesallpossiblequotaresources."""
result={}
#Globalquotas.
argses=[('volumes','_sync_volumes','quota_volumes'),
('per_volume_gigabytes',None,'per_volume_size_limit'),
('snapshots','_sync_snapshots','quota_snapshots'),
('gigabytes','_sync_gigabytes','quota_gigabytes'),
('backups','_sync_backups','quota_backups'),
('backup_gigabytes','_sync_backup_gigabytes',
'quota_backup_gigabytes')]
#根据上面定义的argses获得ReservableResource列表,
forargsinargses:
resource=ReservableResource(*args)
result[]=resource
#查询得volume_type列表
volume_types=(),
False)
forvolume_typein():
forpart_namein('volumes','gigabytes','snapshots'):
#对每一个volume_type,按照规则name="%s_%s"%(part_name,设置
resource=VolumeTypeResource(part_name,volume_type)
result[]=resource
#返回ReservableResource和VolumeTypeResource组合的resoure列表
returnresult
####(Pdb)presult
{'per_volume_gigabytes'0x98e7090>,'gigabytes'0x98e70d0>,'backup_gigabytes'0x98e7150>,'snapshots'0x98e7050>,'volumes'0x9b8ffd0>,'backups'0x98e7110>}
ReservableResource和VolumeTypeResource对象的default属性,都继承自BaseResource。
@property
defdefault(self):
"""Returnthedefaultvalueofthequota."""
if:
return0
#如果不是空,则返回CONF[],否则返回-1
returnCONF[]ifelse-1
总结:
2.根据quota-class列出quota列表:
$cinderquota-class-show
代码分析:
:
defget_class_quotas(self,context,resources,quota_class,
defaults=True):
"""Givenlistofresources,retrievethequotasforgivenquotaclass.
:
paramcontext:
Therequestcontext,foraccesschecks.
:
paramresources:
Adictionaryoftheregisteredresources.
:
paramquota_class:
Thenameofthequotaclasstoreturn
quotasfor.
:
paramdefaults:
IfTrue,thedefaultvaluewillbereported
ifthereisnospecificvalueforthe
resource.
"""
quotas={}
default_quotas={}
#根据class_name在数据库表quota_classes查询出归属某类的配额属性
class_quotas=(context,quota_class)
ifdefaults:
#数据库表quota_classes查出默认类的配额属性
default_quotas=(context)
forresourcein():
#如果有,则用class_quotas的元素值覆盖
ifinclass_quotas:
quotas[]=class_quotas[]
continue
#如果有,则用default_quotas的元素值覆盖
ifdefaults:
quotas[]=,
returnquotas
总结:
根据class_name在数据库表quota_classes表查出记录集class_quotas,再从class_name='default'在数据库表quota_classes表查出记录集default_quotas。
3.根据quota-class列出quota列表:
$cinderquota-show
defget_project_quotas(self,context,resources,project_id,
quota_class=None,defaults=True,
usages=True):
"""Retrievequotasforaproject.
Givenalistofresources,retrievethequotasforthegiven
project.
:
paramcontext:
Therequestcontext,foraccesschecks.
:
paramresources:
Adictionaryoftheregisteredresources.
:
paramproject_id:
TheIDoftheprojecttoreturnquotasfor.
:
paramquota_class:
Ifproject_id!
=,the
quotaclasscannotbedetermined.This
parameterallowsittobespecified.It
willbeignoredifproject_id==
.
:
paramdefaults:
IfTrue,thequotaclassvalue(orthe
defaultvalue,ifthereisnovaluefromthe
quotaclass)willbereportedifthereisno
specificvaluefortheresource.
:
paramusages:
IfTrue,thecurrentin_use,reservedandallocated
countswillalsobereturned.
"""
quotas={}
#在数据库表quotas根据project_id查询字段hard_limit
project_quotas=(context,project_id)
allocated_quotas=None
default_quotas=None
#API调用的时候传入的usages=False
ifusages:
#根据project_id查询数据库表quota_usages,获得各quotaresource的in_use和reserved
project_usages=(context,
project_id)
#在数据库表quotas根据project_id查询字段allocated
allocated_quotas=(
context,project_id)
('project_id')
#Getthequotasfortheappropriateclass.IftheprojectID
#matchestheone
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- quota 功能及代码分析 功能 代码 分析