X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2Fhoneycomb%2FNotifications.py;h=512a6cbb08b0463cf7666b7e180da32d8cc15c5a;hp=62cda16cf2021b8d409a559f6cd86135774190e7;hb=c10eda554529ac5433216a18d30e9964c6af7976;hpb=28e17b8002b50a04cdd6c9e74c15cdc4aa33a5e2 diff --git a/resources/libraries/python/honeycomb/Notifications.py b/resources/libraries/python/honeycomb/Notifications.py index 62cda16cf2..512a6cbb08 100644 --- a/resources/libraries/python/honeycomb/Notifications.py +++ b/resources/libraries/python/honeycomb/Notifications.py @@ -13,131 +13,35 @@ """Implementation of keywords for managing Honeycomb notifications.""" -from time import time - -import paramiko from robot.api import logger -from interruptingcow import timeout from resources.libraries.python.honeycomb.HoneycombUtil import HoneycombError +from resources.libraries.python.honeycomb.Netconf import Netconf -class Notifications(object): - """Implements keywords for managing Honeycomb notifications. +class Notifications(Netconf): + """Implements keywords for receiving Honeycomb notifications. The keywords implemented in this class make it possible to: - - establish SSH session to Honeycomb host - receive notifications from Honeycomb - read received notifications """ - def __init__(self, hello, subscription): - """Initializer. - :param hello: Hello message to be sent to Honeycomb. - :param subscription: rpc command to subscribe to Honeycomb notifications - over Netconf. - :type hello: str - :type subscription: str - - Note: Passing the channel object as a robotframework argument closes - the channel. Class variables are used instead, - to persist the connection channel throughout the test case. - """ - - self.client = None - self.channel = None - self.hello = hello - self.subscription = subscription - - def create_session(self, node, time_out=10): - """Create an SSH session and connect to Honeycomb on the specified node. - - :param node: Honeycomb node. - :param time_out: Timeout value for the connection in seconds. - :type node: dict - :type time_out: int - """ - - start = time() - client = paramiko.SSHClient() - client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - - client.connect(node['host'], - username=node['honeycomb']['user'], - password=node['honeycomb']['passwd'], - pkey=None, - port=node['honeycomb']['netconf_port'], - timeout=time_out, - ) - - logger.trace('Connect took {0} seconds'.format(time() - start)) - logger.debug('New ssh: {0}'.format(client)) - logger.debug('Connect peer: {0}'. - format(client.get_transport().getpeername())) - logger.debug(client) - - channel = client.get_transport().open_session() - channel.settimeout(time_out) - channel.get_pty() - channel.invoke_subsystem("netconf") - logger.debug(channel) - - self.client = client - self.channel = channel - - # read OpenDaylight's hello message and capability list - self._get_response( - size=131072, - time_out=time_out, - err="Timeout on getting hello message." - ) - - self.channel.send(self.hello) - if not self.channel.active: - raise HoneycombError("Channel closed on capabilities exchange.") - - def _get_response(self, size=4096, time_out=10, err="Unspecified Error."): - """Iteratively read data from the receive buffer and catenate together - until message ends with the message delimiter, or - until timeout is reached. - - :param size: Maximum number of bytes to read in one iteration. - :param time_out: Timeout value for getting the complete response. - :param err: Error message to provide when timeout is reached. - :type size:int - :type time_out:int - :type err:str - :return: Content of response. - :rtype: str - :raises HoneycombError: If the read process times out. - """ - - reply = '' - - try: - with timeout(time_out, exception=RuntimeError): - while not reply.endswith(']]>]]>'): - if self.channel.recv_ready(): - reply += self.channel.recv(size) - - except RuntimeError: - raise HoneycombError(err+" Content of buffer: {0}".format(reply)) - - logger.trace(reply) - return reply - - def add_notification_listener(self, time_out=10): + def add_notification_listener(self, subscription, time_out=10): """Open a new channel on the SSH session, connect to Netconf subsystem and subscribe to receive Honeycomb notifications. + :param subscription: RPC for subscription to notifications. :param time_out: Timeout value for each read operation in seconds. + :type subscription: str :type time_out: int :raises HoneycombError: If subscription to notifications fails. """ - self.channel.send(self.subscription) + logger.debug(subscription) + self.send(subscription) - reply = self._get_response( + reply = self.get_response( time_out=time_out, err="Timeout on notifications subscription." ) @@ -157,9 +61,10 @@ class Notifications(object): :rtype: str """ - logger.debug("Getting notification.") + logger.debug("Getting notification. Timeout set to {0} seconds." + .format(time_out)) - reply = self._get_response( + reply = self.get_response( time_out=time_out, err="Timeout on getting notification." )