7.1 KiB
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