HPE Developer Community Portal

The Redfish® Event Service

François Donzé - Technical consultant

The Redfish Event Subscription Service

Updated: October 2019

Scope of this article

This article describes the Redfish Event Subscription service implemented in HPE iLO 5 with a firmware version of 1.40 or later. The implementation of this service in iLO 4 may differ slightly.

The Event Receiver program presented in this blog is an alternative to the DMTF Redfish-Event-Listener tool.

Traps versus event subscriptions

The Simple Network Management Protocol (SNMP) uses a "trap" mechanism to report asynchronous events generated by managed nodes toward pre-configured management consoles. All events are sent on the network and then processed by the management consoles. This approach may saturate the network and/or the management console in case of a storm of unsolicited events.

Another approach consists in filtering the events at the source, so only selected events are sent on the network toward specified event receivers (i.e. management consoles). Practically, the event receivers send a subscription request to the managed nodes containing the types of event that they are prepared to receive and process.

The Web-Based Enterprise Management (WBEM) standard uses this subscription paradigm, as well as the DMTF Redfish standard. Both of them define management web services but Redfish is much simpler for a common human being to understand, prototype and implement.

Redfish Event Subscription functional diagram

Do it yourself, it doesn't hurt

If you want to quickly prototype a Redfish event receiver, you need first to configure your favorite web server (Apache, IIS) to listen on port 443 (https) for asynchronous events coming from the managed nodes.

The following example is based on a simple PHP event receiver program installed in an Apache server. Any other web server (i.e. IIS) and language (i.e. JavaScript or cgi-bin) are possible alternatives.

Start to configure the Web Server and let it know the location of the EventReceiver.php program; the code below added in the Apache configuration file (httpd.conf) tells Apache to redirect requests to directory /opt/hpe/RedFishEventService. You may want to better secure this configuration entry to suite your security policy.

Alias /RedfishEvents** "/opt/hpe/RedfishEventService"
<Directory "/opt/hpe/RedfishEventService">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    AddHandler server-parsed .shtml
    AddType text/html .shtml
    Options +Includes
</Directory>

In the /opt/hpe/RedFishEventService directory of the Web Server, create the EventReceiver.php file with the following content. This code is triggered by the Web Server when an event comes from a managed node. Then event, which is an HTTPS POST message, is written to a text file so you can read it or submit it to other applications for further processing.

Read the comments enclosed in /*..*/ or following // to get a detailed explanation:

<?php
// Version 0.9999
/** This PHP script receives RESTful POST events from an iLO or a Superdome Flex RMC.
*   It reformats the JSON message with indentations and sends
*   it to a file in the current directory
**/

/*
* The JSON format functions.php comes from:
* https://github.com/GerHobbelt/nicejson-php
*/
include 'functions.php';

// iLO events will be written to $out_file
$out_file = "Redfish_events.txt" ;

// Read the Content of the POST message:
$body = file_get_contents("php://input");


// Read the headers values:
$headers = getallheaders() ;

// Get IP address of managed node
$IP_MANAGED = getenv ('REMOTE_ADDR') ;


// Write IP_MANAGED in $outfile:
file_put_contents($out_file, "IP Address of Managed node: $IP_MANAGED \n", FILE_APPEND) ;

// Display headers and values
foreach ($headers as $header => $value) {
    file_put_contents($out_file, "$header: $value \n", FILE_APPEND) ;
}

//Insert new line to separate headers from body
file_put_contents($out_file, "\n", FILE_APPEND);


// Format message in nice and human readable format
file_put_contents($out_file, json_format($body) . "\n\n", FILE_APPEND);

?>

Once the event receiver program is in place and Apache restarted, it waits for solicitations on the /RedfishEvents alias. We can now ask one or several iLOs to send one or more event types toward this Web Server. In our case, we subscribe to all possible events proposed by an iLO 5.

The exhaustive list of possible events to subscribe to is present at: https://<ilo-IP>/redfish/v1/EventService/

For testing and prototyping, the subscription can be done manually using the POSTMAN API development platform , PowerShell, or curl. In a production environment, I would recommend to use ilorest (former hprest) the iLO RESTful Interface Tool or an application using the best practices to crawl and parse remote managed nodes schemas.

Before posting the following payload toward your managed node at https://<IP>/redfish/v1/EventService/EventSubscriptions/ you must edit and replace the Destination attribute with the <IP> address of the event receiver and its location. Optionally you can add or remove EventTypes:

{
   "Destination": "https://<IP>/RedfishEvents/EventReceiver.php",
   "EventTypes": [
       "StatusChange",
       "ResourceUpdated",
       "ResourceAdded",
       "ResourceRemoved",
       "Alert"
   ],
   "HttpHeaders": {
       "Content-Type": "Application/JSON",
       "OData-Version": "4.0"
   },
   "Context": "Public",
   "Oem": {
       "Hp": {
           "DeliveryRetryIntervalInSeconds": 30,
           "RequestedMaxEventsToQueue": 20,
           "DeliveryRetryAttempts": 5,
           "RetireOldEventInMinutes": 10
       }
    }
}

A successful subscription returns a status code 201 as shown in the picture below. Note that this successful notification is part of an error object. Hence as a human being, you should always read the entire content of error objects as they can carry good news.

Moreover, the status message mentions as well in its Location header the location of the subscription in the managed node's Redfish tree. In this case the subscription has been posted at /redfish/v1/EventService/Subscriptions/32/.

To avoid un-wanted network traffic or overloaded Redfish engine, HPE implemented an Oem.Hpe section containing attributes regulating subscriptions. In case a managed node continuously fails to post events at its destination, the subscription is deleted automatically after a certain amount of time (DeliveryRetryAttempts * DeliveryRetryIntervalSeconds seconds). Otherwise, a subscription has a infinite life time until it is deleted using a HTTPs DELETE request to it Location URI.

Fake events

To test our event receiver PhP code, Redfish provides an URI in the managed node to simulate an event and send an alert to the subscribers.

POST the following JSON body to trigger a fake event in the managed node:

{
    "EventType": "StatusChange",
    "EventID": "myEventId",
    "EventTimestamp": "2016-10-11T09:42:59Z",
    "Severity": "OK",
    "Message": "This is a test message",
    "MessageID": "iLOEvents.0.9.ResourceStatusChanged",
    "MessageArgs": [ "arg0", "arg1" ],
    "OriginOfCondition": "/rest/v1/Chassis/1/FooBar"
}

Check your Event Receiver, you should find an entry like the following in the Redfish_events.txt file:

IP Address of Managed node: 192.168.1.111
Host: 192.168.0.99
Transfer-Encoding: chunked
Content-Type: application/json, Application/JSON
Cache-Control: no-cache
Date: Mon, 10 Oct 2016 14:28:36 GMT
X_HP-CHRP-Service-Version: 1.0.3

{
    "@odata.type": "#Event.1.0.0.Event",
    "Events": [
        {
            "EventTimestamp": "2016-10-11T09:42:59Z",
            "EventType": "StatusChange",
            "Message": "This is a test message",
            "MessageID": "iLOEvents.0.9.ResourceStatusChanged",
            "MessageId": "iLOEvents.0.9.ResourceStatusChanged",
        "Oem": {
            "Hp": {
            "@odata.type": "#HpEvent.1.0.0.HpEvent",
            "Resource": null
        }
    },
    "OriginOfCondition":
    "/rest/v1/Chassis/1/FooBar",
    "Severity": "OK"
    }
    ],
    "Name": "Events"
}

Conclusion

SNMP is still the preferred management protocol and may stay as such for a long time. However, modern alternatives like this Redfish Event Subscription exist for compute nodes and the upcoming Swordfish. Swordfish is the extension of Redfish for storage devices from the SNIA proposing as well this Event Service in its Specification version 1.0.