资源提供者 - 自定义资源类

https://blueprints.launchpad.net/nova/+spec/custom-resource-classes

我们建议提供一种机制,允许管理员创建一组特殊的资源类,这些资源类指示资源提供者可以提供的特定于部署者的资源。

问题描述

某些硬件资源应表示为可消耗资源的单个单元。这些可消耗资源的单个单元可能因不同的云产品而异,并且尝试为这些类型的资源创建可在不同的 OpenStack 云之间使用的标准化资源类标识符是不可行的。

我们需要一种方法,让云管理员创建新的资源类,以表示某种资源的消耗单元。

用例

作为向我的用户提供裸机资源的云部署者,我希望利用 Nova 调度器的新的资源提供者功能,将对不同配置的裸机硬件的请求放置到这些资源的提供者处。我还希望使用新的 Placement REST API 来查看对我的云的各种用户分配的这些资源的库存和分配的统一视图。

作为 NFV 部署者,我拥有具有一些完全可编程门阵列 (FPGA) 设备的硬件。这些 FPGA 可以使用包含加速算法或整个软件程序的合成 RT 网络列表进行刷新。每个算法都有一个或多个可以被来宾虚拟机消耗的上下文。我希望允许我的用户指定启动实例,并让实例消耗加载到计算节点上的 FPGA 上的特定算法的一个或多个上下文。

提议的变更

我们建议添加一些内容

  • nova.objects 对象进行更改和添加,以处理自定义资源类。所有自定义资源类都将以字符串“CUSTOM_”为前缀。

  • 新的 resource_classes 数据库表,用于存储字符串 -> 整数映射的自定义资源类

  • 用于创建、修改、删除和查询自定义资源类的附加 Placement REST API 调用

备选方案

无。

数据模型影响

在 API 数据库中引入了资源类的新的查找表

CREATE TABLE resource_classes (
    id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE INDEX (name)
);

nova.objects.fields.ResourceClass 是一个 Enum 字段,列出了标准的已知资源类,如 VCPU、MEMORY_MB、DISK_GB 等。我们需要对这个类和具有 ResourceClass 字段(AllocationInventory 对象模型)的对象模型进行一些修改。我们将在实施阶段细化关于这方面的细节,可能是一个 StringField 字段类型,可以让我们在添加新类时无需触及对象版本。

这个新的 ResourceClass 对象模型将查找其整数索引值在一个新的缓存实用程序中,该实用程序将查找枚举的标准资源类中的字符串值,如果未找到,则查找新的 resource_classes 表中的记录。

REST API 影响

将在 Placement REST API 上使用新的微版本创建一组新的 REST API 命令

  • GET /resource_classes: 返回所有资源类(标准和自定义)的列表

  • POST /resource_classes: 创建一个新的自定义资源类

  • PUT /resource_classes/{name}: 更改现有自定义资源类的字符串名称

  • DELETE /resource_classes/{name}: 删除自定义资源类

GET /resource_classes

返回为这个 Nova 部署定义的所有资源类的列表。如果在实施阶段我们认为它可能成为一个非常长的列表,可以考虑分页,其中标记可以是资源类名称,列表按名称字母顺序排序。

示例

200 OK
Content-Type: application/json
{
  "resource_classes": [
  {
    "name": "VCPU",
    "links": [
      {
        "rel": "self",
        "href": "/resource_classes/VCPU"
      }
    ]
  },
  {
    "name": "MEMORY_MB",
    "links": [
      {
        "rel": "self",
        "href": "/resource_classes/MEMORY_MB"
      }
    ]
  }
  ...
  {
    "name": "CUSTOM_BAREMETAL_GOLD",
    "links": [
      {
        "rel": "self",
        "href": "/resource_classes/CUSTOM_BAREMETAL_GOLD"
      }
    ]
  }
  ]
}

POST /resource_classes

创建一个新的自定义资源类。

示例

POST /resource_classes
{
  "name": "CUSTOM_BAREMETAL_GOLD"
}

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

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^CUSTOM\_[A-Z0-9_]*"
    },
},
  "required": [
    "name"
  ]
  "additionalProperties": False
}

响应体为空。标头包括一个指向创建的资源类的 location 标头

201 Created
Location: /resource_classes/CUSTOM_BAREMETAL_GOLD
  • 如果名称是标准资源类(例如 VCPU 或 MEMORY_MB),将返回 400 Bad Request 响应代码。

  • 如果已经存在具有提供的名称的另一个资源类,将返回 409 Conflict 响应代码。

PUT /resource_classes/{name}

更改现有自定义资源类的字符串名称。

示例

PUT /resource_classes/CUSTOM_BAREMETAL_GOLD
{
  "name": "CUSTOM_BAREMETAL_SILVER"
}

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

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^CUSTOM\_[A-Z0-9_]*"
    },
},
  "required": [
    "name"
  ]
  "additionalProperties": False
}

响应体将包含资源类详细信息,并且响应代码将在成功更改名称后为 200 OK

示例

200 OK
Content-Type: application/json
{
  "name": "CUSTOM_BAREMETAL_SILVER",
  "links": [
    {
      "rel": "self",
      "href": "/resource_classes/CUSTOM_BAREMETAL_SILVER"
    }
  ]
}
  • 如果未找到与名称匹配的资源类,将返回 404 Not Found 响应代码。

  • 如果名称是标准资源类(例如 VCPU 或 MEMORY_MB),将返回 400 Bad Request 响应代码。

  • 如果存在具有相同名称的现有资源类,将返回 409 Conflict 响应代码。

DELETE /resource_classes/{name}

删除现有的自定义资源类。

示例

DELETE /resource_classes/CUSTOM_BAREMETAL_GOLD

响应体为空,并且响应代码将在成功删除后为 204 No Content

  • 如果未找到与名称匹配的资源类,将返回 404 Not Found 响应代码。

  • 如果名称是标准资源类(例如 VCPU 或 MEMORY_MB),将返回 400 Bad Request 响应代码。

  • 如果资源类存在现有的库存或分配,将返回 409 Conflict 响应代码。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

无。

实现

负责人

主要负责人

jaypipes

其他贡献者

cdent edleafe bauzas

工作项

  • 在 API 数据库中创建新的 resource_classes 查找表

  • 创建 nova/objects/resource_class.py 对象模型,弃用旧的 nova.objects.fields.ResourceClass

  • 添加所有新的 Placement REST API 命令

依赖项

  • generic-resource-pools 蓝图已实现

测试

使用 Gabbi 进行单元和功能 API 测试。

文档影响

需要 API 参考文档。

参考资料

无。