Swift組件是Openstack的Object Storage Service(Object Storage)解決方案。在早期的版本中,swift對於配額是沒有限制的,不能夠對不同使用者所使用的空間進行限制。後來出現了開源的中介軟體 swquota(https://github.com/cschwede/swquota)可以對swift做出配額的限制,如今在2013年4月發布的Grizzly版本Openstack中,swift(1.8.0)整合了swquota中介軟體,以下是對此功能的初步探究。
在新版本的swift中的配額主要體現在Container Quotas與Account Quotas兩個功能上,分別是對Container和Account上傳檔案的大小、個數等方面進行限制,需要使用此功能首先要在/etc/swift/proxy-server.conf檔案中進行配置,修改完後重啟swift服務:
#1.修改[pipeline:main]
[pipeline:main]
pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth account-quotas container-quotas proxy-logging proxy-server
#2.加入[filter:container-quotas]與[filter:account-quotas]
[filter:container-quotas]
use = egg:swift#container_quotas
[filter:account-quotas]
use = egg:swift#account_quotas
配置重啟完畢,需要對配額進行設定,這個過程需要設定reseller使用者角色
1. 假定添加名為bingo的tenant
keystone --os-username admin --os_password adminpwd --os_tenant_name admin --os_auth_url http://localhost:5000/v2.0 tenant-create --name bingo --description bingo_tenant --enabled true
2.在bingo下添加使用者reseller
keystone --os-username admin --os_password adminpwd --os_tenant_name admin --os_auth_url http://localhost:5000/v2.0 user-create --name reseller --tenant-id tenant_id --pass bingo --email bingo@example.com --enabled true
3.將reseller加入ResellerAdmin角色中
keystone role-list
keystone user-role-add --user-id xxxxx --role-id xxxxx --tenant-id xxxxx
添加reseller使用者之後就可以設定相關的配額了:
Container_Quotas:
1. X-Container-Meta-Quota-Bytes -- 目標container可上傳的最大位元組數
2. X-Container-Meta-Quota-Count -- 目標container可上傳的最大檔案個數
Account_Quotas:
1. X-Account-Meta-Quota-Bytes -- 單個上傳最大位元組數
2. Quota-Byes -- 1必須配合2才能有效果
設定方法:
swift -V 2 -A http://192.168.65.203:5000/v2.0 -U test:reseller -K reseller post -m quota-bytes:5000
註:reseller使用者必須在ResellerAdmin角色中,這個限額只針對test tenant有效
取消設定
swift -V 2 -A http://192.168.65.203:5000/v2.0 -U test:reseller -K reseller post -m quota-bytes:
Bug fix:
使用keystone做認證時,針對Quota-Byes設定可能會出現 [403 Forbidden] 錯誤
修改swift/common/middleware/account_quotas.py
檔案
new_quota = request.headers.get('X-Account-Meta-Quota-Bytes')#Add by kevin starteccp_roles = request.environ.get('HTTP_X_ROLES', '')if isinstance(eccp_roles, basestring): if (set(eccp_roles.split(',')) & set({'reseller','reseller_admin','ResellerAdmin'})): request.environ['reseller_request'] = True#Add by kevin endif request.environ.get('reseller_request') is True: if new_quota and not new_quota.isdigit(): return HTTPBadRequest() return self.app
使得當使用者加入ResellerAdmin角色之後能夠通過驗證。
另外需要注意的是在實驗過程中不斷髮生swift與keystone驗證401 Unauthorized的問題,經調試發現是keystone中關於swift的endpoint的註冊IP地址使用的是虛擬機器分配的地址(本人是在虛擬機器的環境下再安裝虛擬機器實驗,所以第一層虛擬機器的地址是由openstack自動分配的fixed ip10.0.0.x類型,這樣其他幾台機器如果通過這個地址進行許可權驗證就可能出現問題,解決方案是將endpoint的地址修改為浮動ip),使用winpdb( http://winpdb.org/ )進行調試是非常不錯的。
Good luck