Files
python-ironicclient/doc/source/user/create_command.rst
Julia Kreger f9d05c7123 Update create node from file example
The file was out of date with the removed *_ipmitool drivers
and the driver_info field which should be posted on node creation
to the API.

Change-Id: I18ece4f2472a0aced2874992c18a8871665f9621
2020-10-21 11:44:44 -07:00

161 lines
5.7 KiB
ReStructuredText

===================================================
Creating the Bare Metal service resources from file
===================================================
It is possible to create a set of resources using their descriptions in JSON
or YAML format. It can be done in one of two ways:
1. Using OpenStackClient bare metal plugin CLI's command ``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. Programmatically using the Python API:
.. autofunction:: ironicclient.v1.create_resources.create_resources
:noindex:
File containing Resource Descriptions
=====================================
The resources to be created can be described either in JSON or YAML. A file
ending with ``.json`` is assumed to contain valid JSON, and a file ending with
``.yaml`` is assumed to contain valid YAML. Specifying a file with any other
extension leads to an error.
The resources that can be created are chassis, nodes, port groups and ports.
A chassis can contain nodes (and resources of nodes) definitions nested under
``"nodes"`` key. A node can contain port groups definitions nested under
``"portgroups"``, and ports definitions under ``"ports"`` keys. Ports can be
also nested under port groups in ``"ports"`` key.
The schema used to validate the supplied data is the following::
{
"$schema": "http://json-schema.org/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
}
More detailed description of the creation process can be seen in the following
sections.
Examples
========
Here is an example of the JSON file that can be passed to the ``create``
command::
{
"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"
}
]
}
Creation Process
================
#. The client deserializes the files' contents and validates that the top-level
dictionary in each of them contains only "chassis" and/or "nodes" keys,
and their values are lists. The creation process is aborted if any failure
is encountered in this stage. The rest of the validation is done by the
ironic-api service.
#. Each resource is created via issuing a POST request (with the resource's
dictionary representation in the body) to the ironic-api service. In the
case of nested resources (``"nodes"`` key inside chassis, ``"portgroups"``
key inside nodes, ``"ports"`` key inside nodes or portgroups), the top-level
resource is created first, followed by the sub-resources. For example, if a
chassis contains a list of nodes, the chassis will be created first followed
by the creation of each node. The same is true for ports and port groups
described within nodes.
#. If a resource could not be created, it does not stop the entire process.
Any sub-resources of the failed resource will not be created, but otherwise,
the rest of the resources will be created if possible. Any failed resources
will be mentioned in the response.