CSIT-425: HC Test: NSH-SFC test suite
[csit.git] / resources / libraries / python / honeycomb / HoneycombSetup.py
index e9c1295..99f334e 100644 (file)
@@ -53,9 +53,12 @@ class HoneycombSetup(object):
         :type nodes: list
         :raises HoneycombError: If Honeycomb fails to start.
         """
         :type nodes: list
         :raises HoneycombError: If Honeycomb fails to start.
         """
-        logger.console("Starting Honeycomb service ...")
 
 
-        cmd = "{0}/start".format(Const.REMOTE_HC_DIR)
+        HoneycombSetup.print_environment(nodes)
+
+        logger.console("\nStarting Honeycomb service ...")
+
+        cmd = "sudo service honeycomb start"
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
@@ -81,9 +84,9 @@ class HoneycombSetup(object):
         :type nodes: list
         :raises HoneycombError: If Honeycomb failed to stop.
         """
         :type nodes: list
         :raises HoneycombError: If Honeycomb failed to stop.
         """
-        logger.console("Shutting down Honeycomb service ...")
+        logger.console("\nShutting down Honeycomb service ...")
 
 
-        cmd = "{0}/stop".format(Const.REMOTE_HC_DIR)
+        cmd = "sudo service honeycomb stop"
         errors = []
 
         for node in nodes:
         errors = []
 
         for node in nodes:
@@ -123,6 +126,7 @@ class HoneycombSetup(object):
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
+                HoneycombSetup.print_ports(node)
                 status_code, _ = HTTPRequest.get(node, path, timeout=10,
                                                  enable_logging=False)
                 if status_code == HTTPCodes.OK:
                 status_code, _ = HTTPRequest.get(node, path, timeout=10,
                                                  enable_logging=False)
                 if status_code == HTTPCodes.OK:
@@ -139,6 +143,13 @@ class HoneycombSetup(object):
                 else:
                     raise HoneycombError('Unexpected return code: {0}.'.
                                          format(status_code))
                 else:
                     raise HoneycombError('Unexpected return code: {0}.'.
                                          format(status_code))
+
+                status_code, _ = HcUtil.get_honeycomb_data(
+                    node, "config_vpp_interfaces")
+                if status_code != HTTPCodes.OK:
+                    raise HoneycombError('Honeycomb on node {0} running but '
+                                         'not yet ready.'.format(node['host']),
+                                         enable_logging=False)
         return True
 
     @staticmethod
         return True
 
     @staticmethod
@@ -153,7 +164,7 @@ class HoneycombSetup(object):
         :return: True if all GETs fail to connect.
         :rtype bool
         """
         :return: True if all GETs fail to connect.
         :rtype bool
         """
-        cmd = "ps -ef | grep -v grep | grep karaf"
+        cmd = "ps -ef | grep -v grep | grep honeycomb"
         for node in nodes:
             if node['type'] == NodeType.DUT:
                 try:
         for node in nodes:
             if node['type'] == NodeType.DUT:
                 try:
@@ -185,3 +196,136 @@ class HoneycombSetup(object):
                         logger.info("Honeycomb on node {0} has stopped".
                                     format(node['host']))
         return True
                         logger.info("Honeycomb on node {0} has stopped".
                                     format(node['host']))
         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.
+
+         :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.honeycomb.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/io-fd-honeycomb-vpp-integration*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))