Update api-ref for v1.22

This commit does several things, which were just easier to do together.

- Adds a new "misc" page describing the /v1/lookup and /v1/heartbeat
  resources.
- Adds descriptions of the node.resource_class and
  node.network_interface fields that were introduced into the API but
  not into the documentation.
- Introduces a new script, api-ref/regenerate-samples.sh, which can be
  used with Ironic to automate the generation of most of the sample files
  used in the api-ref documententation.
- Corrects several errors in the sample JSON files that rendered errors
  when using them with curl for POST, PUT, or PATCH.
- Uses the aforementioned regenerate-samples.sh script to regenerate
  most of the JSON result samples, ensuring that they are all up to date
  with the v1.22 API microversion.
- Removes a few old/incorrect "Error Code" listings.
- Updates the index page to remove extraneous wording.

Change-Id: I764cbb43be15f05ba681de6ce1be1ae7c022173d
This commit is contained in:
Devananda van der Veen 2016-08-09 14:36:08 -07:00
parent 494651de1f
commit 28a399a13c
46 changed files with 1310 additions and 741 deletions

171
api-ref/regenerate-samples.sh Executable file
View File

@ -0,0 +1,171 @@
#!/bin/bash
set -e -x
if [ ! -x /usr/bin/jq ]; then
echo "This script relies on 'jq' to process JSON output."
echo "Please install it before continuing."
exit 1
fi
OS_AUTH_TOKEN=$(openstack token issue | grep ' id ' | awk '{print $4}')
IRONIC_URL="http://127.0.0.1:6385"
export OS_AUTH_TOKEN IRONIC_URL
function GET {
# GET $RESOURCE
curl -s -H "X-Auth-Token: $OS_AUTH_TOKEN" \
-H 'X-OpenStack-Ironic-API-Version: 1.22' \
${IRONIC_URL}/$1 | jq -S '.'
}
function POST {
# POST $RESOURCE $FILENAME
curl -s -H "X-Auth-Token: $OS_AUTH_TOKEN" \
-H 'X-OpenStack-Ironic-API-Version: 1.22' \
-H "Content-Type: application/json" \
-X POST --data @$2 \
${IRONIC_URL}/$1 | jq -S '.'
}
function PATCH {
# POST $RESOURCE $FILENAME
curl -s -H "X-Auth-Token: $OS_AUTH_TOKEN" \
-H 'X-OpenStack-Ironic-API-Version: 1.22' \
-H "Content-Type: application/json" \
-X PATCH --data @$2 \
${IRONIC_URL}/$1 | jq -S '.'
}
function PUT {
# PUT $RESOURCE $FILENAME
curl -s -H "X-Auth-Token: $OS_AUTH_TOKEN" \
-H 'X-OpenStack-Ironic-API-Version: 1.22' \
-H "Content-Type: application/json" \
-X PUT --data @$2 \
${IRONIC_URL}/$1
}
pushd source/samples
###########
# ROOT APIs
GET '' > api-root-response.json
GET 'v1' > api-v1-root-response.json
###########
# DRIVER APIs
GET v1/drivers > drivers-list-response.json
GET v1/drivers/agent_ipmitool > driver-get-response.json
GET v1/drivers/agent_ipmitool/properties > driver-property-response.json
GET v1/drivers/agent_ipmitool/raid/logical_disk_properties > driver-logical-disk-properties-response.json
GET v1/drivers/agent_ipmitool/vendor_passthru/methods > driver-passthru-methods-response.json
#########
# CHASSIS
POST v1/chassis chassis-create-request.json > chassis-show-response.json
CID=$(cat chassis-show-response.json | grep '"uuid"' | sed 's/.*"\([0-9a-f\-]*\)",*/\1/')
if [ "$CID" == "" ]; then
exit 1
else
echo "Chassis created. UUID: $CID"
fi
GET v1/chassis > chassis-list-response.json
GET v1/chassis/detail > chassis-list-details-response.json
PATCH v1/chassis/$CID chassis-update-request.json > chassis-update-response.json
# skip GET /v1/chassis/$UUID because the response is same as POST
#######
# NODES
# Create a node with a real driver, but missing ipmi_address,
# then do basic commands with it
POST v1/nodes node-create-request.json > node-create-response.json
NID=$(cat node-create-response.json | grep '"uuid"' | sed 's/.*"\([0-9a-f\-]*\)",*/\1/')
if [ "$NID" == "" ]; then
exit 1
else
echo "Node created. UUID: $NID"
fi
# get the list of passthru methods from agent* driver
GET v1/nodes/$NID/vendor_passthru/methods > node-vendor-passthru-response.json
# Change to the fake driver and then move the node into the AVAILABLE
# state without saving any output.
# NOTE that these three JSON files are not included in the docs
PATCH v1/nodes/$NID node-update-driver.json
PUT v1/nodes/$NID/states/provision node-set-manage-state.json
PUT v1/nodes/$NID/states/provision node-set-available-state.json
GET v1/nodes/$NID/validate > node-validate-response.json
PUT v1/nodes/$NID/states/power node-set-power-off.json
GET v1/nodes/$NID/states > node-get-state-response.json
GET v1/nodes > nodes-list-response.json
GET v1/nodes/detail > nodes-list-details-response.json
GET v1/nodes/$NID > node-show-response.json
# Put the Node in maintenance mode, then continue doing everything else
PUT v1/nodes/$NID/maintenance node-maintenance-request.json
###########
# PORTS
# Before we can create a port, we must
# write NODE ID into the create request document body
sed -i "s/.*node_uuid.*/ \"node_uuid\": \"$NID\",/" port-create-request.json
POST v1/ports port-create-request.json > port-create-response.json
PID=$(cat port-create-response.json | grep '"uuid"' | sed 's/.*"\([0-9a-f\-]*\)",*/\1/')
if [ "$PID" == "" ]; then
exit 1
else
echo "Port created. UUID: $PID"
fi
GET v1/ports > port-list-respone.json
GET v1/ports/detail > port-list-detail-response.json
PATCH v1/ports/$PID port-update-request.json > port-update-response.json
# skip GET $PID because same result as POST
# skip DELETE
################
# NODE PORT APIs
GET v1/nodes/$NID/ports > node-port-list-response.json
GET v1/nodes/$NID/ports/detail > node-port-detail-response.json
############
# LOOKUP API
GET v1/lookup?node_uuid=$NID > lookup-node-response.json
#####################
# NODES MANAGEMENT API
# These need to be done while the node is in maintenance mode,
# and the node's driver is "fake", to avoid potential races
# with internal processes that lock the Node
# this corrects an intentional ommission in some of the samples
PATCH v1/nodes/$NID node-update-driver-info-request.json > node-update-driver-info-response.json
GET v1/nodes/$NID/management/boot_device/supported > node-get-supported-boot-devices-response.json
PUT v1/nodes/$NID/management/boot_device node-set-boot-device.json
GET v1/nodes/$NID/management/boot_device > node-get-boot-device-response.json

View File

@ -21,7 +21,8 @@ List chassis with details
Lists all chassis with details. Lists all chassis with details.
Normal response codes: 200 Normal response codes: 200
Error response codes:413,405,404,403,401,400,503,
.. TODO: add error codes
Request Request
------- -------
@ -58,7 +59,8 @@ Show chassis details
Shows details for a chassis. Shows details for a chassis.
Normal response codes: 200 Normal response codes: 200
Error response codes:413,405,404,403,401,400,503,
.. TODO: add error codes
Request Request
------- -------
@ -83,6 +85,7 @@ Response Example
.. literalinclude:: samples/chassis-show-response.json .. literalinclude:: samples/chassis-show-response.json
:language: javascript :language: javascript
Update chassis Update chassis
============== ==============
@ -91,11 +94,15 @@ Update chassis
Updates a chassis. Updates a chassis.
Normal response codes: 200 Normal response codes: 200
Error response codes:413,415,405,404,403,401,400,503,409,
.. TODO: add error codes
Request Request
------- -------
The BODY of the PATCH request must be a JSON PATCH document, adhering to
`RFC 6902 <https://tools.ietf.org/html/rfc6902>`_.
.. rest_parameters:: parameters.yaml .. rest_parameters:: parameters.yaml
- chassis: chassis - chassis: chassis
@ -125,7 +132,7 @@ Response Parameters
Response Example Response Example
---------------- ----------------
.. literalinclude:: samples/chassis-show-response.json .. literalinclude:: samples/chassis-update-response.json
:language: javascript :language: javascript
@ -136,7 +143,7 @@ Delete chassis
Deletes a chassis. Deletes a chassis.
Error response codes:204,413,415,405,404,403,401,400,503,409, .. TODO: add error codes
Request Request
------- -------
@ -178,6 +185,12 @@ Response Parameters
- nodes: nodes - nodes: nodes
- uuid: uuid - uuid: uuid
Response Example
----------------
.. literalinclude:: samples/chassis-show-response.json
:language: javascript
List chassis List chassis
============ ============
@ -186,7 +199,8 @@ List chassis
Lists all chassis. Lists all chassis.
Normal response codes: 200 Normal response codes: 200
Error response codes:413,405,404,403,401,400,503,
.. TODO: add error codes
Request Request
------- -------

View File

@ -0,0 +1,108 @@
.. -*- rst -*-
=======
Utility
=======
This section describes two API endpoints used by the ``ironic-python-agent``
ramdisk as it communicates with the Bare Metal service. These were previously
exposed as vendor passthrough methods, however, as ironic-python-agent has
become the standard ramdisk agent, these methods have been made a part of the
official REST API.
.. note::
**Operators are reminded not to expose the Bare Metal Service's API to
unsecured networks.** Both API endpoints listed below are available to
*unauthenticated* clients because the default method for booting the
``ironic-python-agent`` ramdisk does not provide the agent with keystone
credentials.
.. note::
It is possible to include keys in your ramdisk, or pass keys in via the
boot method, if your driver supports it; if that is done, you may configure
these endpoint to require authentication by changing the policy rules
``baremetal:driver:ipa_lookup`` and ``baremetal:node:ipa_heartbeat``.
In light of that, operators are recommended to ensure that this endpoint is
only available on the ``provisioning`` and ``cleaning`` networks.
Agent Lookup
============
.. rest_method:: GET /v1/lookup
Beginning with the v1.22 API, a ``/lookup`` method is exposed at the root of
the REST API. This should only be used by the ``ironic-python-agent`` ramdisk
to retrieve required configuration data from the Bare Metal service.
By default, ``/v1/lookup`` will only match Nodes that are expected to be
running the ``ironic-python-agent`` ramdisk (for instance, because the Bare
Metal service has just initiated a deployment). It can not be used as a
generic search mechanism, though this behaviour may be changed by setting
the ``[api] restrict_lookup = false`` configuration option for the ironic-api
service.
The query string should include either or both a ``node_uuid`` or an
``addresses`` query parameter. If a matching Node is found, information about
that Node shall be returned, including instance-specific information such as
the configdrive.
This deprecates the ``agent``-driver specific ``vendor_passthru`` method of the
same name, previously accessible at
``/v1/drivers/agent_*/vendor_passthru?method=lookup``.
Normal response codes: 200
Error response codes: 400 404
Request
-------
.. rest_parameters:: parameters.yaml
- node_uuid: r_node_uuid
- addresses: r_addresses
Response
--------
Returns only the information about the corresponding Node that the
``ironic-python-agent`` process requires.
.. rest_parameters:: parameters.yaml
- node: agent_node
- config: agent_config
Response Example
----------------
.. literalinclude:: samples/lookup-node-response.json
:language: javascript
Agent Heartbeat
===============
.. rest_method:: POST /v1/heartbeat/{node_ident}
Beginning with the v1.22 API, a ``/heartbeat`` method is exposed at the root of
the REST API. This is used as a callback from within the ``ironic-python-agent``
ramdisk, so that an active ramdisk may periodically contact the Bare Metal
service and provide the current URL at which to contact the agent.
This deprecates the ``agent``-driver specific ``vendor_passthru`` method of the
same name, previously accessible at
``/v1/nodes/{node_ident}/vendor_passthru?method=heartbeat``.
Normal response codes: 202
Error response codes: 400 404
Request
-------
.. rest_parameters:: parameters.yaml
- node_ident: node_ident
- callback_url: callback_url

View File

@ -155,7 +155,7 @@ Request
**Example JSON request body to set boot device:** **Example JSON request body to set boot device:**
.. literalinclude:: samples/node-get-or-set-boot-device.json .. literalinclude:: samples/node-set-boot-device.json
Get Boot Device Get Boot Device
@ -190,7 +190,7 @@ Response
**Example JSON response to get boot device:** **Example JSON response to get boot device:**
.. literalinclude:: samples/node-get-or-set-boot-device.json .. literalinclude:: samples/node-get-boot-device-response.json
Get Supported Boot Devices Get Supported Boot Devices

View File

@ -71,7 +71,15 @@ API microversion 1.7 introduced the ``clean_step`` field`
API microversion 1.12 introduced support for the ``raid_config`` and API microversion 1.12 introduced support for the ``raid_config`` and
``target_raid_config`` fields. ``target_raid_config`` fields.
The list and example below are representative of the response as of API microversion 1.16. API microversion 1.20 introduced the ``network_interface`` field. If this field
is not supplied when creating the Node, the default value will be used.
API microversion 1.21 introduced the ``resource_class`` field, which may be used to
store a resource designation for the proposed OpenStack Placement Engine. This
field has no effect within Ironic.
The list and example below are representative of the response as of API microversion 1.22.
.. rest_parameters:: parameters.yaml .. rest_parameters:: parameters.yaml
@ -100,6 +108,8 @@ The list and example below are representative of the response as of API microver
- links: links - links: links
- ports: n_ports - ports: n_ports
- states: n_states - states: n_states
- network_interface: network_interface
- resource_class: resource_class
**Example JSON representation of a Node:** **Example JSON representation of a Node:**
@ -128,6 +138,9 @@ the list of returned Nodes to be filtered by their current state.
API microversion 1.16 added the ``driver`` Request parameter, allowing API microversion 1.16 added the ``driver`` Request parameter, allowing
the list of returned Nodes to be filtered by their driver name. the list of returned Nodes to be filtered by their driver name.
API microversion 1.21 added the ``resource_class`` Request parameter,
allowing the list of returned Nodes to be filtered by this field.
Normal response codes: 200 Normal response codes: 200
.. TODO: add error codes .. TODO: add error codes
@ -142,6 +155,7 @@ Request
- associated: r_associated - associated: r_associated
- provision_state: r_provision_state - provision_state: r_provision_state
- driver: r_driver - driver: r_driver
- resource_class: r_resource_class
- fields: fields - fields: fields
- limit: limit - limit: limit
- marker: marker - marker: marker
@ -192,6 +206,7 @@ Request
- associated: r_associated - associated: r_associated
- provision_state: r_provision_state - provision_state: r_provision_state
- driver: r_driver - driver: r_driver
- resource_class: r_resource_class
- limit: limit - limit: limit
- marker: marker - marker: marker
- sort_dir: sort_dir - sort_dir: sort_dir
@ -227,6 +242,8 @@ Response
- links: links - links: links
- ports: n_ports - ports: n_ports
- states: n_states - states: n_states
- network_interface: network_interface
- resource_class: resource_class
**Example detailed list of Nodes:** **Example detailed list of Nodes:**
@ -285,6 +302,8 @@ Response
- links: links - links: links
- ports: n_ports - ports: n_ports
- states: n_states - states: n_states
- network_interface: network_interface
- resource_class: resource_class
**Example JSON representation of a Node:** **Example JSON representation of a Node:**
@ -350,6 +369,8 @@ Response
- links: links - links: links
- ports: n_ports - ports: n_ports
- states: n_states - states: n_states
- network_interface: network_interface
- resource_class: resource_class
**Example JSON representation of a Node:** **Example JSON representation of a Node:**

View File

@ -14,6 +14,8 @@ supports versioning. There are two kinds of versions in Ironic.
- ''microversions'', which can be requested through the use of the - ''microversions'', which can be requested through the use of the
``X-OpenStack-Ironic-API-Version`` header. ``X-OpenStack-Ironic-API-Version`` header.
The Version APIs work differently from other APIs as they *do not* require authentication.
Beginning with the Kilo release, all API requests support the Beginning with the Kilo release, all API requests support the
``X-OpenStack-Ironic-API-Version`` header. This header SHOULD be supplied ``X-OpenStack-Ironic-API-Version`` header. This header SHOULD be supplied
with every request; in the absence of this header, each request is treated with every request; in the absence of this header, each request is treated
@ -75,4 +77,4 @@ Response Example
- x-openstack-ironic-api-max-version: x-openstack-ironic-api-max-version - x-openstack-ironic-api-max-version: x-openstack-ironic-api-max-version
.. literalinclude:: samples/api-v1-root-response.json .. literalinclude:: samples/api-v1-root-response.json
:language: javascript :language: javascript

View File

@ -4,14 +4,6 @@
Bare Metal API Bare Metal API
================ ================
This documentation describes the REST API for the Ironic service, beginning with the
5.1.0 (Mitaka) release.
Version negotiation is implemented in the server. When the negotiated version
is not the current maximum version, both request and response may not match what
is presented in this document. Significant changes may be noted inline.
.. rest_expand_all:: .. rest_expand_all::
.. include:: baremetal-api-versions.inc .. include:: baremetal-api-versions.inc
@ -23,4 +15,5 @@ is presented in this document. Significant changes may be noted inline.
.. include:: baremetal-api-v1-drivers.inc .. include:: baremetal-api-v1-drivers.inc
.. include:: baremetal-api-v1-driver-passthru.inc .. include:: baremetal-api-v1-driver-passthru.inc
.. include:: baremetal-api-v1-chassis.inc .. include:: baremetal-api-v1-chassis.inc
.. include:: baremetal-api-v1-misc.inc

View File

@ -15,7 +15,7 @@ openstack-request-id:
type: string type: string
x-openstack-ironic-api-max-version: x-openstack-ironic-api-max-version:
description: | description: |
Maximum API microversion supported by this endpoint, eg. "1.16" Maximum API microversion supported by this endpoint, eg. "1.22"
in: header in: header
required: true required: true
type: string type: string
@ -70,6 +70,14 @@ port_ident:
type: string type: string
callback_url:
description: |
The URL of an active ironic-python-agent ramdisk, sent back to the Bare
Metal service and stored temporarily during a provisioning action.
in: query
required: true
type: string
# variables common to all query strings # variables common to all query strings
fields: fields:
description: | description: |
@ -114,6 +122,14 @@ method_name:
required: true required: true
type: string type: string
# variable in the lookup query string
r_addresses:
description: |
Optional list of one or more Port addresses.
in: query
required: false
type: list
# variables in the node query string # variables in the node query string
r_associated: r_associated:
description: | description: |
@ -143,6 +159,13 @@ r_maintenance:
in: query in: query
required: false required: false
type: boolean type: boolean
# variable in the lookup query string
r_node_uuid:
description: |
Optional Node UUID.
in: query
required: false
type: string
r_port_address: r_port_address:
description: | description: |
Filter the list of returned Ports, and only return the ones with the Filter the list of returned Ports, and only return the ones with the
@ -172,6 +195,13 @@ r_provision_state:
in: query in: query
required: false required: false
type: string type: string
r_resource_class:
description: |
Filter the list of returned nodes, and only return the ones with the
specified resource class. Introduced in API version 1.21.
in: query
required: false
type: string
sort_dir: sort_dir:
description: | description: |
Sorts the response by the requested sort Sorts the response by the requested sort
@ -196,6 +226,22 @@ sort_key:
type: string type: string
# variable returned from /lookup
agent_config:
description: |
JSON document of configuration data for the ironic-python-agent process.
in: body
required: true
type: JSON
agent_node:
description: |
JSON document containing a subset of Node fields, used by the
ironic-python-agent process as it operates on the Node.
in: body
required: true
type: JSON
# variables in the API response body # variables in the API response body
boot_device: boot_device:
description: | description: |
@ -412,6 +458,13 @@ name:
in: body in: body
required: true required: true
type: string type: string
network_interface:
description: |
Which Network Interface provider to use when plumbing the network
connections for this Node. Added in API microversion v1.20
in: body
required: true
type: string
node_name: node_name:
description: | description: |
Human-readable identifier for the Node resource. May be undefined. Certain Human-readable identifier for the Node resource. May be undefined. Certain
@ -545,6 +598,14 @@ reservation:
in: body in: body
required: true required: true
type: string type: string
resource_class:
description: |
A string which can be used by external schedulers to identify this Node as
a unit of a specific type of resource. This will be used by the openstack
Placement Engine in a future release. Added in API microversion 1.21.
in: body
required: true
type: string
supported_boot_devices: supported_boot_devices:
description: | description: |
List of boot devices which this Node's driver supports. List of boot devices which this Node's driver supports.
@ -637,7 +698,7 @@ v_raid:
version: version:
description: | description: |
Versioning of this API response, eg. "1.16". Versioning of this API response, eg. "1.22".
in: body in: body
required: true required: true
type: string type: string

View File

@ -1,30 +1,30 @@
{ {
"name" : "OpenStack Ironic API", "default_version": {
"description" : "Ironic is an OpenStack project which aims to provision baremetal machines.", "id": "v1",
"default_version" : { "links": [
"status" : "CURRENT",
"version" : "1.16",
"links" : [
{
"rel" : "self",
"href" : "http://127.0.0.1:6385/v1/"
}
],
"id" : "v1",
"min_version" : "1.1"
},
"versions" : [
{ {
"status" : "CURRENT", "href": "http://127.0.0.1:6385/v1/",
"links" : [ "rel": "self"
{
"href" : "http://127.0.0.1:6385/v1/",
"rel" : "self"
}
],
"id" : "v1",
"version" : "1.16",
"min_version" : "1.1"
} }
] ],
"min_version": "1.1",
"status": "CURRENT",
"version": "1.22"
},
"description": "Ironic is an OpenStack project which aims to provision baremetal machines.",
"name": "OpenStack Ironic API",
"versions": [
{
"id": "v1",
"links": [
{
"href": "http://127.0.0.1:6385/v1/",
"rel": "self"
}
],
"min_version": "1.1",
"status": "CURRENT",
"version": "1.22"
}
]
} }

View File

@ -1,60 +1,80 @@
{ {
"chassis" : [ "chassis": [
{ {
"rel" : "self", "href": "http://127.0.0.1:6385/v1/chassis/",
"href" : "http://127.0.0.1:6385/v1/chassis/" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/chassis/", "href": "http://127.0.0.1:6385/chassis/",
"rel" : "bookmark" "rel": "bookmark"
} }
], ],
"links" : [ "drivers": [
{ {
"href" : "http://127.0.0.1:6385/v1/", "href": "http://127.0.0.1:6385/v1/drivers/",
"rel" : "self" "rel": "self"
}, },
{ {
"rel" : "describedby", "href": "http://127.0.0.1:6385/drivers/",
"type" : "text/html", "rel": "bookmark"
"href" : "http://docs.openstack.org/developer/ironic/dev/api-spec-v1.html" }
} ],
], "heartbeat": [
"nodes" : [ {
{ "href": "http://127.0.0.1:6385/v1/heartbeat/",
"rel" : "self", "rel": "self"
"href" : "http://127.0.0.1:6385/v1/nodes/" },
}, {
{ "href": "http://127.0.0.1:6385/heartbeat/",
"rel" : "bookmark", "rel": "bookmark"
"href" : "http://127.0.0.1:6385/nodes/" }
} ],
], "id": "v1",
"ports" : [ "links": [
{ {
"href" : "http://127.0.0.1:6385/v1/ports/", "href": "http://127.0.0.1:6385/v1/",
"rel" : "self" "rel": "self"
}, },
{ {
"rel" : "bookmark", "href": "http://docs.openstack.org/developer/ironic/dev/api-spec-v1.html",
"href" : "http://127.0.0.1:6385/ports/" "rel": "describedby",
} "type": "text/html"
], }
"media_types" : [ ],
{ "lookup": [
"type" : "application/vnd.openstack.ironic.v1+json", {
"base" : "application/json" "href": "http://127.0.0.1:6385/v1/lookup/",
} "rel": "self"
], },
"drivers" : [ {
{ "href": "http://127.0.0.1:6385/lookup/",
"rel" : "self", "rel": "bookmark"
"href" : "http://127.0.0.1:6385/v1/drivers/" }
}, ],
{ "media_types": [
"href" : "http://127.0.0.1:6385/drivers/", {
"rel" : "bookmark" "base": "application/json",
} "type": "application/vnd.openstack.ironic.v1+json"
], }
"id" : "v1" ],
} "nodes": [
{
"href": "http://127.0.0.1:6385/v1/nodes/",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/nodes/",
"rel": "bookmark"
}
],
"ports": [
{
"href": "http://127.0.0.1:6385/v1/ports/",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/ports/",
"rel": "bookmark"
}
]
}

View File

@ -1,7 +1,3 @@
{ {
"chassis": [ "description": "Sample chassis"
{
"description": "Sample chassis"
}
]
} }

View File

@ -1,18 +1,31 @@
{ {
"chassis": [ "chassis": [
{
"created_at": "2016-08-18T22:28:48.165105+00:00",
"description": "Sample chassis",
"extra": {},
"links": [
{ {
"description": "Sample chassis", "href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"links": [ "rel": "self"
{ },
"href": "http://localhost:6385/v1/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89", {
"rel": "self" "href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
}, "rel": "bookmark"
{
"href": "http://localhost:6385/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89",
"rel": "bookmark"
}
],
"uuid": "eaaca217-e7d8-47b4-bb41-3f99f20eed89"
} }
] ],
"nodes": [
{
"href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "bookmark"
}
],
"updated_at": null,
"uuid": "dff29d23-1ded-43b4-8ae1-5eebb3e30de1"
}
]
} }

View File

@ -1,18 +1,18 @@
{ {
"chassis": [ "chassis": [
{
"description": "Sample chassis",
"links": [
{ {
"description": "Sample chassis", "href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"links": [ "rel": "self"
{ },
"href": "http://localhost:6385/v1/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89", {
"rel": "self" "href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
}, "rel": "bookmark"
{
"href": "http://localhost:6385/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89",
"rel": "bookmark"
}
],
"uuid": "eaaca217-e7d8-47b4-bb41-3f99f20eed89"
} }
] ],
"uuid": "dff29d23-1ded-43b4-8ae1-5eebb3e30de1"
}
]
} }

View File

@ -1,27 +1,27 @@
{ {
"created_at": "2000-01-01T12:00:00", "created_at": "2016-08-18T22:28:48.165105+00:00",
"description": "Sample chassis", "description": "Sample chassis",
"extra": {}, "extra": {},
"links": [ "links": [
{ {
"href": "http://localhost:6385/v1/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89", "href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"rel": "self" "rel": "self"
}, },
{ {
"href": "http://localhost:6385/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89", "href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"rel": "bookmark" "rel": "bookmark"
} }
], ],
"nodes": [ "nodes": [
{ {
"href": "http://localhost:6385/v1/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89/nodes", "href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "self" "rel": "self"
}, },
{ {
"href": "http://localhost:6385/chassis/eaaca217-e7d8-47b4-bb41-3f99f20eed89/nodes", "href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "bookmark" "rel": "bookmark"
} }
], ],
"updated_at": "2000-01-01T12:00:00", "updated_at": null,
"uuid": "eaaca217-e7d8-47b4-bb41-3f99f20eed89" "uuid": "dff29d23-1ded-43b4-8ae1-5eebb3e30de1"
} }

View File

@ -1,7 +1,7 @@
{ [
"chassis": [ {
{ "op": "replace",
"description": "Sample chassis" "path": "/description",
} "value": "Updated Chassis"
] }
} ]

View File

@ -0,0 +1,27 @@
{
"created_at": "2016-08-18T22:28:48.165105+00:00",
"description": "Updated Chassis",
"extra": {},
"links": [
{
"href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1",
"rel": "bookmark"
}
],
"nodes": [
{
"href": "http://127.0.0.1:6385/v1/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/chassis/dff29d23-1ded-43b4-8ae1-5eebb3e30de1/nodes",
"rel": "bookmark"
}
],
"updated_at": "2016-08-18T22:28:48.556556+00:00",
"uuid": "dff29d23-1ded-43b4-8ae1-5eebb3e30de1"
}

View File

@ -1,26 +1,26 @@
{ {
"links" : [ "hosts": [
{ "897ab1dad809"
"rel" : "self", ],
"href" : "http://127.0.0.1:6385/v1/drivers/agent_ipmitool" "links": [
}, {
{ "href": "http://127.0.0.1:6385/v1/drivers/agent_ipmitool",
"href" : "http://127.0.0.1:6385/drivers/agent_ipmitool", "rel": "self"
"rel" : "bookmark" },
} {
], "href": "http://127.0.0.1:6385/drivers/agent_ipmitool",
"name" : "agent_ipmitool", "rel": "bookmark"
"properties" : [ }
{ ],
"rel" : "self", "name": "agent_ipmitool",
"href" : "http://127.0.0.1:6385/v1/drivers/agent_ipmitool/properties" "properties": [
}, {
{ "href": "http://127.0.0.1:6385/v1/drivers/agent_ipmitool/properties",
"rel" : "bookmark", "rel": "self"
"href" : "http://127.0.0.1:6385/drivers/agent_ipmitool/properties" },
} {
], "href": "http://127.0.0.1:6385/drivers/agent_ipmitool/properties",
"hosts" : [ "rel": "bookmark"
"localhost" }
] ]
} }

View File

@ -1,12 +1,12 @@
{ {
"share_physical_disks" : "Specifies whether other logical disks can share physical disks with this logical disk. By default, this is False. Optional.", "controller": "Controller to use for this logical disk. If not specified, the driver will choose a suitable RAID controller on the bare metal node. Optional.",
"controller" : "Controller to use for this logical disk. If not specified, the driver will choose a suitable RAID controller on the bare metal node. Optional.", "disk_type": "The type of disk preferred. Valid values are 'hdd' and 'ssd'. If this is not specified, disk type will not be a selection criterion for choosing backing physical disks. Optional.",
"disk_type" : "The type of disk preferred. Valid values are 'hdd' and 'ssd'. If this is not specified, disk type will not be a selection criterion for choosing backing physical disks. Optional.", "interface_type": "The interface type of disk. Valid values are 'sata', 'scsi' and 'sas'. If this is not specified, interface type will not be a selection criterion for choosing backing physical disks. Optional.",
"physical_disks" : "The physical disks to use for this logical disk. If not specified, the driver will choose suitable physical disks to use. Optional.", "is_root_volume": "Specifies whether this disk is a root volume. By default, this is False. Optional.",
"volume_name" : "Name of the volume to be created. If this is not specified, it will be auto-generated. Optional.", "number_of_physical_disks": "Number of physical disks to use for this logical disk. By default, the driver uses the minimum number of disks required for that RAID level. Optional.",
"number_of_physical_disks" : "Number of physical disks to use for this logical disk. By default, the driver uses the minimum number of disks required for that RAID level. Optional.", "physical_disks": "The physical disks to use for this logical disk. If not specified, the driver will choose suitable physical disks to use. Optional.",
"raid_level" : "RAID level for the logical disk. Valid values are '0', '1', '2', '5', '6', '1+0', '5+0' and '6+0'. Required.", "raid_level": "RAID level for the logical disk. Valid values are 'JBOD', 0', '1', '2', '5', '6', '1+0', '5+0' and '6+0'. Required.",
"size_gb" : "Size in GiB (Integer) for the logical disk. Use 'MAX' as size_gb if this logical disk is supposed to use the rest of the space available. Required.", "share_physical_disks": "Specifies whether other logical disks can share physical disks with this logical disk. By default, this is False. Optional.",
"interface_type" : "The interface type of disk. Valid values are 'sata', 'scsi' and 'sas'. If this is not specified, interface type will not be a selection criterion for choosing backing physical disks. Optional.", "size_gb": "Size in GiB (Integer) for the logical disk. Use 'MAX' as size_gb if this logical disk is supposed to use the rest of the space available. Required.",
"is_root_volume" : "Specifies whether this disk is a root volume. By default, this is False. Optional." "volume_name": "Name of the volume to be created. If this is not specified, it will be auto-generated. Optional."
} }

View File

@ -1,10 +1,10 @@
{ {
"lookup" : { "lookup": {
"http_methods" : [ "async": false,
"POST" "attach": false,
], "description": "",
"attach" : false, "http_methods": [
"description" : "", "POST"
"async" : false ]
} }
} }

View File

@ -1,22 +1,22 @@
{ {
"ipmi_force_boot_device" : "Whether Ironic should specify the boot device to the BMC each time the server is turned on, eg. because the BMC is not capable of remembering the selected boot device across power cycles; default value is False. Optional.", "deploy_forces_oob_reboot": "Whether Ironic should force a reboot of the Node via the out-of-band channel after deployment is complete. Provides compatibility with older deploy ramdisks. Defaults to False. Optional.",
"deploy_forces_oob_reboot" : "Whether Ironic should force a reboot of the Node via the out-of-band channel after deployment is complete. Provides compatiblity with older deploy ramdisks. Defaults to False. Optional.", "deploy_kernel": "UUID (from Glance) of the deployment kernel. Required.",
"ipmi_target_address" : "destination address for bridged request. Required only if ipmi_bridging is set to \"single\" or \"dual\".", "deploy_ramdisk": "UUID (from Glance) of the ramdisk that is mounted at boot time. Required.",
"image_https_proxy" : "URL of a proxy server for HTTPS connections. Optional.", "image_http_proxy": "URL of a proxy server for HTTP connections. Optional.",
"ipmi_password" : "password. Optional.", "image_https_proxy": "URL of a proxy server for HTTPS connections. Optional.",
"ipmi_bridging" : "bridging_type; default is \"no\". One of \"single\", \"dual\", \"no\". Optional.", "image_no_proxy": "A comma-separated list of host names, IP addresses and domain names (with optional :port) that will be excluded from proxying. To denote a doman name, use a dot to prefix the domain name. This value will be ignored if ``image_http_proxy`` and ``image_https_proxy`` are not specified. Optional.",
"deploy_kernel" : "UUID (from Glance) of the deployment kernel. Required.", "ipmi_address": "IP address or hostname of the node. Required.",
"ipmi_address" : "IP address or hostname of the node. Required.", "ipmi_bridging": "bridging_type; default is \"no\". One of \"single\", \"dual\", \"no\". Optional.",
"image_no_proxy" : "A comma-separated list of host names, IP addresses and domain names (with optional :port) that will be excluded from proxying. To denote a doman name, use a dot to prefix the domain name. This value will be ignored if ``image_http_proxy`` and ``image_https_proxy`` are not specified. Optional.", "ipmi_force_boot_device": "Whether Ironic should specify the boot device to the BMC each time the server is turned on, eg. because the BMC is not capable of remembering the selected boot device across power cycles; default value is False. Optional.",
"ipmi_local_address" : "local IPMB address for bridged requests. Used only if ipmi_bridging is set to \"single\" or \"dual\". Optional.", "ipmi_local_address": "local IPMB address for bridged requests. Used only if ipmi_bridging is set to \"single\" or \"dual\". Optional.",
"ipmi_transit_channel" : "transit channel for bridged request. Required only if ipmi_bridging is set to \"dual\".", "ipmi_password": "password. Optional.",
"ipmi_transit_address" : "transit address for bridged request. Required only if ipmi_bridging is set to \"dual\".", "ipmi_port": "remote IPMI RMCP port. Optional.",
"ipmi_username" : "username; default is NULL user. Optional.", "ipmi_priv_level": "privilege level; default is ADMINISTRATOR. One of ADMINISTRATOR, CALLBACK, OPERATOR, USER. Optional.",
"deploy_ramdisk" : "UUID (from Glance) of the ramdisk that is mounted at boot time. Required.", "ipmi_protocol_version": "the version of the IPMI protocol; default is \"2.0\". One of \"1.5\", \"2.0\". Optional.",
"ipmi_target_channel" : "destination channel for bridged request. Required only if ipmi_bridging is set to \"single\" or \"dual\".", "ipmi_target_address": "destination address for bridged request. Required only if ipmi_bridging is set to \"single\" or \"dual\".",
"ipmi_terminal_port" : "node's UDP port to connect to. Only required for console access.", "ipmi_target_channel": "destination channel for bridged request. Required only if ipmi_bridging is set to \"single\" or \"dual\".",
"image_http_proxy" : "URL of a proxy server for HTTP connections. Optional.", "ipmi_terminal_port": "node's UDP port to connect to. Only required for console access.",
"ipmi_priv_level" : "privilege level; default is ADMINISTRATOR. One of ADMINISTRATOR, CALLBACK, OPERATOR, USER. Optional.", "ipmi_transit_address": "transit address for bridged request. Required only if ipmi_bridging is set to \"dual\".",
"ipmi_protocol_version" : "the version of the IPMI protocol; default is \"2.0\". One of \"1.5\", \"2.0\". Optional.", "ipmi_transit_channel": "transit channel for bridged request. Required only if ipmi_bridging is set to \"dual\".",
"ipmi_port" : "remote IPMI RMCP port. Optional." "ipmi_username": "username; default is NULL user. Optional."
} }

View File

@ -1,30 +1,108 @@
{ {
"drivers" : [ "drivers": [
{ {
"hosts" : [ "hosts": [
"localhost" "897ab1dad809"
], ],
"links" : [ "links": [
{ {
"href" : "http://127.0.0.1:6385/v1/drivers/agent_ipmitool", "href": "http://127.0.0.1:6385/v1/drivers/agent_ssh",
"rel" : "self" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/drivers/agent_ipmitool", "href": "http://127.0.0.1:6385/drivers/agent_ssh",
"rel" : "bookmark" "rel": "bookmark"
} }
], ],
"name" : "agent_ipmitool", "name": "agent_ssh",
"properties" : [ "properties": [
{ {
"rel" : "self", "href": "http://127.0.0.1:6385/v1/drivers/agent_ssh/properties",
"href" : "http://127.0.0.1:6385/v1/drivers/agent_ipmitool/properties" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/drivers/agent_ipmitool/properties", "href": "http://127.0.0.1:6385/drivers/agent_ssh/properties",
"rel" : "bookmark" "rel": "bookmark"
} }
] ]
} },
] {
"hosts": [
"897ab1dad809"
],
"links": [
{
"href": "http://127.0.0.1:6385/v1/drivers/pxe_ipmitool",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/pxe_ipmitool",
"rel": "bookmark"
}
],
"name": "pxe_ipmitool",
"properties": [
{
"href": "http://127.0.0.1:6385/v1/drivers/pxe_ipmitool/properties",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/pxe_ipmitool/properties",
"rel": "bookmark"
}
]
},
{
"hosts": [
"897ab1dad809"
],
"links": [
{
"href": "http://127.0.0.1:6385/v1/drivers/agent_ipmitool",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/agent_ipmitool",
"rel": "bookmark"
}
],
"name": "agent_ipmitool",
"properties": [
{
"href": "http://127.0.0.1:6385/v1/drivers/agent_ipmitool/properties",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/agent_ipmitool/properties",
"rel": "bookmark"
}
]
},
{
"hosts": [
"897ab1dad809"
],
"links": [
{
"href": "http://127.0.0.1:6385/v1/drivers/fake",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/fake",
"rel": "bookmark"
}
],
"name": "fake",
"properties": [
{
"href": "http://127.0.0.1:6385/v1/drivers/fake/properties",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/drivers/fake/properties",
"rel": "bookmark"
}
]
}
]
} }

View File

@ -0,0 +1,34 @@
{
"config": {
"heartbeat_timeout": 300,
"metrics": {
"backend": "noop",
"global_prefix": null,
"prepend_host": false,
"prepend_host_reverse": true,
"prepend_uuid": false
},
"metrics_statsd": {
"statsd_host": "localhost",
"statsd_port": 8125
}
},
"node": {
"driver_internal_info": {
"clean_steps": null
},
"instance_info": {},
"links": [
{
"href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"rel": "bookmark"
}
],
"properties": {},
"uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
}
}

View File

@ -1,4 +1,8 @@
{ {
"name": "test_node",
"driver": "agent_ipmitool", "driver": "agent_ipmitool",
"name": "test_node" "driver_info": {
"ipmi_username": "ADMIN",
"ipmi_password": "password"
}
} }

View File

@ -1,58 +1,63 @@
{ {
"last_error" : null, "clean_step": {},
"extra" : {}, "console_enabled": false,
"reservation" : null, "created_at": "2016-08-18T22:28:48.643434+00:00",
"driver" : "agent_ipmitool", "driver": "agent_ipmitool",
"instance_info" : {}, "driver_info": {
"created_at" : "2016-05-04T22:59:49.300836+00:00", "ipmi_password": "******",
"raid_config" : {}, "ipmi_username": "ADMIN"
"uuid" : "14deb747-127c-4fe4-be9d-906c43006cd4", },
"maintenance_reason" : null, "driver_internal_info": {},
"target_provision_state" : null, "extra": {},
"ports" : [ "inspection_finished_at": null,
{ "inspection_started_at": null,
"rel" : "self", "instance_info": {},
"href" : "http://127.0.0.1:6385/v1/nodes/14deb747-127c-4fe4-be9d-906c43006cd4/ports" "instance_uuid": null,
}, "last_error": null,
{ "links": [
"rel" : "bookmark", {
"href" : "http://127.0.0.1:6385/nodes/14deb747-127c-4fe4-be9d-906c43006cd4/ports" "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
} "rel": "self"
], },
"power_state" : null, {
"instance_uuid" : null, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"name" : "test_node_", "rel": "bookmark"
"properties" : {}, }
"clean_step" : {}, ],
"console_enabled" : false, "maintenance": false,
"driver_internal_info" : {}, "maintenance_reason": null,
"target_power_state" : null, "name": "test_node",
"inspection_started_at" : null, "network_interface": "flat",
"provision_state" : "enroll", "ports": [
"provision_updated_at" : null, {
"driver_info" : {}, "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
"inspection_finished_at" : null, "rel": "self"
"updated_at" : null, },
"links" : [ {
{ "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
"rel" : "self", "rel": "bookmark"
"href" : "http://127.0.0.1:6385/v1/nodes/14deb747-127c-4fe4-be9d-906c43006cd4" }
}, ],
{ "power_state": null,
"href" : "http://127.0.0.1:6385/nodes/14deb747-127c-4fe4-be9d-906c43006cd4", "properties": {},
"rel" : "bookmark" "provision_state": "enroll",
} "provision_updated_at": null,
], "raid_config": {},
"target_raid_config" : {}, "reservation": null,
"maintenance" : false, "resource_class": null,
"states" : [ "states": [
{ {
"href" : "http://127.0.0.1:6385/v1/nodes/14deb747-127c-4fe4-be9d-906c43006cd4/states", "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"rel" : "self" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/nodes/14deb747-127c-4fe4-be9d-906c43006cd4/states", "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"rel" : "bookmark" "rel": "bookmark"
} }
] ],
"target_power_state": null,
"target_provision_state": null,
"target_raid_config": {},
"updated_at": null,
"uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
} }

View File

@ -0,0 +1,4 @@
{
"boot_device": "pxe",
"persistent": false
}

View File

@ -1,11 +1,11 @@
{ {
"last_error" : "", "console_enabled": false,
"target_raid_config" : {}, "last_error": null,
"target_power_state" : null, "power_state": "power off",
"console_enabled" : false, "provision_state": "available",
"target_provision_state" : null, "provision_updated_at": "2016-08-18T22:28:49.382814+00:00",
"provision_updated_at" : null, "raid_config": {},
"power_state" : "power off", "target_power_state": null,
"raid_config" : {}, "target_provision_state": null,
"provision_state" : "available" "target_raid_config": {}
} }

View File

@ -1,9 +1,5 @@
{ {
"supported_boot_devices" : [ "supported_boot_devices": [
"pxe", "pxe"
"disk", ]
"cdrom",
"bios",
"safe"
]
} }

View File

@ -1,29 +1,29 @@
{ {
"ports" : [ "ports": [
{ {
"extra" : {}, "address": "22:22:22:22:22:22",
"address" : "22:22:22:22:22:22", "created_at": "2016-08-18T22:28:49.946416+00:00",
"updated_at" : "2016-05-05T22:48:52+00:00", "extra": {},
"node_uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "internal_info": {},
"links" : [ "links": [
{ {
"rel" : "self", "href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/v1/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"rel" : "bookmark" "rel": "bookmark"
} }
], ],
"created_at" : "2016-05-05T22:30:57+00:00", "local_link_connection": {
"uuid" : "c933a251-486f-4c27-adb2-8b5f59bd9cd2", "port_id": "Ethernet3/1",
"pxe_enabled": true, "switch_id": "0a:1b:2c:3d:4e:5f",
"local_link_connection": { "switch_info": "switch1"
"switch_id": "0a:1b:2c:3d:4e:5f", },
"port_id": "Ethernet3/1", "node_uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
"switch_info": "switch1" "pxe_enabled": true,
}, "updated_at": "2016-08-18T22:28:50.148137+00:00",
"internal_info": {} "uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
} }
] ]
} }

View File

@ -1,18 +1,18 @@
{ {
"ports" : [ "ports": [
{ {
"uuid" : "c933a251-486f-4c27-adb2-8b5f59bd9cd2", "address": "22:22:22:22:22:22",
"links" : [ "links": [
{ {
"href" : "http://127.0.0.1:6385/v1/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"rel" : "self" "rel": "self"
}, },
{ {
"href" : "http://127.0.0.1:6385/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"rel" : "bookmark" "rel": "bookmark"
} }
], ],
"address" : "22:22:22:22:22:22" "uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
} }
] ]
} }

View File

@ -0,0 +1,3 @@
{
"target": "provide"
}

View File

@ -2,11 +2,11 @@
"target": "clean", "target": "clean",
"clean_steps": [ "clean_steps": [
{ {
'interface': 'deploy', "interface": "deploy",
'step': 'upgrade_firmware', "step": "upgrade_firmware",
'args': { "args": {
'force': True "force": "True"
} }
} }
] ]
} }

View File

@ -0,0 +1,3 @@
{
"target": "manage"
}

View File

@ -1,71 +1,65 @@
{ {
"target_provision_state" : null, "clean_step": {},
"instance_info" : {}, "console_enabled": false,
"updated_at" : "2016-05-05T00:28:40+00:00", "created_at": "2016-08-18T22:28:48.643434+00:00",
"maintenance_reason" : null, "driver": "fake",
"inspection_started_at" : null, "driver_info": {
"target_power_state" : null, "ipmi_password": "******",
"ports" : [ "ipmi_username": "ADMIN"
{ },
"rel" : "self", "driver_internal_info": {
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports" "clean_steps": null
}, },
{ "extra": {},
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports", "inspection_finished_at": null,
"rel" : "bookmark" "inspection_started_at": null,
} "instance_info": {},
], "instance_uuid": null,
"maintenance" : false, "last_error": null,
"driver" : "fake", "links": [
"provision_state" : "available", {
"reservation" : null, "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "rel": "self"
"extra" : { },
"foo" : "bar" {
}, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"driver_internal_info" : {}, "rel": "bookmark"
"states" : [ }
{ ],
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states", "maintenance": false,
"rel" : "self" "maintenance_reason": null,
}, "name": "test_node",
{ "network_interface": "flat",
"rel" : "bookmark", "ports": [
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states" {
} "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
], "rel": "self"
"target_raid_config" : {}, },
"console_enabled" : false, {
"clean_step" : {}, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
"last_error" : null, "rel": "bookmark"
"links" : [ }
{ ],
"rel" : "self", "power_state": "power off",
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb" "properties": {},
}, "provision_state": "available",
{ "provision_updated_at": "2016-08-18T22:28:49.382814+00:00",
"rel" : "bookmark", "raid_config": {},
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb" "reservation": null,
} "resource_class": null,
], "states": [
"provision_updated_at" : null, {
"name" : "test_node", "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"properties" : { "rel": "self"
"local_gb" : 10, },
"cpu_arch" : "x86_64", {
"cpus" : 1, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"memory_mb" : 1024 "rel": "bookmark"
}, }
"power_state" : "power off", ],
"created_at" : "2016-04-20T16:51:03+00:00", "target_power_state": null,
"instance_uuid" : null, "target_provision_state": null,
"raid_config" : {}, "target_raid_config": {},
"driver_info" : { "updated_at": "2016-08-18T22:28:49.653974+00:00",
"ipmi_password" : "***", "uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
"ipmi_username" : "ADMIN",
"ipmi_address" : "1.2.3.4",
"deploy_kernel" : "http://127.0.0.1/images/kernel",
"deploy_ramdisk" : "http://127.0.0.1/images/ramdisk"
},
"inspection_finished_at" : null
} }

View File

@ -1,12 +1,17 @@
[ [
{ {
"op" : "replace", "op": "replace",
"path" : "/driver_info/ipmi_username", "path": "/driver_info/ipmi_username",
"value" : "OPERATOR" "value": "OPERATOR"
}, },
{ {
"value" : "10.0.0.123", "op": "add",
"op" : "replace", "path": "/driver_info/deploy_kernel",
"path" : "/driver_info/ipmi_address" "value": "http://127.0.0.1/images/kernel"
},
{
"op": "add",
"path": "/driver_info/deploy_ramdisk",
"value": "http://127.0.0.1/images/ramdisk"
} }
] ]

View File

@ -1,71 +1,67 @@
{ {
"properties" : { "clean_step": {},
"memory_mb" : 1024, "console_enabled": false,
"cpus" : 1, "created_at": "2016-08-18T22:28:48+00:00",
"local_gb" : 10, "driver": "fake",
"cpu_arch" : "x86_64" "driver_info": {
}, "deploy_kernel": "http://127.0.0.1/images/kernel",
"maintenance_reason" : null, "deploy_ramdisk": "http://127.0.0.1/images/ramdisk",
"instance_info" : {}, "ipmi_password": "******",
"states" : [ "ipmi_username": "OPERATOR"
{ },
"rel" : "self", "driver_internal_info": {
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states" "clean_steps": null
}, },
{ "extra": {},
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states", "inspection_finished_at": null,
"rel" : "bookmark" "inspection_started_at": null,
} "instance_info": {},
], "instance_uuid": null,
"driver_internal_info" : {}, "last_error": null,
"power_state" : "power off", "links": [
"console_enabled" : false, {
"last_error" : null, "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"target_raid_config" : {}, "rel": "self"
"maintenance" : false, },
"provision_state" : "available", {
"uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"links" : [ "rel": "bookmark"
{ }
"rel" : "self", ],
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb" "maintenance": true,
}, "maintenance_reason": "Replacing the hard drive",
{ "name": "test_node",
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "network_interface": "flat",
"rel" : "bookmark" "ports": [
} {
], "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
"clean_step" : {}, "rel": "self"
"created_at" : "2016-04-20T16:51:03+00:00", },
"instance_uuid" : null, {
"target_power_state" : null, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
"driver_info" : { "rel": "bookmark"
"ipmi_address" : "10.0.0.123", }
"deploy_ramdisk" : "http://127.0.0.1/images/ramdisk", ],
"deploy_kernel" : "http://127.0.0.1/images/kernel", "power_state": "power off",
"ipmi_password" : "***", "properties": {},
"ipmi_username" : "OPERATOR" "provision_state": "available",
}, "provision_updated_at": "2016-08-18T22:28:49+00:00",
"inspection_started_at" : null, "raid_config": {},
"raid_config" : {}, "reservation": null,
"inspection_finished_at" : null, "resource_class": null,
"reservation" : null, "states": [
"target_provision_state" : null, {
"extra" : { "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"foo" : "bar" "rel": "self"
}, },
"driver" : "fake", {
"name" : "test_node", "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"updated_at" : "2016-05-05T18:43:41+00:00", "rel": "bookmark"
"ports" : [ }
{ ],
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports", "target_power_state": null,
"rel" : "self" "target_provision_state": null,
}, "target_raid_config": {},
{ "updated_at": "2016-08-18T22:28:50+00:00",
"rel" : "bookmark", "uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports"
}
],
"provision_updated_at" : null
} }

View File

@ -0,0 +1,7 @@
[
{
"op" : "replace",
"path" : "/driver",
"value" : "fake"
}
]

View File

@ -1,27 +1,26 @@
{ {
"management" : { "boot": {
"result" : true "result": true
}, },
"inspect" : { "console": {
"result" : null, "result": true
"reason" : "not supported" },
}, "deploy": {
"power" : { "result": true
"result" : true },
}, "inspect": {
"raid" : { "result": true
"result" : true },
}, "management": {
"boot" : { "result": true
"result" : false, },
"reason" : "Cannot validate image information for node ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb because one or more parameters are missing from its instance_info.. Missing are: ['ramdisk', 'kernel', 'image_source']" "network": {
}, "result": true
"console" : { },
"result" : false, "power": {
"reason" : "Missing 'ipmi_terminal_port' parameter in node's driver_info." "result": true
}, },
"deploy" : { "raid": {
"reason" : "Cannot validate image information for node ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb because one or more parameters are missing from its instance_info.. Missing are: ['ramdisk', 'kernel', 'image_source']", "result": true
"result" : false }
}
} }

View File

@ -1,26 +1,29 @@
{ {
"bmc_reset" : { "bmc_reset": {
"async" : true, "async": true,
"description" : "", "attach": false,
"http_methods" : [ "description": "",
"POST" "http_methods": [
], "POST"
"attach" : false ],
}, "require_exclusive_lock": true
"send_raw" : { },
"description" : "", "heartbeat": {
"attach" : false, "async": true,
"http_methods" : [ "attach": false,
"POST" "description": "",
], "http_methods": [
"async" : true "POST"
}, ],
"heartbeat" : { "require_exclusive_lock": true
"async" : true, },
"attach" : false, "send_raw": {
"http_methods" : [ "async": true,
"POST" "attach": false,
], "description": "",
"description" : "" "http_methods": [
} "POST"
],
"require_exclusive_lock": true
}
} }

View File

@ -1,75 +1,69 @@
{ {
"nodes" : [ "nodes": [
{ {
"reservation" : null, "clean_step": {},
"driver" : "agent_ipmitool", "console_enabled": false,
"uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "created_at": "2016-08-18T22:28:48.643434+00:00",
"extra" : { "driver": "fake",
"foo" : "bar" "driver_info": {
}, "ipmi_password": "******",
"provision_updated_at" : null, "ipmi_username": "ADMIN"
"provision_state" : "available", },
"clean_step" : {}, "driver_internal_info": {
"maintenance" : false, "clean_steps": null
"driver_internal_info" : {}, },
"console_enabled" : false, "extra": {},
"raid_config" : {}, "inspection_finished_at": null,
"target_raid_config" : {}, "inspection_started_at": null,
"inspection_started_at" : null, "instance_info": {},
"instance_info" : {}, "instance_uuid": null,
"states" : [ "last_error": null,
{ "links": [
"rel" : "self", {
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states" "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
}, "rel": "self"
{ },
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/states", {
"rel" : "bookmark" "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
} "rel": "bookmark"
], }
"last_error" : null, ],
"properties" : { "maintenance": false,
"cpus" : 1, "maintenance_reason": null,
"memory_mb" : 1024, "name": "test_node",
"local_gb" : 10, "network_interface": "flat",
"cpu_arch" : "x86_64" "ports": [
}, {
"links" : [ "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
{ "rel": "self"
"rel" : "self", },
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb" {
}, "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/ports",
{ "rel": "bookmark"
"rel" : "bookmark", }
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb" ],
} "power_state": "power off",
], "properties": {},
"name" : "test_node", "provision_state": "available",
"ports" : [ "provision_updated_at": "2016-08-18T22:28:49.382814+00:00",
{ "raid_config": {},
"rel" : "self", "reservation": null,
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports" "resource_class": null,
}, "states": [
{ {
"rel" : "bookmark", "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb/ports" "rel": "self"
} },
], {
"created_at" : "2016-04-20T16:51:03+00:00", "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d/states",
"updated_at" : "2016-05-04T23:24:20+00:00", "rel": "bookmark"
"maintenance_reason" : null, }
"inspection_finished_at" : null, ],
"driver_info" : { "target_power_state": null,
"deploy_kernel" : "http://127.0.0.1/images/kernel", "target_provision_state": null,
"ipmi_address" : "1.2.3.4", "target_raid_config": {},
"deploy_ramdisk" : "http://127.0.0.1/images/ramdisk", "updated_at": "2016-08-18T22:28:49.653974+00:00",
"ipmi_password" : "******", "uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
"ipmi_username" : "ADMIN", }
}, ]
"instance_uuid" : null,
"power_state" : "power off",
"target_power_state" : null,
"target_provision_state" : null
}
]
} }

View File

@ -1,22 +1,22 @@
{ {
"nodes" : [ "nodes": [
{ {
"provision_state" : "available", "instance_uuid": null,
"name" : "test_node", "links": [
"maintenance" : false, {
"uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "href": "http://127.0.0.1:6385/v1/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
"links" : [ "rel": "self"
{ },
"href" : "http://127.0.0.1:6385/v1/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", {
"rel" : "self" "href": "http://127.0.0.1:6385/nodes/6d85703a-565d-469a-96ce-30b6de53079d",
}, "rel": "bookmark"
{ }
"href" : "http://127.0.0.1:6385/nodes/ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", ],
"rel" : "bookmark" "maintenance": false,
} "name": "test_node",
], "power_state": "power off",
"instance_uuid" : null, "provision_state": "available",
"power_state" : "power off" "uuid": "6d85703a-565d-469a-96ce-30b6de53079d"
} }
] ]
} }

View File

@ -1,5 +1,5 @@
{ {
"node_uuid": "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "node_uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
"address": "11:11:11:11:11:11", "address": "11:11:11:11:11:11",
"local_link_connection": { "local_link_connection": {
"switch_id": "0a:1b:2c:3d:4e:5f", "switch_id": "0a:1b:2c:3d:4e:5f",

View File

@ -1,25 +1,25 @@
{ {
"created_at" : "2016-05-05T22:30:57.924480+00:00", "address": "11:11:11:11:11:11",
"links" : [ "created_at": "2016-08-18T22:28:49.946416+00:00",
{ "extra": {},
"rel" : "self", "internal_info": {},
"href" : "http://127.0.0.1:6385/v1/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2" "links": [
}, {
{ "href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "rel": "self"
"rel" : "bookmark" },
} {
], "href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"extra" : {}, "rel": "bookmark"
"address" : "11:11:11:11:11:11", }
"updated_at" : null, ],
"node_uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "local_link_connection": {
"uuid" : "c933a251-486f-4c27-adb2-8b5f59bd9cd2", "port_id": "Ethernet3/1",
"pxe_enabled": true, "switch_id": "0a:1b:2c:3d:4e:5f",
"local_link_connection": { "switch_info": "switch1"
"switch_id": "0a:1b:2c:3d:4e:5f", },
"port_id": "Ethernet3/1", "node_uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
"switch_info": "switch1" "pxe_enabled": true,
}, "updated_at": null,
"internal_info": {} "uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
} }

View File

@ -1,29 +1,29 @@
{ {
"ports" : [ "ports": [
{ {
"node_uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "address": "11:11:11:11:11:11",
"extra" : {}, "created_at": "2016-08-18T22:28:49.946416+00:00",
"updated_at" : "2016-05-05T22:48:52+00:00", "extra": {},
"uuid" : "c933a251-486f-4c27-adb2-8b5f59bd9cd2", "internal_info": {},
"address" : "22:22:22:22:22:22", "links": [
"links" : [ {
{ "href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/v1/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "rel": "self"
"rel" : "self" },
}, {
{ "href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "rel": "bookmark"
"rel" : "bookmark" }
} ],
], "local_link_connection": {
"created_at" : "2016-05-05T22:30:57+00:00", "port_id": "Ethernet3/1",
"pxe_enabled": true, "switch_id": "0a:1b:2c:3d:4e:5f",
"local_link_connection": { "switch_info": "switch1"
"switch_id": "0a:1b:2c:3d:4e:5f", },
"port_id": "Ethernet3/1", "node_uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
"switch_info": "switch1" "pxe_enabled": true,
}, "updated_at": null,
"internal_info": {} "uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
} }
] ]
} }

View File

@ -0,0 +1,18 @@
{
"ports": [
{
"address": "11:11:11:11:11:11",
"links": [
{
"href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"rel": "self"
},
{
"href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"rel": "bookmark"
}
],
"uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
}
]
}

View File

@ -1,25 +1,25 @@
{ {
"node_uuid" : "ecddf26d-8c9c-4ddf-8f45-fd57e09ccddb", "address": "22:22:22:22:22:22",
"extra" : {}, "created_at": "2016-08-18T22:28:49+00:00",
"updated_at" : "2016-05-05T22:48:52+00:00", "extra": {},
"uuid" : "c933a251-486f-4c27-adb2-8b5f59bd9cd2", "internal_info": {},
"address" : "22:22:22:22:22:22", "links": [
"links" : [ {
{ "href": "http://127.0.0.1:6385/v1/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/v1/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "rel": "self"
"rel" : "self" },
}, {
{ "href": "http://127.0.0.1:6385/ports/d2b30520-907d-46c8-bfee-c5586e6fb3a1",
"href" : "http://127.0.0.1:6385/ports/c933a251-486f-4c27-adb2-8b5f59bd9cd2", "rel": "bookmark"
"rel" : "bookmark" }
} ],
], "local_link_connection": {
"created_at" : "2016-05-05T22:30:57+00:00", "port_id": "Ethernet3/1",
"pxe_enabled": true, "switch_id": "0a:1b:2c:3d:4e:5f",
"local_link_connection": { "switch_info": "switch1"
"switch_id": "0a:1b:2c:3d:4e:5f", },
"port_id": "Ethernet3/1", "node_uuid": "6d85703a-565d-469a-96ce-30b6de53079d",
"switch_info": "switch1" "pxe_enabled": true,
}, "updated_at": "2016-08-18T22:28:50+00:00",
"internal_info": {} "uuid": "d2b30520-907d-46c8-bfee-c5586e6fb3a1"
} }