版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Cinder 配額使用介紹一、封裝抽象quota 相關(guān)功能實(shí)現(xiàn)在 cinderquota.py 實(shí)現(xiàn),包含了 引擎、資源、驅(qū)動(dòng) 三個(gè)大類抽象封裝。 看起來(lái) quota.py 用的是設(shè)計(jì)模式 “抽象工廠模式 ”,可選擇引擎做不同的操作, 引擎里又可選 擇驅(qū)動(dòng)來(lái)操作管理資源,資源里可注冊(cè)不同的配額項(xiàng)。資源資源其實(shí)就是對(duì)配額的封裝,封裝了資源名、默認(rèn)值、數(shù)據(jù)庫(kù)統(tǒng)計(jì)函數(shù) dbapi 等。資源分類列表:類名描述屬性定義單個(gè)配額資源name (資源名)、 flag(控制默 認(rèn)值)、 parent_project_id (當(dāng) 前租戶的附租戶)、 quota 方法 用于獲取資源的使用量、 default 方法
2、用戶獲取默認(rèn)值無(wú)預(yù)留的資源pass 無(wú)定義可預(yù)留的資源sync ( dbapi 方法名, 統(tǒng)計(jì)配額 使用信息。如范例)可統(tǒng)計(jì)的資源, cinder 代碼里沒看 到使用count (統(tǒng)計(jì)函數(shù))為卷類型定義的資 源,繼承 ReservableResourcevolume_type_name(卷類型名)、 volume_type_id (卷類型 id )注意:ReservableResource:相比 BaseResource,多了 sync 方法, sync 會(huì)被驅(qū)動(dòng)調(diào)用,用于在計(jì)算配額之前, 先同步配額信息 (到本地和數(shù)據(jù)庫(kù)) 。ReservableResource 只能用于 project 綁
3、定的資源。CountableResource:相比 BaseResource,多了 count 方法, count 方法必須給出一個(gè)函 數(shù),自己計(jì)算配額,其返回值里會(huì)包含配額實(shí)際使用值。sync 范例: ReservableResource 資源 volume 的 sync:def _sync_volumes (context, project_id, session, volume_type_id=None,volume_type_name=None):# 根據(jù) volume_type_id 和 project_id 統(tǒng)計(jì)卷數(shù)量和卷空間使用量(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引擎定義了資源集。調(diào)用驅(qū)動(dòng)來(lái)實(shí)現(xiàn)查詢統(tǒng)計(jì)功能。引擎列表:類名描述resources配額引擎,基類卷類型配額引擎volumes,per_volume_gigabytes,snapshots,gigabytes,類名描述resourcesbackups,backup
5、_gigabytes一致性組的配額的引擎consistencygroups組配額的引擎groups驅(qū)動(dòng)cfg.StrOpt( quota_driver ,default =,help= Default driver to use for quota checks)驅(qū)動(dòng)列表:名稱描述Number of volume gigabytes allowed per tenantNumber of Block Storage snapshots allowed per tenant.、 quota 主要操作四張數(shù)據(jù)表:reservations 表,定義每個(gè)項(xiàng)目配額的增量。quota_usage 表,定義
6、每個(gè)項(xiàng)目配額的已使用量和預(yù)留量。quota_classes 表,定義了配額類的配額。操作界面上的默認(rèn)配額 就是保存在這個(gè)表里。quotas 表,定義了項(xiàng)目的配額。是如果僅僅是調(diào)用 API接口或者 client 指令 ?openstack project create pro3? 創(chuàng)建項(xiàng)目,是不會(huì)同時(shí)創(chuàng)建項(xiàng)目對(duì)應(yīng)的專用配額的。但是如果在管理界面上創(chuàng)建項(xiàng)目, horizon 會(huì)同時(shí)調(diào) 用 cinder 的 quota 接口創(chuàng)建三個(gè) “ gigabytes、”“ volumes、”“ snapshots ” cind專er用配額,另外 還會(huì)調(diào) neutron 、 nova 的配額接口創(chuàng)建它們專用的配
7、額。三、Quota driver介紹Driver 類關(guān)系圖:1.取得單個(gè)配額方法名說(shuō)明def get_by_project(self, context, project_id, resource_name)根據(jù)項(xiàng)目 id 、配額名稱查詢配 額, quotas 表def get_by_class(self, context, quota_class, resource_name)根據(jù)配額類型、配額名稱查詢配額, quota_classes 表def get_default(self, context, resource, project_id)根據(jù)項(xiàng)目 id 、配額名稱查詢默 認(rèn)配額, quot
8、a_classes 表取得配額列表方法名說(shuō)明def get_defaults(self, context, resources, project_id=None)查詢默認(rèn)配額列表,quota_classes 表def get_class_quotas(self, context, resources, quota_class, defaults=True)根據(jù)配額類型查詢配額列表,quota_classes 表def get_project_quotas(self, context, resources, project_id, quota_class=None, defaults=True,
9、 usages=True)根據(jù)項(xiàng)目 id 查 quotas 表,如果 quotas 表 沒 有 , 就 查 詢方法名說(shuō)明quota_classes 表, 得項(xiàng)目配額列 表3)其他方法方法名說(shuō)明def _get_quotas(self, context, resources, keys, has_sync, project_id=None)用于查詢指定多個(gè)配額,先查項(xiàng) 目 quota ,再查 quota_classesdef limit_check(self, context, resources, values, project_id=None)調(diào)用 _get_quotas ()檢查 valu
10、es 是否有超過(guò)相應(yīng)的配額def _reserve(self, context, resources, quotas, deltas, expire, project_id)根據(jù)增量 deltas 計(jì)算 quota_usage 表里使用量、預(yù)留量記錄,插入 預(yù)留作為 reservations 字典返回。 這里沒有 update 數(shù)據(jù)庫(kù)。def reserve(self, context, resources, deltas, expire=None, project_id=None)調(diào)用 _reserve()計(jì)算預(yù)留、使用 量 ,作為 reservations 字典返回。def commit(
11、self, context, reservations, project_id=None)將 reservations 字典提交修改進(jìn) 數(shù)據(jù)庫(kù)。def rollback(self, context, reservations, project_id=None)回退之前提交修改的 reservations 。def destroy_by_project(self, context, project_id)根據(jù) project_id 刪除其所有配額def expire(self, context)把過(guò)期的 reservation 回退2.。咱們?cè)谀壳安挥脴湫雾?xiàng)目。方法名說(shuō)明def validate
12、_nested_setup(self, ctxt, resources, project_tree, fix_allocated_quotas=False)確認(rèn) project_tree 有嵌套型配 額def _get_cur_project_allocated(self, ctxt, resource, project_tree)檢查當(dāng)前項(xiàng)目的配額def get_default(self, context, resource, project_id)獲得單個(gè)默認(rèn)配額, 調(diào)用父類 DbQuotaDriver 方 法 get_default 。如果項(xiàng)目有父項(xiàng) 目,配額為 0。def get_de
13、faults(self, context, resources, project_id=None)獲得默認(rèn)配額列表, 調(diào)用父類 DbQuotaDriver 方 法 get_defaults 。如果項(xiàng)目有父項(xiàng) 目,配額列表全為 0。def _reserve(self, context, resources, quotas, deltas, expire, project_id)預(yù)留四、指令功能介紹及代碼分析quotas 相關(guān)的指令:指令說(shuō)明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.指令說(shuō)明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 是對(duì) quota_c
15、lasses 表操作 ; quota-delete、quota-show、quota-update 主要對(duì) quota 表操作 ;quota -usage 是對(duì) quota_classes、 quota_usage 操作。1. 列出默認(rèn)配額列表$ 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)默認(rèn)使用propertydef _driver (self ):# _driver_class是 _init_ 構(gòu)造函數(shù)里傳入設(shè)置的,沒傳為 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)# 動(dòng)態(tài)導(dǎo)入類對(duì)象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表,過(guò)濾出 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 的值 復(fù)寫 resources ,如果 default_quotas 里不包含 resource ,則使 用 resource 的 default 屬性。 default 屬性說(shuō)明見下文! = 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 )# 根據(jù)上面定義的 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 ):# 對(duì)每一個(gè) volume_type ,按照規(guī)則 name = %s_%s % (part_name, self.volume_type_name) 設(shè)置 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 對(duì)象的 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總結(jié):2. 根據(jù) 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 = # 根據(jù) class_name 在數(shù)據(jù)庫(kù)表 quota_classes 查詢出歸屬某類的配額屬性class_quotas = db.quota_class_get_all_by_name(context, quota_class)if defaults:# 數(shù)據(jù)庫(kù)表 quota_classes 查出默認(rèn)類的配額屬性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總結(jié):根 據(jù) class_name 在 數(shù) 據(jù) 庫(kù) 表 quota_classes 表 查 出 記 錄 集 class_quotas , 再 從 class_nam
30、e=default 在數(shù)據(jù)庫(kù)表 quota_classes 表查出記錄集 default_quotas 。3. 根據(jù) 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 = # 在數(shù)據(jù)庫(kù)表 quotas 根據(jù) project_id 查詢字段 hard_limitproject_quotas = db.quota_get_all_by_project(context, project_id)allocated_quotas = Nonedefault_quotas =None# API 調(diào)用的時(shí)候傳入的 usages=Falseif usages:# 根據(jù) project_id 查詢數(shù)據(jù)庫(kù)表 quota_usages ,獲得各 quota resourc
34、e 的 in_use 和 reservedproject_usages = db.quota_usage_get_all_by_project(context,project_id)# 在數(shù)據(jù)庫(kù)表 quotas 根據(jù) 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總結(jié):quota-usage 根據(jù)租戶列出配額的使用量$ cinder quota -usage 核心代碼跟 cinder quota -show 一樣,走的是def get_project_quotas(self, context, resources, project_id,
40、quota_class=None, defaults=True,usages=True):quotas = # 在數(shù)據(jù)庫(kù)表 quotas 根據(jù) project_id 查詢字段 hard_limitproject_quotas = db.quota_get_all_by_project(context, project_id)allocated_quotas = Nonedefault_quotas =None# API 調(diào)用的時(shí)候傳入的 usages=Trueif usages:# 根據(jù) project_id 查詢數(shù)據(jù)庫(kù)表 quota_usages ,獲得各 quota resource的 i
41、n_use 和reservedproject_usages = db.quota_usage_get_all_by_project(context,project_id)查詢字段 allocated# 在數(shù)據(jù)庫(kù)表 quotas 根據(jù) 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026北京市第十九中學(xué)招聘?jìng)淇碱}庫(kù)及完整答案詳解1套
- 生物多樣性與農(nóng)業(yè)韌性研究
- 基于開源模型的智能客服系統(tǒng)構(gòu)建-第3篇
- 2026年1月廣東深圳大學(xué)附屬實(shí)驗(yàn)中學(xué)選聘教師2人備考題庫(kù)及1套參考答案詳解
- 量子糾纏態(tài)制備與傳輸結(jié)合
- 水務(wù)工程項(xiàng)目進(jìn)度控制與質(zhì)量保證方案
- 成語(yǔ)分類大全及應(yīng)用實(shí)例
- 會(huì)議英語(yǔ)常用表達(dá)及商務(wù)溝通技巧
- ISO9001質(zhì)量管理體系內(nèi)審指南
- 網(wǎng)絡(luò)借貸風(fēng)險(xiǎn)傳染機(jī)制研究
- 民航概論教學(xué)課件
- DBJT15-212-2021 智慧排水建設(shè)技術(shù)規(guī)范
- 民俗學(xué)課件萬(wàn)建中
- 能源與動(dòng)力工程專業(yè)培養(yǎng)目標(biāo)合理性評(píng)價(jià)分析報(bào)告
- 公司員工活動(dòng)室管理制度
- 2025年水晶手鏈?zhǔn)袌?chǎng)需求分析
- CJ/T 3066-1997內(nèi)磁水處理器
- 院內(nèi)急重癥快速反應(yīng)小組
- 湖南省省情試題及答案
- 幕墻玻璃板塊平整度檢查
- 船舶與海上技術(shù) 海上安全 氣脹式救生裝置用充氣系統(tǒng) 征求意見稿
評(píng)論
0/150
提交評(píng)論