+
+ @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.
+
+ :param nodes: All nodes in test topology.
+ :type nodes: 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\\",'
+
+ 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))
+
+ @staticmethod
+ def print_environment(nodes):
+ """Print information about the nodes to log. The information is defined
+ by commands in cmds tuple at the beginning of this method.
+
+ :param nodes: List of DUT nodes to get information about.
+ :type nodes: list
+ """
+
+ # TODO: When everything is set and running in VIRL env, transform this
+ # method to a keyword checking the environment.
+
+ cmds = ("uname -a",
+ "df -lh",
+ "echo $JAVA_HOME",
+ "echo $PATH",
+ "which java",
+ "java -version",
+ "dpkg --list | grep openjdk",
+ "ls -la /opt/honeycomb")
+
+ for node in nodes:
+ if node['type'] == NodeType.DUT:
+ logger.info("Checking node {} ...".format(node['host']))
+ for cmd in cmds:
+ logger.info("Command: {}".format(cmd))
+ ssh = SSH()
+ ssh.connect(node)
+ ssh.exec_command_sudo(cmd)
+
+ @staticmethod
+ def print_ports(node):
+ """Uses "sudo netstat -anp | grep java" to print port where a java
+ application listens.
+
+ :param node: Honeycomb node where we want to print the ports.
+ :type node: dict
+ """
+
+ cmds = ("netstat -anp | grep java",
+ "ps -ef | grep [h]oneycomb")
+
+ logger.info("Checking node {} ...".format(node['host']))
+ for cmd in cmds:
+ logger.info("Command: {}".format(cmd))
+ ssh = SSH()
+ ssh.connect(node)
+ ssh.exec_command_sudo(cmd)
+
+ @staticmethod
+ def configure_log_level(node, level):
+ """Set Honeycomb logging to the specified level.
+
+ :param node: Honeycomb node.
+ :param level: Log level (INFO, DEBUG, TRACE).
+ :type node: dict
+ :type level: str
+ """
+
+ find = 'logger name=\\"io.fd\\"'
+ replace = '<logger name=\\"io.fd\\" level=\\"{0}\\"/>'.format(level)
+
+ argument = '"/{0}/c\\ {1}"'.format(find, replace)
+ path = "{0}/config/logback.xml".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 enable_module_features(node):
+ """Configure Honeycomb to use VPP modules that are disabled by default.
+
+ Note: If the module is not enabled in VPP, Honeycomb will
+ be unable to establish VPP connection.
+
+ :param node: Honeycomb node.
+ :type node: dict
+ :raises HoneycombError: If the configuration could not be changed.
+ """
+
+ disabled_features = {
+ "NSH": "io.fd.hc2vpp.vppnsh.impl.VppNshModule"
+ }
+
+ ssh = SSH()
+ ssh.connect(node)
+
+ for feature in disabled_features.keys():
+ # uncomment by replacing the entire line
+ find = replace = "{0}".format(disabled_features[feature])
+
+ argument = '"/{0}/c\\ {1}"'.format(find, replace)
+ path = "{0}/modules/*module-config"\
+ .format(Const.REMOTE_HC_DIR)
+ command = "sed -i {0} {1}".format(argument, path)
+
+ (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))