资源提供者 - 按请求过滤的资源提供者

https://blueprints.launchpad.net/nova/+spec/resource-providers-get-by-request

此蓝图旨在修改资源提供者 REST 资源的 POST 方法,使其返回能够支持请求的资源类列表的资源提供者列表。

问题描述

目前没有办法通过验证各自的库存能够支持现有分配加上请求的开销,来获取能够满足一组请求资源的资源提供者列表。这项工作是调度器能够调用 Placement API 以在调用过滤器之前缩小可接受主机列表的必要前提。

用例

无。

提议的变更

我们建议更改现有的 /resource_providers REST 资源,以支持一个提供请求体的方法,该请求体将描述所需资源类数量的列表,并返回支持这些数量的资源提供者列表。

为了明确起见,判断资源提供者是否可接受的数学公式是,对于每个资源类,获取相关的库存,查找该库存的分配情况,并确保库存的可用资源量大于或等于请求的量,同时考虑定义的分配比例和保留大小。

备选方案

有很多方法可以提供获取资源提供者列表的解决方案,但鉴于我们更倾向于审查实现而不是纠结哪个 HTTP 方法或哪个 REST 资源最好,我更愿意在下面添加免责声明。

数据模型影响

无。

REST API 影响

警告

以下 REST API 提案是一个可能的解决方案,将在实现期间进行审查。这意味着 REST 资源或 HTTP 方法最终可能在 Nova 树中不同,这意味着此规范将在后续更改中进行修订。

以下新的 REST API 调用将被修改

POST /resource_providers

该 /resource_providers REST 资源的 POST 方法现在将接受 URI 中的一个名为“request”的新查询字符串,该字符串将返回接受资源需求列表的所有资源提供者列表。

示例

POST /resource_providers?request

请求体必须符合以下 JSONSchema 文档

{
    "type": "object",
    "properties": {
       "resources": {
         "type": "object",
         "patternProperties": {
           "^[0-9a-fA-F-]+$": {
             "type": "object",
             "patternProperties": {
               "^[A-Z_]+$": {"type": "integer"}
             }
           },
           "additionalProperties": false
         }
    },
    "required": [
        "resources"
    ]
    "additionalProperties": False
}

例如,请求 VCPU 和 RAM 的请求体如下所示

POST /resource_providers?request
{
   "resources": {
     "VCPU": 2,
     "MEMORY_MB": 1024
   }
}

响应将是

200 OK
Content-Type: application/json

{
  "resource_providers": [
    {
      "uuid": "b6b065cc-fcd9-4342-a7b0-2aed2d146518",
      "name": "RBD volume group",
      "generation": 12,
      "links": [
         {
           "rel": "self",
           "href": "/resource_providers/b6b065cc-fcd9-4342-a7b0-2aed2d146518"
         },
         {
           "rel": "inventories",
           "href": "/resource_providers/b6b065cc-fcd9-4342-a7b0-2aed2d146518/inventories"
         },
         {
           "rel": "aggregates",
           "href": "resource_providers/b6b065cc-fcd9-4342-a7b0-2aed2d146518/aggregates"
         },
         {
           "rel": "usages",
           "href": "resource_providers/b6b065cc-fcd9-4342-a7b0-2aed2d146518/usages"
         }
      ]
    },
    {
      "uuid": "eaaf1c04-ced2-40e4-89a2-87edded06d64",
      "name": "Global NFS share",
      "generation": 4,
      "links": [
         {
           "rel": "self",
           "href": "/resource_providers/eaaf1c04-ced2-40e4-89a2-87edded06d64"
         },
         {
           "rel": "inventories",
           "href": "/resource_providers/eaaf1c04-ced2-40e4-89a2-87edded06d64/inventories"
         },
         {
           "rel": "aggregates",
           "href": "resource_providers/eaaf1c04-ced2-40e4-89a2-87edded06d64/aggregates"
         },
         {
           "rel": "usages",
           "href": "resource_providers/eaaf1c04-ced2-40e4-89a2-87edded06d64/usages"
         }
      ]
    }
  ]
}

如果请求的资源类不存在,将返回 HTTP400。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

bauzas

其他贡献者

cdent jaypipes

工作项

  • 写出数学公式

  • 公开 API 变更

依赖项

无。

测试

Gabbi 功能测试将涵盖这一点。

文档影响

当然,我们应该修改我们需要编写的文档。

参考资料

无。