Merge "Event Subscription Idea"

This commit is contained in:
Zuul 2021-08-02 15:43:01 +00:00 committed by Gerrit Code Review
commit 6699db48d7

View File

@ -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