X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2Fhoneycomb%2FHoneycombSetup.py;h=aecb02231488faf446d9362463b52df41bd51042;hp=117b3e57c43c8d43aaa3ddea512a7817e3492862;hb=f2dcf8ccc9789cf22c03bffe15f19fcf71290fdb;hpb=4f4eaa1d52f3bdbe3caecdc1d6a024c369a2834a diff --git a/resources/libraries/python/honeycomb/HoneycombSetup.py b/resources/libraries/python/honeycomb/HoneycombSetup.py index 117b3e57c4..aecb022314 100644 --- a/resources/libraries/python/honeycomb/HoneycombSetup.py +++ b/resources/libraries/python/honeycomb/HoneycombSetup.py @@ -1,4 +1,4 @@ -# 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: @@ -13,6 +13,8 @@ """Implementation of keywords for Honeycomb setup.""" +from ipaddress import IPv6Address, AddressValueError + from robot.api import logger from resources.libraries.python.HTTPRequest import HTTPRequest, HTTPCodes, \ @@ -23,6 +25,7 @@ from resources.libraries.python.honeycomb.HoneycombUtil \ 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): @@ -115,7 +118,7 @@ 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: @@ -125,9 +128,14 @@ class HoneycombSetup(object): (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.'. @@ -157,7 +165,7 @@ class HoneycombSetup(object): 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". @@ -199,7 +207,6 @@ class HoneycombSetup(object): 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 ' @@ -228,31 +235,58 @@ class HoneycombSetup(object): 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): @@ -396,7 +430,7 @@ class HoneycombSetup(object): 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: @@ -404,33 +438,29 @@ class HoneycombSetup(object): "node {0}, {1}".format(node, stderr)) @staticmethod - def find_odl_client(node): - """Check if there is a karaf directory in home. + def setup_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 ...")