quota功能及代码分析.docx

上传人:b****5 文档编号:29293641 上传时间:2023-07-22 格式:DOCX 页数:21 大小:198.93KB
下载 相关 举报
quota功能及代码分析.docx_第1页
第1页 / 共21页
quota功能及代码分析.docx_第2页
第2页 / 共21页
quota功能及代码分析.docx_第3页
第3页 / 共21页
quota功能及代码分析.docx_第4页
第4页 / 共21页
quota功能及代码分析.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

quota功能及代码分析.docx

《quota功能及代码分析.docx》由会员分享,可在线阅读,更多相关《quota功能及代码分析.docx(21页珍藏版)》请在冰豆网上搜索。

quota功能及代码分析.docx

quota功能及代码分析

quota-功能及代码分析

Cinder配额使用介绍

1、封装抽象

quota相关功能实现在cinder\quota.py实现,包含了引擎、资源、驱动三个大类抽象封装。

看起来quota.py用的是设计模式“抽象工厂模式”,可选择引擎做不同的操作,引擎里又可选择驱动来操作管理资源,资源里可注册不同的配额项。

1.资源

资源其实就是对配额的封装,封装了资源名、默认值、数据库统计函数dbapi等。

资源分类列表:

类名

描述

属性

cinder.quota.BaseResource

定义单个配额资源

name(资源名)、flag(控制默认值)、parent_project_id(当前租户的附租户)、quota方法用于获取资源的使用量、default方法用户获取默认值

cinder.quota.AbsoluteResource

无预留的资源

pass无定义

cinder.quota.ReservableResource

可预留的资源

sync(dbapi方法名,统计配额使用信息。

如范例)

cinder.quota.CountableResource

可统计的资源,cinder代码里没看到使用

count(统计函数)

cinder.quota.VolumeTypeResource

为卷类型定义的资源,继承ReservableResource

volume_type_name(卷类型名)、volume_type_id(卷类型id)

注意:

●ReservableResource:

相比BaseResource,多了sync方法,sync会被驱动调用,用于在计算配额之前,先同步配额信息(到本地和数据库)。

ReservableResource只能用于project绑定的资源。

●CountableResource:

相比BaseResource,多了count方法,count方法必须给出一个函数,自己计算配额,其返回值里会包含配额实际使用值。

sync范例:

ReservableResource资源'volume'的sync:

cinder.db.sqlalchemy.api._sync_volumes:

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

cinder.quota.QuotaEngine

配额引擎,基类

cinder.quota.VolumeTypeQuotaEngine

卷类型配额引擎

'volumes',

'per_volume_gigabytes',

'snapshots',

'gigabytes',

'backups',

'backup_gigabytes'

cinder.quota.CGQuotaEngine

一致性组的配额的引擎

consistencygroups

cinder.quota.GroupQuotaEngine

组配额的引擎

groups

3.驱动

驱动是可配置的,对应配置项quota_driver,默认值是cinder.quota.DbQuotaDriver

cfg.StrOpt('quota_driver',

default="cinder.quota.DbQuotaDriver",

help='Defaultdrivertouseforquotachecks')

驱动列表:

名称

描述

cinder.quota.DbQuotaDriver

Numberofvolumegigabytesallowedpertenant

cinder.quota.NestedDbQuotaDriver

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.cinder.quota.DbQuotaDriver驱动类

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回退

2.cinder.quota.NestedDbQuotaDriver驱动类

继承cinder.quota.DbQuotaDriver。

适用于树形项目的配额管理。

咱们在目前不用树形项目。

方法名

说明

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|

+------------------------------+-------+

代码分析:

cinder.api.contrib.quotas.QuotaSetsController#defaults:

returnself._format_quota_set(id,QUOTAS.get_defaults(context,project_id=id))

#QUOTAS是类对象cinder.quota.VolumeTypeQuotaEngine()

cinder.quota.QuotaEngine#get_defaults:

defget_defaults(self,context,project_id=None):

returnself._driver.get_defaults(context,self.resources,

project_id)

_driver是cinder.quota.QuotaEngine#_driver,默认使用cinder.quota.DbQuotaDriver

@property

def_driver(self):

#_driver_class是__init__构造函数里传入设置的,没传为None

ifself._driver_class:

returnself._driver_class

ifnotself._quota_driver_class:

#读配置项cfg.StrOpt('quota_driver',default="cinder.quota.DbQuotaDriver",

self._quota_driver_class=CONF.quota_driver

ifisinstance(self._quota_driver_class,six.string_types):

#动态导入类对象

self._quota_driver_class=importutils.import_object(

self._quota_driver_class)

self._driver_class=self._quota_driver_class

returnself._driver_class

cinder.quota.DbQuotaDriver#get_defaults:

defget_defaults(self,context,resources,project_id=None):

quotas={}

default_quotas={}

#cfg.BoolOpt('use_default_quota_class',default=True,

ifCONF.use_default_quota_class:

#查询'quota_classes'表,过滤出class_name='defualt'的记录,

default_quotas=db.quota_class_get_defaults(context)

#resources来自cinder.quota.VolumeTypeQuotaEngine的@property方法

forresourceinresources.values():

ifdefault_quotas:

ifresource.namenotindefault_quotas:

versionutils.report_deprecated_feature(LOG,_(

"Defaultquotaforresource:

%(res)sisset"

"bythedefaultquotaflag:

quota_%(res)s,"

"itisnowdeprecated.Pleaseusethe"

"defaultquotaclassfordefault"

"quota.")%{'res':

resource.name})

#default_quotas的值复写resources,如果default_quotas里不包含resource,则使用resource的default属性。

default属性说明见下文!

quotas[resource.name]=default_quotas.get(resource.name,

resource.default)

returnquotas

代码可知cinder.quota.DbQuotaDriver的get_defaults方法不区分租户project_id,所以如果配置项'quota_driver'使用"cinder.quota.DbQuotaDriver",调用cinderquota-defaults${project_id} 的结果都是一样的。

cinder.quota.VolumeTypeQuotaEngine#resources:

@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.name]=resource

#查询得volume_type列表

volume_types=db.volume_type_get_all(context.get_admin_context(),

False)

forvolume_typeinvolume_types.values():

forpart_namein('volumes','gigabytes','snapshots'):

#对每一个volume_type,按照规则name="%s_%s"%(part_name,self.volume_type_name)设置resource.name

resource=VolumeTypeResource(part_name,volume_type)

result[resource.name]=resource

#返回ReservableResource和VolumeTypeResource组合的resoure列表

returnresult

####(Pdb)presult

{'per_volume_gigabytes':

,'gigabytes':

,'backup_gigabytes':

,'snapshots':

,'volumes':

,'backups':

}

ReservableResource和VolumeTypeResource对象的default属性,都继承自BaseResource。

cinder.quota.BaseResource#default:

@property

defdefault(self):

"""Returnthedefaultvalueofthequota."""

ifself.parent_project_id:

return0

#如果self.flag不是空,则返回CONF[self.flag],否则返回-1

returnCONF[self.flag]ifself.flagelse-1

总结:

●如果配置项'quota_driver'使用"cinder.quota.DbQuotaDriver"或者不配置,cinderquota-defaults指令打印结果和租户id无关。

●cinderquota-defaults指令打印列表,包含了'volumes','per_volume_gigabytes','snapshots','gigabytes','

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1