KeystoneStoreQuotaData
- Launchpad 条目: KeystoneSpec:store-quota-data
- 创建时间: 2012年5月9日
- 贡献者: Everett Toews
总结
为了能够在不同的 OpenStack 组件中使用配额,我们需要集中存储和访问它们。Keystone 可以用作这个中央数据存储。
发布说明
租户的配额信息可以在 Keystone 中存储和访问。
原理
配额对于防止过度消耗资源是必要的。
用户故事
1. 管理员想要操作 Swift 中单个资源的配额,例如允许的总存储量(以字节为单位,因为这是 Swift 的粒度级别),用于 Swift 中的租户/帐户。管理员通过 keystone 客户端中的一些仅限管理员的子命令访问配额信息。
有关子命令详细信息,请参阅设计。
keystone quota-set <tenant-id> swift.total=1073741824 keystone quota-get <tenant-id> swift.total keystone quota-delete <tenant-id> swift.total
2. 管理员想要操作 Nova 中多个资源的配额,例如租户中的内存和实例,以及获取或删除所有 Swift 配额。管理员通过 keystone 客户端中的一些仅限管理员的子命令访问配额信息。
keystone quota-set <tenant-id> swift.total=1073741824 nova.cores=100 nova.instances=20 keystone quota-get <tenant-id> swift keystone quota-delete <tenant-id> swift
设计
此功能的命令行界面将是
usage: keystone quota-set <tenant-id> <quota> [<quota> ...] Set quota(s) for a specific tenant Positional arguments: <tenant-id> Tenant ID to create the quota(s) for <quota> The quota to create for single or multiple resources. For a single resource the format is a dot notation (e.g. swift.total=1000). For multiple resources use multiple quotas (e.g. nova.ram nova.cores).
usage: keystone quota-get <tenant-id> [<quota> ...] Get quota(s) for a specific tenant Optional arguments: <quota> The quota to get for single or multiple resources. For a single resource the format is a dot notation (e.g. swift.total). For all resources for an OpenStack component use the name prefix (e.g. nova). To get all resources exclude this argument. Positional arguments: <tenant-id> Tenant ID to get the quota for
usage: keystone quota-delete <tenant-id> [<quota> ...] Delete quota(s) for a specific tenant Optional arguments: <quota> The quota to delete for single or multiple resources. For a single resource the format is a dot notation (e.g. swift.total=1000). For all resources for an OpenStack component use the name prefix (e.g. nova). To delete all resources exclude this argument. Positional arguments: <tenant-id> Tenant ID to delete the quota(s) for
此功能的 RESTful API 将是
| 动词 | URI |
| GET | /tenants/{tenant_id}/quotas |
| GET | /tenants/{tenant_id}/quotas/{quota} |
| PUT | /tenants/{tenant_id}/quotas |
| DELETE | /tenants/{tenant_id}/quotas |
| DELETE | /tenants/{tenant_id}/quotas/{quota} |
实现
对于在 SQL 后端存储数据,我提出两个选项。
1. 将数据存储在当前元数据表中。
对于想要存储每个租户的元数据行,我将使用一个静态 user_id(例如 'metadata_per_tenant')。例如 user_id='metadata_per_tenant', tenant_id='55b6d515e00e48c38e2c92d27dc5c03e', data='{"quota": ...}'
如果通过 SQL 检索配额,它将如下所示:
select data from metadata where user_id='metadata_per_tenant' and tenant_id='55b6d515e00e48c38e2c92d27dc5c03e';
2. 将数据存储在一个新的 metadata_per_tenant 表中。
我将创建一个新的 metadata_per_tenant 表。
CREATE TABLE `metadata_per_tenant` ( `tenant_id` varchar(64) NOT NULL, `key` varchar(255) DEFAULT NULL, `value` text, PRIMARY KEY (`tenant_id`), CONSTRAINT `metadata_per_tenant_ibfk_1` FOREIGN KEY (`tenant_id`) REFERENCES `tenant` (`id`) );
SQL 后端的实现将驱动其他后端的实现。
RESTful API 和命令行界面的实现将遵循既定的模式。
UI 变更
设计部分几乎涵盖了所有内容。
迁移
如果使用实现中的选项 2,可能需要数据库迁移。
测试/演示计划
这不必在规范接近 Beta 之前添加或完成。
未解决的问题
最终我们需要一个蓝图/规范,用于通过 Horizon 访问配额。
BoF 议程和讨论
问题
- 对于 keystone CLI,我建议使用 JSON 进行配额的批量创建、更新和删除。我不认为这在 OpenStack 的其他地方完成过。好主意吗?坏主意吗?
- 邮件列表中没有人特别赞成或反对这个想法。我决定在初始实现中放弃这个想法。
- 我们是否只需要一个 DELETE,并在请求体中包含要删除的内容的详细信息?
- 请注意 HTTP 1.1 允许 DELETE 方法具有请求体。
- 邮件列表中对此没有评论。我将只使用一个删除操作。
- 使用哪个实现选项?
- 邮件列表中对此没有评论。我将尝试选项 1,看看它在实践中如何工作,但如果必要,将切换到选项 2。
- 如果在用户故事和设计部分将“配额”一词更改为“元数据”,这就会成为一个访问每个租户的元数据的通用机制。我们想要一个 Keystone 的通用元数据服务,还是坚持一个特定于配额的服务,同时保持底层实现通用?
- 邮件列表中对此没有评论。我将只使用一个特定于配额的服务。