-# Copyright (c) 2016 Cisco and/or its affiliates.
+# Copyright (c) 2017 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:
"""Implementation of keywords for Honeycomb setup."""
+from ipaddress import IPv6Address, AddressValueError
+
from robot.api import logger
from resources.libraries.python.HTTPRequest import HTTPRequest, HTTPCodes, \
import HoneycombUtil as HcUtil
from resources.libraries.python.ssh import SSH
from resources.libraries.python.topology import NodeType
+from resources.libraries.python.DUTSetup import DUTSetup
class HoneycombSetup(object):
"""
logger.console("\nRestarting Honeycomb service ...")
- cmd = "sudo service honeycomb restart && sudo service vpp restart"
+ cmd = "sudo service honeycomb restart "
errors = []
for node in nodes:
(ret_code, _, _) = ssh.exec_command_sudo(cmd)
if int(ret_code) != 0:
errors.append(node['host'])
- else:
- logger.info("Restart of Honeycomb and VPP on node {0} is "
- "in progress ...".format(node['host']))
+ try:
+ DUTSetup.setup_dut(node)
+ except Exception as err:
+ logger.debug(err)
+ errors.append(node['host'])
+ continue
+ logger.info("Restart of Honeycomb and VPP on node {0} is "
+ "in progress ...".format(node['host']))
if errors:
raise HoneycombError('Node(s) {0} failed to restart Honeycomb'
' and/or VPP.'.
for node in nodes:
if node['type'] == NodeType.DUT:
HoneycombSetup.print_ports(node)
- status_code, _ = HTTPRequest.get(node, path, timeout=10,
+ status_code, _ = HTTPRequest.get(node, path,
enable_logging=False)
if status_code == HTTPCodes.OK:
logger.info("Honeycomb on node {0} is up and running".
if node['type'] == NodeType.DUT:
try:
status_code, _ = HTTPRequest.get(node, '/index.html',
- timeout=5,
enable_logging=False)
if status_code == HTTPCodes.OK:
raise HoneycombError('Honeycomb on node {0} is still '
return True
@staticmethod
- def configure_unsecured_access(*nodes):
- """Configure Honeycomb to allow restconf requests through insecure HTTP
- used by tests. By default this is only allowed for localhost.
+ def configure_restconf_binding_address(node):
+ """Configure Honeycomb to accept restconf requests from all IP
+ addresses. IP version is determined by node data.
- :param nodes: All nodes in test topology.
- :type nodes: dict
+ :param node: Information about a DUT node.
+ :type node: dict
:raises HoneycombError: If the configuration could not be changed.
"""
- # TODO: Modify tests to use HTTPS instead.
find = "restconf-binding-address"
- replace = '\\"restconf-binding-address\\": \\"0.0.0.0\\",'
+ try:
+ IPv6Address(unicode(node["host"]))
+ # if management IP of the node is in IPv6 format
+ replace = '\\"restconf-binding-address\\": \\"0::0\\",'
+ except (AttributeError, AddressValueError):
+ replace = '\\"restconf-binding-address\\": \\"0.0.0.0\\",'
argument = '"/{0}/c\\ {1}"'.format(find, replace)
path = "{0}/config/honeycomb.json".format(Const.REMOTE_HC_DIR)
command = "sed -i {0} {1}".format(argument, path)
ssh = SSH()
- for node in nodes:
- if node['type'] == NodeType.DUT:
- ssh.connect(node)
- (ret_code, _, stderr) = ssh.exec_command_sudo(command)
- if ret_code != 0:
- raise HoneycombError("Failed to modify configuration on "
- "node {0}, {1}".format(node, stderr))
+ ssh.connect(node)
+ (ret_code, _, stderr) = ssh.exec_command_sudo(command)
+ if ret_code != 0:
+ raise HoneycombError("Failed to modify configuration on "
+ "node {0}, {1}".format(node, stderr))
+
+ @staticmethod
+ def configure_jvpp_timeout(node, timeout=10):
+ """Configure timeout value for Java API commands Honeycomb sends to VPP.
+
+ :param node: Information about a DUT node.
+ :param timeout: Timeout value in seconds.
+ :type node: dict
+ :type timeout: int
+ :raises HoneycombError: If the configuration could not be changed.
+ """
+
+ find = "jvpp-request-timeout"
+ replace = '\\"jvpp-request-timeout\\": {0}'.format(timeout)
+
+ argument = '"/{0}/c\\ {1}"'.format(find, replace)
+ path = "{0}/config/jvpp.json".format(Const.REMOTE_HC_DIR)
+ command = "sed -i {0} {1}".format(argument, path)
+
+ ssh = SSH()
+ ssh.connect(node)
+ (ret_code, _, stderr) = ssh.exec_command_sudo(command)
+ if ret_code != 0:
+ raise HoneycombError("Failed to modify configuration on "
+ "node {0}, {1}".format(node, stderr))
@staticmethod
def print_environment(nodes):
Const.REMOTE_HC_DIR, artifact_id, version)
cmd = "sudo mkdir -p {0}; " \
"sudo cp /usr/share/java/{1} {0}/{2}-{3}.jar".format(
- directory, item, artifact_id, version)
+ directory, item, artifact_id, version)
(ret_code, _, stderr) = ssh.exec_command(cmd)
if ret_code != 0:
"node {0}, {1}".format(node, stderr))
@staticmethod
- def find_odl_client(node):
- """Check if there is a karaf directory in home.
+ def configure_odl_client(node, odl_name):
+ """Start ODL client on the specified node.
- :param node: Honeycomb node.
+ Karaf should be located in /mnt/common, and VPP and Honeycomb should
+ already be running, otherwise the start will fail.
+ :param node: Node to start ODL client on.
+ :param odl_name: Name of ODL client version to use.
:type node: dict
- :returns: True if ODL client is present on node, else False.
- :rtype: bool
+ :type odl_name: str
+ :raises HoneycombError: If Honeycomb fails to start.
"""
+ logger.debug("Copying ODL Client to home dir.")
+
ssh = SSH()
ssh.connect(node)
- (ret_code, stdout, _) = ssh.exec_command_sudo(
- "ls ~ | grep karaf")
- logger.debug(stdout)
- return not bool(ret_code)
-
- @staticmethod
- def start_odl_client(node):
- """Start ODL client on the specified node.
+ cmd = "cp -r /mnt/common/*karaf_{name}* ~/karaf".format(name=odl_name)
- karaf should be located in home directory, and VPP and Honeycomb should
- already be running, otherwise the start will fail.
- :param node: Nodes to start ODL client on.
- :type node: dict
- :raises HoneycombError: If Honeycomb fails to start.
- """
+ (ret_code, _, _) = ssh.exec_command_sudo(cmd)
+ if int(ret_code) != 0:
+ raise HoneycombError(
+ "Failed to copy ODL client on node {0}".format(node["host"]))
logger.console("\nStarting ODL client ...")