Expose conductor information from API¶
https://storyboard.openstack.org/#!/story/1724474
The spec proposes to expose conductor information from API, as well as the mapping between conductors and nodes.
Problem description¶
In deployment with multiple ironic conductors incorporated, nodes are distributed across conductors by hashring, currently we have no mechanism to identify the specific conductor for a given node without database query.
There are several cases we need to locate the host of the conductor for a node, for example:
A node failed to boot from PXE during node deploy, we need to check the PXE environment of the conductor host.
Ramdisk logs are stored in the conductor host if the backend is set to local, this requires identifying the exact conductor which serves a node.
Meanwhile we are lacking support from API for information related with conductors, which might be useful for diagnostic. For example:
How many conductors in this cloud, whether they are alive.
The conductor group each conductor belongs to.
Nodes currently mapped to this conductor.
This information also makes it possible to implement features like service monitoring, alarming from the outside of ironic.
Proposed change¶
Adds an API endpoint /v1/conductors
to retrieve a list of conductor
information, including the hostname, conductor group, and alive flag.
The alive flag is calculated in the same way as how ironic assumes a conductor
is not alive, by checking update_at
and heartbeat_timeout
.
Adds API endpoint /v/conductors/{hostname}
to retrieve detailed conductor
information, including nodes affiliated with this conductor. The mapping is
retrieved from hashring.
Adds a field conductor
to the Node API object, which indicates the
hostname of the conductor currently the node is mapped to.
Alternatives¶
Admins can directly query the ironic database for a conductor list. To locate
the last conductor that served a node, query nodes table for the
conductor_affinity
field, then query conductors
table for the hostname
of the conductor. The conductor_affinity
is updated in several cases,
mainly during node deployment time. There is no alternative to get the
real time mapping from the hashring.
Data model impact¶
None
State Machine Impact¶
None
REST API impact¶
API microversion will be bumped.
Add a new conductor
API object, and three API endpoints:
GET /v1/conductors
Get the list of conductors known by ironic
Client with earlier microversion before this feature implemented will receive 404. For a normal request, 200 is returned.
Sample response data:
{ "conductors": [ { "hostname": "Compute01", "conductor_group": "region1", "alive": true, "links": [ { "href": "http://127.0.0.1:6385/v1/conductors/Compute01", "rel": "self" }, { "href": "http://127.0.0.1:6385/conductors/Compute01", "rel": "bookmark" } ] }, { "hostname": "Compute03", "conductor_group": "region1", "alive": true, "links": [...] } ] }
GET /v1/conductors/{hostname}
Get detailed information of a conductor by hostname
Client with earlier microversion before this feature implemented will receive 404. For a normal request, 200 is returned.
Sample response data:
{ "hostname": "Compute01", "conductor_group": "region1", "alive": true "drivers": ["ipmi"], "last_seen": "2018-09-10 19:53:17" "links": [ { "href": "http://127.0.0.1:6385/v1/conductors/Compute01", "rel": "self" }, { "href": "http://127.0.0.1:6385/conductors/Compute01", "rel": "bookmark" } ] }
GET /v1/nodes/{node_ident}/conductor
Get detailed information of a conductor for given node
Client with earlier microversion before this feature implemented will receive 404. For a normal request, 200 is returned.
The response data is same as /v1/conductors/{hostname}
Change Node
API object in the following way:
Add a read-only attribute
conductor
to indicate the hostname of associated conductor.Retrieve and assign the conductor hostname in
Node.convert_with_links
.
The hostname of the conductor will be returned in these endpoints:
POST /v1/nodes
GET /v1/nodes
(whendetail
is set to true)GET /v1/nodes/detail
GET /v1/nodes/{node_ident}
Sample response data for GET /v1/nodes/{node_ident}
would be:
{
"nodes": [
{
"instance_uuid": null,
"conductor": "Compute01",
"uuid": "a308bca6-e6a3-4349-b8ea-695e17672898",
"links": ...,
"maintenance": false,
"provision_state": "available",
"power_state": "power off",
"name": "node-0"
}
]
}
Add support for querying nodes by conductor hostname for endpoints:
GET /v1/nodes
GET /v1/nodes/detail
For example, GET /v1/nodes/?conductor=Compute01
will return nodes mapped
to the conductor whose hostname is Compute01.
Client (CLI) impact¶
“ironic” CLI¶
None
“openstack baremetal” CLI¶
Enhance ironic client with two new command:
openstack baremetal conductor list
openstack baremetal conductor show <hostname>
Expose the conductor field in command:
openstack baremetal node list --detail
openstack baremetal node show <node>
Support node querying by conductor hostname:
openstack baremetal node list --conductor <hostname>
RPC API impact¶
None
Driver API impact¶
None
Nova driver impact¶
None
Ramdisk impact¶
None
Security impact¶
None
Other end user impact¶
None
Scalability impact¶
None
Performance Impact¶
None
Other deployer impact¶
None
Developer impact¶
None
Implementation¶
Assignee(s)¶
- Primary assignee:
kaifeng <kaifeng.w@gmail.com>
Work Items¶
Implement the API endpoints.
Add
conductor
field to node API object.CLI enhancement for API changes.
Documentation and api reference.
Dependencies¶
None
Testing¶
The feature will be covered by unit tests.
Upgrades and Backwards Compatibility¶
The feature will be guarded by microversion.
Documentation Impact¶
New APIs will be documented in the API reference. New commands will be documented in the ironicclient documentation.
References¶
None