-# Copyright (c) 2016 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
"""Keywords used to connect to Honeycomb through Netconf, send messages
and receive replies."""
+import socket
from time import time
import paramiko
-import socket
from robot.api import logger
-from interruptingcow import timeout
from resources.libraries.python.honeycomb.HoneycombUtil import HoneycombError
password=node['honeycomb']['passwd'],
pkey=None,
port=node['honeycomb']['netconf_port'],
- timeout=time_out,
- )
+ timeout=time_out)
logger.trace('Connect took {0} seconds'.format(time() - start))
logger.debug('New ssh: {0}'.format(client))
# read OpenDaylight's hello message and capability list
self.get_response(
size=131072,
- time_out=time_out,
err="Timeout on getting hello message."
)
if not self.channel.active:
raise HoneycombError("Channel closed on capabilities exchange.")
- def get_response(self, size=4096, time_out=10, err="Unspecified Error."):
+ def get_response(self, size=4096, 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.
+ :type size: int
+ :type err: str
+ :returns: 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(self.delimiter) or \
- self.channel.recv_ready():
- try:
- chunk = self.channel.recv(size)
- if not chunk:
- break
- reply += chunk
- if self.channel.exit_status_ready():
- logger.debug('Channel exit status ready.')
- break
- except socket.timeout:
- raise HoneycombError("Socket timeout.",
- enable_logging=False
- )
+ while not reply.endswith(self.delimiter) or \
+ self.channel.recv_ready():
+ try:
+ chunk = self.channel.recv(size)
+ if not chunk:
+ break
+ reply += chunk
+ if self.channel.exit_status_ready():
+ logger.debug('Channel exit status ready.')
+ break
+ except socket.timeout:
+ raise HoneycombError("Socket timeout.",
+ enable_logging=False)
except RuntimeError:
raise HoneycombError(err + " Content of buffer: {0}".format(reply),
- enable_logging=False
- )
+ enable_logging=False)
logger.trace(reply)
return reply.replace(self.delimiter, "")
- def get_all_responses(self, size=4096, time_out=3):
+ def get_all_responses(self, size=4096):
"""Read responses from the receive buffer and catenate together
- until a read operation times out.
+ until a read operation times out.
:param size: Maximum number of bytes to read in one iteration.
- :param time_out: Timeout value for getting the complete response.
- :type size:int
- :type time_out:int
- :return: Content of response.
+ :type size: int
+ :returns: Content of response.
:rtype: str
"""
while True:
try:
- response += self.get_response(size, time_out, err)
+ response += self.get_response(size, err)
except HoneycombError:
break
return response
- def send(self, message):
+ def send(self, message, **params):
"""Sends provided message through the channel.
:param message: Message to be sent to Honeycomb.
+ :param params: Format the message string with these parameters.
:type message: str
+ :type params: dict
"""
+ message = message.format(**params)
+
if not message.endswith(self.delimiter):
message += self.delimiter
+ logger.debug(message)
+
self.channel.send(message)