从文件创建 Bare Metal 服务资源

可以使用 JSON 或 YAML 格式的描述创建一组资源。可以通过以下两种方式实现

  1. 使用 OpenStackClient bare metal 插件 CLI 的命令 openstack baremetal create

    $ openstack -h baremetal create
    usage: openstack baremetal create [-h] <file> [<file> ...]
    
    Create resources from files
    
    positional arguments:
      <file>      File (.yaml or .json) containing descriptions of the
                  resources to create. Can be specified multiple times.
    
  2. 通过 Python API 以编程方式

    ironicclient.v1.create_resources.create_resources(client, filenames)[source]

    使用它们的 JSON 或 YAML 描述创建资源。

    参数:
    • client – ironic 客户端的一个实例;

    • filenames – 包含 JSON 或 YAML 资源定义的的文件名列表。

    引发:

    如果在文件处理/资源创建过程中发生任何错误,则会引发 ClientException。

包含资源描述的文件

要创建的资源可以描述为 JSON 或 YAML 格式。以 .json 结尾的文件被假定包含有效的 JSON,以 .yaml 结尾的文件被假定包含有效的 YAML。指定具有任何其他扩展名的文件会导致错误。

可以创建的资源包括机箱 (chassis)、节点 (nodes)、端口组 (port groups) 和端口 (ports)。机箱可以包含嵌套在 "nodes" 键下的节点(以及节点的资源)定义。节点可以在 "portgroups" 下嵌套端口组定义,在 "ports" 键下嵌套端口定义。端口也可以嵌套在端口组的 "ports" 键下。

用于验证所提供数据的模式如下

{
    "$schema": "https://schema.json.js.cn/draft-04/schema#",
    "description": "Schema for ironic resources file",
    "type": "object",
    "properties": {
        "chassis": {
            "type": "array",
            "items": {
                "type": "object"
            }
        },
        "nodes": {
            "type": "array",
            "items": {
                "type": "object"
            }
        }
    },
    "additionalProperties": False
}

有关创建过程的更详细描述,请参见以下部分。

示例

以下是可传递给 create 命令的 JSON 文件的示例

{
    "chassis": [
        {
            "description": "chassis 3 in row 23",
            "nodes": [
                {
                    "name": "node-3",
                    "driver": "ipmi",
                    "portgroups": [
                        {
                            "name": "switch.cz7882.ports.1-2",
                            "ports": [
                                {
                                    "address": "ff:00:00:00:00:00"
                                },
                                {
                                    "address": "ff:00:00:00:00:01"
                                }
                            ]
                        }
                    ],
                    "ports": [
                        {
                            "address": "00:00:00:00:00:02"
                        },
                        {
                            "address": "00:00:00:00:00:03"
                        }
                    ],
                    "driver_info": {
                        "ipmi_address": "192.168.1.23",
                        "ipmi_username": "BmcUsername",
                        "ipmi_password": "BmcPassword",
                    }
                },
                {
                    "name": "node-4",
                    "driver": "ipmi",
                    "ports": [
                        {
                            "address": "00:00:00:00:00:04"
                        },
                        {
                            "address": "00:00:00:00:00:01"
                        }
                    ]
                }
            ]
        }
    ],
    "nodes": [
        {
            "name": "node-5",
            "driver": "ipmi",
            "chassis_uuid": "74d93e6e-7384-4994-a614-fd7b399b0785",
            "ports": [
                {
                    "address": "00:00:00:00:00:00"
                }
            ]
        },
        {
            "name": "node-6",
            "driver": "ipmi"
        }
    ]
}

创建过程

  1. 客户端会反序列化文件的内容,并验证每个文件中的顶级字典是否仅包含“chassis”和/或“nodes”键,以及它们的值是列表。如果在这一阶段遇到任何故障,创建过程将被中止。其余的验证由 ironic-api 服务完成。

  2. 通过向 ironic-api 服务发出 POST 请求(在请求体中包含资源的字典表示形式)来创建每个资源。对于嵌套资源("nodes" 键位于机箱内部,"portgroups" 键位于节点内部,"ports" 键位于节点或端口组内部),首先创建顶级资源,然后创建子资源。例如,如果机箱包含一个节点列表,则首先创建机箱,然后创建每个节点。端口和端口组在节点中描述的情况也是如此。

  3. 如果无法创建资源,则不会停止整个过程。失败资源的任何子资源将不会被创建,但否则,如果可能,其余资源将被创建。任何失败的资源都将在响应中提及。