HC Test: Improve logging of Honeycomb and VPP restart
[csit.git] / resources / libraries / python / honeycomb / HoneycombSetup.py
index 52257bf..aecb022 100644 (file)
@@ -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:
@@ -25,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):
@@ -117,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:
@@ -127,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.'.
@@ -159,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".
@@ -201,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 '
@@ -239,7 +244,7 @@ class HoneycombSetup(object):
          :raises HoneycombError: If the configuration could not be changed.
          """
 
-        find = "restconf-http-binding-address"
+        find = "restconf-binding-address"
         try:
             IPv6Address(unicode(node["host"]))
             # if management IP of the node is in IPv6 format
@@ -258,6 +263,31 @@ class HoneycombSetup(object):
             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):
         """Print information about the nodes to log. The information is defined
@@ -400,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:
@@ -408,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)
+        cmd = "cp -r /mnt/common/*karaf_{name}* ~/karaf".format(name=odl_name)
 
-    @staticmethod
-    def start_odl_client(node):
-        """Start ODL client on the specified node.
-
-        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 ...")