blob: dac6c5e196687ce29e2a3153fc7b5518d1503883 [file] [log] [blame]
#!/usr/bin/env python
import requests
import websocket
import json
import ssl
import gen_valid as gv
import gen_print as gp
class event_notification():
r"""
Main class to subscribe and receive event notifications.
"""
def __init__(self, host, username, password):
r"""
Initialize instance variables.
Description of argument(s):
host The IP or host name of the system to subscribe to.
username The username for the host system.
password The password for the host system.
"""
self.__host = host
self.__user = username
self.__password = password
def __del__(self):
try:
self.__websocket.close()
except AttributeError:
pass
def login(self):
r"""
Login and return session object.
"""
http_header = {'Content-Type': 'application/json'}
session = requests.session()
response = session.post('https://' + self.__host + '/login',
headers=http_header,
json={"data": [self.__user, self.__password]},
verify=False, timeout=30)
gv.valid_value(response.status_code, valid_values=[200])
login_response = json.loads(response.text)
gp.qprint_var(login_response)
gv.valid_value(login_response['status'], valid_values=['ok'])
return session
def subscribe(self, dbus_path, enable_trace=False):
r"""
Subscribe to the given path and return a list of event notifications.
For more details on "subscribe" and "events" go to
https://github.com/openbmc/docs/blob/master/rest-api.md#event-subscription-protocol
Example robot code:
${event_notifications}= Subscribe /xyz/openbmc_project/sensors
Rprint Vars event_notifications
Example output:
event_notifications:
[0]:
[interface]: xyz.openbmc_project.Sensor.Value
[path]: /xyz/openbmc_project/sensors/temperature/ambient
[event]: PropertiesChanged
[properties]:
[Value]: 23813
Description of argument(s):
dbus_path The subcribing event's path (e.g.
"/xyz/openbmc_project/sensors").
enable_trace Enable or disable trace.
"""
session = self.login()
cookies = session.cookies.get_dict()
# Convert from dictionary to a string of the following format:
# key=value;key=value...
cookies = gp.sprint_var(cookies, fmt=gp.no_header() | gp.strip_brackets(),
col1_width=0, trailing_char="",
delim="=").replace("\n", ";")
websocket.enableTrace(enable_trace)
self.__websocket = websocket.create_connection("wss://{host}/subscribe".format(host=self.__host),
sslopt={"cert_reqs": ssl.CERT_NONE},
cookie=cookies)
dbus_path = [path.strip() for path in dbus_path.split(',')]
dbus_path = {"paths": dbus_path}
self.__websocket.send(json.dumps(dbus_path))
event_notifications = json.loads(self.__websocket.recv())
self.__websocket.close()
return event_notifications