Merge "Event Subscription Idea"
This commit is contained in:
commit
6699db48d7
|
@ -0,0 +1,371 @@
|
||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
|
||||||
|
===================
|
||||||
|
BMC event framework
|
||||||
|
===================
|
||||||
|
|
||||||
|
https://storyboard.openstack.org/#!/story/2008366
|
||||||
|
|
||||||
|
The goal of this spec is to provide an API to manage subscriptions for BMC
|
||||||
|
events. The user will be able to provide a URL where the BMC will post the
|
||||||
|
events.
|
||||||
|
|
||||||
|
Non-goals:
|
||||||
|
* Unify event formats or payloads across drivers.
|
||||||
|
|
||||||
|
* Provide a way to poll for events.
|
||||||
|
|
||||||
|
* Proxy notifications (see [RFE 2008555](https://storyboard.openstack.org/#!/story/2008555)).
|
||||||
|
|
||||||
|
* Store events in ironic at all.
|
||||||
|
|
||||||
|
* Update an existing subscription in the BMC, at this time, as some vendors
|
||||||
|
support partial updates where as other vendors essentially require a
|
||||||
|
delete/re-creation to perform an update. This may be something that can
|
||||||
|
be added later, but it seems not feasible at this time.
|
||||||
|
|
||||||
|
* Choosing EventTypes when creating a subscription won't be supported,
|
||||||
|
since option is deprecated since [EventDestination v1_5_0](https://redfish.dmtf.org/schemas/v1/EventDestination.v1_5_0.json).
|
||||||
|
|
||||||
|
* Support for creating subscriptions with HTTP Headers.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Some BMC's have support to subscribe to specific event notifications about the
|
||||||
|
hardware (e.g., overheating, removal of the device).
|
||||||
|
|
||||||
|
* As an ironic user, I want to configure the BMC to send event notifications
|
||||||
|
about potential failures to a specific URI.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
This RFE proposes a new top level ReST API `subscriptions` that will allow
|
||||||
|
listing, creating and deleting subscriptions for nodes.
|
||||||
|
|
||||||
|
Subscriptions workflow
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
#. Create a subscription ``POST /v1/nodes/<node_ident>/management/``
|
||||||
|
``subscriptions``
|
||||||
|
|
||||||
|
#. Delete a subscription ``DELETE /v1/nodes/<node_ident>/management/``
|
||||||
|
``subscriptions/<subscription_bmc_id>``
|
||||||
|
|
||||||
|
#. List subscriptions ``GET /v1/nodes/<node_ident>/management/subscriptions``
|
||||||
|
|
||||||
|
#. Show subscription ``GET /v1/nodes/<node_ident>/management/subscriptions/``
|
||||||
|
``<subscription_bmc_id>``
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
The user can directly access the BMC and configure the subscriptions.
|
||||||
|
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
State Machine Impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Update the REST API for the node object to allow create/delete/list
|
||||||
|
event subscriptions.
|
||||||
|
|
||||||
|
* ``GET /v1/nodes/<node_ident>/management/subscriptions``
|
||||||
|
|
||||||
|
Retrieves a list of all subscriptions available.
|
||||||
|
Returns a JSON object listing all available subscriptions or
|
||||||
|
empty list.
|
||||||
|
|
||||||
|
Error codes:
|
||||||
|
|
||||||
|
* 404 - Node Not Found / microversion not high enough for API consumer.
|
||||||
|
|
||||||
|
Example response object:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"subscriptions": [
|
||||||
|
{
|
||||||
|
"id": "<subscription_bmc_id1>",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://127.0.0.1:6486/v1/nodes/<node_id>/management/
|
||||||
|
subscriptions/<subscription_bmc_id1>",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://127.0.0.1:6486/nodes/<node_id>/management/
|
||||||
|
subscriptions/<subscription_bmc_id1>",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "<subscription_bmc_id2>",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://127.0.0.1:6486/v1/nodes/<node_id>/management/
|
||||||
|
subscriptions/<subscription_bmc_id2>",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://127.0.0.1:6486/nodes/<node_id>/management/
|
||||||
|
subscriptions/<subscription_bmc_id2>",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
* ``GET /v1/nodes/<node_ident>/management/subscriptions/subscription_bmc_id``
|
||||||
|
|
||||||
|
Retrieves a sbuscription. Returns a JSON object representing the choosen
|
||||||
|
subscription (``subscription_bmc_id``).
|
||||||
|
|
||||||
|
Error codes:
|
||||||
|
|
||||||
|
* 404 Not Found if node or subscription is not found.
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": "<subscription_bmc_id>",
|
||||||
|
"destination": "<destinatination_url>",
|
||||||
|
"protocol": "<protocol>",
|
||||||
|
"context": "<context>",
|
||||||
|
"event_types": ["Alert"]
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``POST /v1/nodes/<node_ident>/management/subscriptions``
|
||||||
|
|
||||||
|
Requests the creation of a subscription.
|
||||||
|
|
||||||
|
* Required: `destination`.
|
||||||
|
|
||||||
|
|
||||||
|
HTTP codes:
|
||||||
|
|
||||||
|
* 201 Created
|
||||||
|
* 400 Bad Request
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"destination": "http(s)://host/path",
|
||||||
|
}
|
||||||
|
|
||||||
|
* ``DELETE /v1/nodes/<node_ident>/management/subscriptions/
|
||||||
|
<subscription__bmc_id>``
|
||||||
|
|
||||||
|
Requests the deletion of a subscription
|
||||||
|
|
||||||
|
HTPP codes:
|
||||||
|
|
||||||
|
* 204 No Content
|
||||||
|
* 404 Not Found
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
The PATCH verb is not being supported at this time in this feature.
|
||||||
|
|
||||||
|
Client (CLI) impact
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The following commands will be created:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
baremetal node create subscription [node_uuid] [destination]
|
||||||
|
baremetal node subscription delete [subscription_uuid]
|
||||||
|
baremetal node subscription list [node]
|
||||||
|
baremetal node subscription show [node] [subscription_uuid]
|
||||||
|
|
||||||
|
"openstacksdk"
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Add support for the event subscriptions in openstacksdk.
|
||||||
|
|
||||||
|
RPC API impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The following new RPC calls will be added:
|
||||||
|
|
||||||
|
* Create subscription
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def create_subscription(self, context, node_id, destination, topic=None):
|
||||||
|
|
||||||
|
* Delete subscription
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def delete_subscription(self, context, node_id, subscription_bmc_id, topic=None):
|
||||||
|
|
||||||
|
* List subscriptions
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def get_all_subscriptions(self, context, node_id, topic=None):
|
||||||
|
|
||||||
|
* Get a subscription
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def get_subscription(self, context, node_id, subscription_bmc_id, topic=None):
|
||||||
|
|
||||||
|
Driver API impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The `ManagementInterface` will be updated with the following functions:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def create_subscription(self, task, destination):
|
||||||
|
"""Add the new subscription object to the BMC."""
|
||||||
|
|
||||||
|
def delete_subscription(self, task, subscription_bmc_id):
|
||||||
|
"""Remove the subscription from the BMC."""
|
||||||
|
|
||||||
|
def get_all_subscriptions(self, task):
|
||||||
|
"""List all subscriptions from the BMC"""
|
||||||
|
|
||||||
|
def get_subscriptions(self, task, subscription_bmc_id):
|
||||||
|
"""Get a subscriptions from the BMC"""
|
||||||
|
|
||||||
|
|
||||||
|
The above methods are implemented for Redfish hardware types.
|
||||||
|
We will disallow changing the management interface of a node if there are
|
||||||
|
any subscriptions.
|
||||||
|
|
||||||
|
Nova driver impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Ramdisk impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
It is recomended to use https.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The user won't be able to choose the ``EventTypes`` for the subscription,
|
||||||
|
since the option is deprecated in Redfish EventDestination v1_5_0.
|
||||||
|
We will be using `Alert` by default for the ``EventTypes``.
|
||||||
|
|
||||||
|
The user won't be able to choose the ``Protocol`` for the subscription,
|
||||||
|
by default it will be `Redfish` following the schema for EventDestination.
|
||||||
|
|
||||||
|
Scalability impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Other drivers may implement this feature if the BMC has support for
|
||||||
|
event subscription.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
<iurygregory, iurygregory@gmail.com>
|
||||||
|
|
||||||
|
Redfish Implementation Details
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
The actual support for EventDestination in sushy is based on schema [2]_,
|
||||||
|
since HW vendors are still working on adding support for newer versions where
|
||||||
|
the propertie ``EventTypes`` is deprecated. Based on this the Ironic API
|
||||||
|
will only accept the following redfish properties to create a subscription:
|
||||||
|
|
||||||
|
* Destination - Required
|
||||||
|
|
||||||
|
By default we are considering ``Protocol`` as `Redfish`, ``EventTypes`` as
|
||||||
|
`["Alert"]` and ``Context`` as `""`.
|
||||||
|
|
||||||
|
When vendors have the support for newer EventDestination new fields will be
|
||||||
|
added to the Ironic API.
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Add support for Events Subscriptions in sushy [1]_ [2]_.
|
||||||
|
* Add event subscription support to ManagementInterface
|
||||||
|
* Add event subscription support to redfish hardware type
|
||||||
|
* Add RPC for event subscriptions
|
||||||
|
* Add REST API for event subscriptions
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
* Unit Tests
|
||||||
|
* Tempest tests
|
||||||
|
|
||||||
|
|
||||||
|
Upgrades and Backwards Compatibility
|
||||||
|
====================================
|
||||||
|
|
||||||
|
No upgrade impact.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
* API reference will be added
|
||||||
|
* Client documentation will be added.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] https://redfish.dmtf.org/schemas/v1/EventService.v1_0_8.json
|
||||||
|
.. [2] https://redfish.dmtf.org/schemas/v1/EventDestination.v1_0_0.json
|
Loading…
Reference in New Issue