quota功能及代码分析_第1页
quota功能及代码分析_第2页
quota功能及代码分析_第3页
quota功能及代码分析_第4页
quota功能及代码分析_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Cinder 配额使用介绍一、封装抽象quota 相关功能实现在 cinderquota.py 实现,包含了 引擎、资源、驱动 三个大类抽象封装。 看起来 quota.py 用的是设计模式 “抽象工厂模式 ”,可选择引擎做不同的操作, 引擎里又可选 择驱动来操作管理资源,资源里可注册不同的配额项。资源资源其实就是对配额的封装,封装了资源名、默认值、数据库统计函数 dbapi 等。资源分类列表:类名描述属性定义单个配额资源name (资源名)、 flag(控制默 认值)、 parent_project_id (当 前租户的附租户)、 quota 方法 用于获取资源的使用量、 default 方法

2、用户获取默认值无预留的资源pass 无定义可预留的资源sync ( dbapi 方法名, 统计配额 使用信息。如范例)可统计的资源, cinder 代码里没看 到使用count (统计函数)为卷类型定义的资 源,继承 ReservableResourcevolume_type_name(卷类型名)、 volume_type_id (卷类型 id )注意:ReservableResource:相比 BaseResource,多了 sync 方法, sync 会被驱动调用,用于在计算配额之前, 先同步配额信息 (到本地和数据库) 。ReservableResource 只能用于 project 绑

3、定的资源。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) = _volum

4、e_data_get_for_project(context, project_id, volume_type_id=volume_type_id, session=session)key =volumesif volume_type_name:key += _ + volume_type_namereturn key: volumes引擎定义了资源集。调用驱动来实现查询统计功能。引擎列表:类名描述resources配额引擎,基类卷类型配额引擎volumes,per_volume_gigabytes,snapshots,gigabytes,类名描述resourcesbackups,backup

5、_gigabytes一致性组的配额的引擎consistencygroups组配额的引擎groups驱动cfg.StrOpt( quota_driver ,default =,help= Default driver to use for quota checks)驱动列表:名称描述Number of volume gigabytes allowed per tenantNumber of Block Storage snapshots allowed per tenant.、 quota 主要操作四张数据表:reservations 表,定义每个项目配额的增量。quota_usage 表,定义

6、每个项目配额的已使用量和预留量。quota_classes 表,定义了配额类的配额。操作界面上的默认配额 就是保存在这个表里。quotas 表,定义了项目的配额。是如果仅仅是调用 API接口或者 client 指令 ?openstack project create pro3? 创建项目,是不会同时创建项目对应的专用配额的。但是如果在管理界面上创建项目, horizon 会同时调 用 cinder 的 quota 接口创建三个 “ gigabytes、”“ volumes、”“ snapshots ” cind专er用配额,另外 还会调 neutron 、 nova 的配额接口创建它们专用的配

7、额。三、Quota driver介绍Driver 类关系图:1.取得单个配额方法名说明def get_by_project(self, context, project_id, resource_name)根据项目 id 、配额名称查询配 额, quotas 表def get_by_class(self, context, quota_class, resource_name)根据配额类型、配额名称查询配额, quota_classes 表def get_default(self, context, resource, project_id)根据项目 id 、配额名称查询默 认配额, quot

8、a_classes 表取得配额列表方法名说明def get_defaults(self, context, resources, project_id=None)查询默认配额列表,quota_classes 表def get_class_quotas(self, context, resources, quota_class, defaults=True)根据配额类型查询配额列表,quota_classes 表def get_project_quotas(self, context, resources, project_id, quota_class=None, defaults=True,

9、 usages=True)根据项目 id 查 quotas 表,如果 quotas 表 没 有 , 就 查 询方法名说明quota_classes 表, 得项目配额列 表3)其他方法方法名说明def _get_quotas(self, context, resources, keys, has_sync, project_id=None)用于查询指定多个配额,先查项 目 quota ,再查 quota_classesdef limit_check(self, context, resources, values, project_id=None)调用 _get_quotas ()检查 valu

10、es 是否有超过相应的配额def _reserve(self, context, resources, quotas, deltas, expire, project_id)根据增量 deltas 计算 quota_usage 表里使用量、预留量记录,插入 预留作为 reservations 字典返回。 这里没有 update 数据库。def reserve(self, context, resources, deltas, expire=None, project_id=None)调用 _reserve()计算预留、使用 量 ,作为 reservations 字典返回。def commit(

11、self, context, reservations, project_id=None)将 reservations 字典提交修改进 数据库。def rollback(self, context, reservations, project_id=None)回退之前提交修改的 reservations 。def destroy_by_project(self, context, project_id)根据 project_id 删除其所有配额def expire(self, context)把过期的 reservation 回退2.。咱们在目前不用树形项目。方法名说明def validate

12、_nested_setup(self, ctxt, resources, project_tree, fix_allocated_quotas=False)确认 project_tree 有嵌套型配 额def _get_cur_project_allocated(self, ctxt, resource, project_tree)检查当前项目的配额def get_default(self, context, resource, project_id)获得单个默认配额, 调用父类 DbQuotaDriver 方 法 get_default 。如果项目有父项 目,配额为 0。def get_de

13、faults(self, context, resources, project_id=None)获得默认配额列表, 调用父类 DbQuotaDriver 方 法 get_defaults 。如果项目有父项 目,配额列表全为 0。def _reserve(self, context, resources, quotas, deltas, expire, project_id)预留四、指令功能介绍及代码分析quotas 相关的指令:指令说明quota -class-showLists quotas for a quota class.quota -class-updateUpdates quot

14、as for a quota class.quota -defaultsLists default quotas for a tenant.quota -deleteDelete the quotas for a tenant.指令说明quota -showLists quotas for a tenant.quota -updateUpdates quotas for a tenant.quota -usageLists quota usage for a tenant.quota-class-show、quota-class-update、quota-defaults 是对 quota_c

15、lasses 表操作 ; quota-delete、quota-show、quota-update 主要对 quota 表操作 ;quota -usage 是对 quota_classes、 quota_usage 操作。1. 列出默认配额列表$ cinder quota -defaults tenantIDroot node1 # cinder quota-defaults admin+| PropertyValuebackup_gigabytesbackupsgigabytes+1000101000gigabytes_netapp_volume_type-1gigabytes_nfs_co

16、mmon-1gigabytes_vmware-1gigabytes_vmware-type-1per_volume_gigabytes-1snapshots10-1snapshots_netapp_volume_type| 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-ty

17、pe| -1 |+代码分析:return self ._format_quota_set( id , QUOTAS .get_defaults(context, project_id=id )def get_defaults(self, context, project_id=None):return self._driver.get_defaults(context, self.resources,project_id)默认使用propertydef _driver (self ):# _driver_class是 _init_ 构造函数里传入设置的,没传为 Noneif self . _d

18、river_class:return self ._driver_classif not self . _quota_driver_class:self ._quota_driver_class = CONF.quota_driverif isinstance( self ._quota_driver_class, six.string_types)# 动态导入类对象self ._quota_driver_class = importutils.import_object(self ._quota_driver_class)self ._driver_class = self ._quota_

19、driver_classreturn self ._driver_classdef get_defaults(self, context, resources, project_id=None):quotas = default_quotas = # cfg.BoolOpt(use_default_quota_class,default=True,if CONF.use_default_quota_class:# 查询 quota_classes表,过滤出 class_name = defualt 的记录,default_quotas = db.quota_class_get_defaults

20、(context)for resource in resources.values():if default_quotas:if not in default_quotas:versionutils.report_deprecated_feature(LOG, _(Default quota for resource: %(res)s is set by the default quota flag: quota_%(res)s, it is now deprecated. Please use the default quota class for default

21、 quota. ) % res : )# default_quotas 的值 复写 resources ,如果 default_quotas 里不包含 resource ,则使 用 resource 的 default 属性。 default 属性说明见下文! = default_quotas.get(,resource.default)return quotaspropertydef resources (self):Fetches all possible quota resources.result

22、 = # Global quotas.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 ,

23、quota_backup_gigabytes )# 根据上面定义的 argses 获得 ReservableResource 列表,for args in argses:resource = ReservableResource(*args) = resource# 查询得 volume_type 列表volume_types = db.volume_type_get_all(context.get_admin_context(),False )for volume_type in volume_types.values():for part_name i

24、n ( volumes , gigabytes , snapshots ):# 对每一个 volume_type ,按照规则 name = %s_%s % (part_name, self.volume_type_name) 设置 resource = VolumeTypeResource(part_name, volume_type) = resource# 返回 ReservableResource 和 VolumeTypeResource 组合的 resoure 列表return result# (Pdb) p result

25、 per_volume_gigabytes0 x98e7090 , gigabytes 0 x98e70d0 , backup_gigabytes0 x98e7150 ,snapshots 0 x98e7050 , volumes 0 x9b8ffd0 , backups 0 x98e7110 BaseResource。ReservableResource 和 VolumeTypeResource 对象的 default 属性,都继承自propertydef default (self):Return the default value of the quota.if self.parent_

26、project_id:return 0# 如果 self.flag 不是空,则返回 CONFself.flag ,否则返回 -1return CONFself.flag if self.flag else - 1总结:2. 根据 quota-class 列出 quota 列表 :$ cinder quota -class-show 代码分析:def get_class_quotas (self, context, resources, quota_class,defaults=True):Given list of resources, retrieve the quotas for give

27、n quota class.:param context: The request context, for access checks.:param resources: A dictionary of the registered resources.:param quota_class: The name of the quota class to returnquotas for.:param defaults: If True, the default value will be reportedif there is no specific value for the resour

28、ce.quotas = default_quotas = # 根据 class_name 在数据库表 quota_classes 查询出归属某类的配额属性class_quotas = db.quota_class_get_all_by_name(context, quota_class)if defaults:# 数据库表 quota_classes 查出默认类的配额属性default_quotas = db.quota_class_get_defaults(context)for resource in resources.values():# 如果有,则用 class_quotas 的元素

29、值覆盖if in class_quotas: = class_continue# 如果有,则用 default_quotas 的元素值覆盖if defaults: = default_quotas.get(,resource.default)return quotas总结:根 据 class_name 在 数 据 库 表 quota_classes 表 查 出 记 录 集 class_quotas , 再 从 class_nam

30、e=default 在数据库表 quota_classes 表查出记录集 default_quotas 。3. 根据 quota-class 列出 quota 列表 :$ cinder quota -show def get_project_quotas (self, context, resources, project_id,quota_class=None, defaults=True, usages=True):Retrieve quotas for a project.Given a list of resources, retrieve the quotas for the giv

31、enproject.:param context: The request context, for access checks.:param resources: A dictionary of the registered resources.:param project_id: The ID of the project to return quotas for.:param quota_class: If project_id != ject_id, thequota class cannot be determined. This parameter allow

32、s it to be specified. It will be ignored if project_id = ject_id.:param defaults: If True, the quota class value (or thedefault value, if there is no value from the quota class) will be reported if there is no specific value for the resource.:param usages: If True, the current in_use, res

33、erved and allocatedcounts will also be returned.quotas = # 在数据库表 quotas 根据 project_id 查询字段 hard_limitproject_quotas = db.quota_get_all_by_project(context, project_id)allocated_quotas = Nonedefault_quotas =None# API 调用的时候传入的 usages=Falseif usages:# 根据 project_id 查询数据库表 quota_usages ,获得各 quota resourc

34、e 的 in_use 和 reservedproject_usages = db.quota_usage_get_all_by_project(context,project_id)# 在数据库表 quotas 根据 project_id 查询字段 allocatedallocated_quotas = db.quota_allocated_get_all_by_project(context, project_id)allocated_quotas.pop( project_id )# Get the quotas for the appropriate class. If the proj

35、ect ID# matches the one in the context, we use the quota_class from# the context, otherwise, we use the provided quota_class (if# any)# 如果 context 有 quota_class ,用 context.quota_class 查询 class_quotasif project_id = ject_id:quota_class = context.quota_classif quota_class:class_quotas = db.

36、quota_class_get_all_by_name(context, quota_class)else :class_quotas = for resource in resources.values():# Omit default/quota class values # defaults = Trueif not defaults and not in project_quotas:continuequota_val = project_quotas.get()# 如果 project_quota 是空,用 class_quota

37、 的值赋值if quota_val is None:quota_val = class_quotas.get()的值赋值# 如果 class_quota 赋的值也是空,用 default_quotasif quota_val is None:# Lazy load the default quotasif default_quotas is None:default_quotas = self.get_defaults(context, resources, project_id)quota_val = default_quota

38、 = limit: quota_val# Include usages if desired. This is optional because one# internal consumer of this interface wants to access the # usages directly from inside a transaction.if usages: # Falseusage = project_usages.get(, ).update(in_use=usage.get(in_

39、use , 0),reserved=usage.get(reserved , 0), )if allocated_quotas:# N.update(0), )allocated=allocated_quotas.get(,return quotas总结:quota-usage 根据租户列出配额的使用量$ cinder quota -usage 核心代码跟 cinder quota -show 一样,走的是def get_project_quotas(self, context, resources, project_id,

40、quota_class=None, defaults=True,usages=True):quotas = # 在数据库表 quotas 根据 project_id 查询字段 hard_limitproject_quotas = db.quota_get_all_by_project(context, project_id)allocated_quotas = Nonedefault_quotas =None# API 调用的时候传入的 usages=Trueif usages:# 根据 project_id 查询数据库表 quota_usages ,获得各 quota resource的 i

41、n_use 和reservedproject_usages = db.quota_usage_get_all_by_project(context,project_id)查询字段 allocated# 在数据库表 quotas 根据 project_idallocated_quotas = db.quota_allocated_get_all_by_project(context, project_id)allocated_quotas.pop( project_id )# Get the quotas for the appropriate class. If the project ID# matches the one in the c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论