跳转到: 导航, 搜索

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 议程和讨论

问题

  1. 对于 keystone CLI,我建议使用 JSON 进行配额的批量创建、更新和删除。我不认为这在 OpenStack 的其他地方完成过。好主意吗?坏主意吗?
    1. 邮件列表中没有人特别赞成或反对这个想法。我决定在初始实现中放弃这个想法。
  2. 我们是否只需要一个 DELETE,并在请求体中包含要删除的内容的详细信息?
    1. 请注意 HTTP 1.1 允许 DELETE 方法具有请求体。
    2. 邮件列表中对此没有评论。我将只使用一个删除操作。
  3. 使用哪个实现选项?
    1. 邮件列表中对此没有评论。我将尝试选项 1,看看它在实践中如何工作,但如果必要,将切换到选项 2。
  4. 如果在用户故事和设计部分将“配额”一词更改为“元数据”,这就会成为一个访问每个租户的元数据的通用机制。我们想要一个 Keystone 的通用元数据服务,还是坚持一个特定于配额的服务,同时保持底层实现通用?
    1. 邮件列表中对此没有评论。我将只使用一个特定于配额的服务。