Fix warnings reported by gen_doc.sh
[csit.git] / resources / libraries / python / honeycomb / HoneycombSetup.py
index fba2bd4..8ca3403 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 Cisco and/or its affiliates.
+# Copyright (c) 2018 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:
@@ -54,6 +54,7 @@ class HoneycombSetup(object):
         Honeycomb is up and running.
         Honeycomb must be installed in "/opt" directory, otherwise the start
         will fail.
+
         :param nodes: List of nodes to start Honeycomb on.
         :type nodes: list
         :raises HoneycombError: If Honeycomb fails to start.
@@ -61,12 +62,13 @@ class HoneycombSetup(object):
 
         HoneycombSetup.print_environment(nodes)
 
-        logger.console("\n(re)Starting Honeycomb service ...")
-
         cmd = "sudo service honeycomb start"
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
+                logger.console(
+                    "\n(re)Starting Honeycomb service on node {0}".format(
+                        node["host"]))
                 ssh = SSH()
                 ssh.connect(node)
                 (ret_code, _, _) = ssh.exec_command_sudo(cmd)
@@ -85,17 +87,20 @@ class HoneycombSetup(object):
         stops the Honeycomb and does not check its shutdown state. Use the
         keyword "Check Honeycomb Shutdown State" to check if Honeycomb has
         stopped.
+
         :param nodes: List of nodes to stop Honeycomb on.
         :type nodes: list
         :raises HoneycombError: If Honeycomb failed to stop.
         """
-        logger.console("\nShutting down Honeycomb service ...")
 
         cmd = "sudo service honeycomb stop"
         errors = []
 
         for node in nodes:
             if node['type'] == NodeType.DUT:
+                logger.console(
+                    "\nShutting down Honeycomb service on node {0}".format(
+                        node["host"]))
                 ssh = SSH()
                 ssh.connect(node)
                 (ret_code, _, _) = ssh.exec_command_sudo(cmd)
@@ -121,7 +126,8 @@ class HoneycombSetup(object):
         :raises HoneycombError: If Honeycomb fails to start.
         """
 
-        logger.console("\n(re)Starting Honeycomb service ...")
+        logger.console(
+            "\n(re)Starting Honeycomb service on node {0}".format(node["host"]))
 
         cmd = "sudo service honeycomb restart"
 
@@ -151,7 +157,8 @@ class HoneycombSetup(object):
         :type retries: int
         :type interval: int
         :raises HoneycombError: If the Honeycomb process IP cannot be found,
-        or if timeout or number of retries is exceeded."""
+            or if timeout or number of retries is exceeded.
+        """
 
         ssh = SSH()
         ssh.connect(node)
@@ -203,8 +210,8 @@ class HoneycombSetup(object):
 
         :param node: List of DUT nodes stopping Honeycomb.
         :type node: dict
-        :return: True if all GETs fail to connect.
-        :rtype bool
+        :returns: True if all GETs fail to connect.
+        :rtype: bool
         """
         cmd = "pgrep honeycomb"
 
@@ -225,10 +232,10 @@ class HoneycombSetup(object):
         """Configure Honeycomb to accept restconf requests from all IP
         addresses. IP version is determined by node data.
 
-         :param node: Information about a DUT node.
-         :type node: dict
-         :raises HoneycombError: If the configuration could not be changed.
-         """
+        :param node: Information about a DUT node.
+        :type node: dict
+        :raises HoneycombError: If the configuration could not be changed.
+        """
 
         find = "restconf-binding-address"
         try:
@@ -253,12 +260,12 @@ class HoneycombSetup(object):
     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.
-         """
+        :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)
@@ -363,14 +370,21 @@ class HoneycombSetup(object):
         :type feature: string
         :type disable: bool
         :raises HoneycombError: If the configuration could not be changed.
-         """
+        """
 
         disabled_features = {
             "NSH": ["io.fd.hc2vpp.vppnsh.impl.VppNshModule"],
             "BGP": ["io.fd.hc2vpp.bgp.inet.BgpInetModule",
                     "io.fd.honeycomb.infra.bgp.BgpModule",
                     "io.fd.honeycomb.infra.bgp.BgpReadersModule",
-                    "io.fd.honeycomb.infra.bgp.BgpWritersModule"]
+                    "io.fd.honeycomb.infra.bgp.BgpWritersModule",
+                    "io.fd.honeycomb.northbound.bgp.extension.InetModule",
+                    "io.fd.honeycomb.northbound.bgp.extension.EvpnModule",
+                    "io.fd.honeycomb.northbound.bgp.extension.L3VpnV4Module",
+                    "io.fd.honeycomb.northbound.bgp.extension.L3VpnV6Module",
+                    "io.fd.honeycomb.northbound.bgp.extension."
+                    "LabeledUnicastModule",
+                    "io.fd.honeycomb.northbound.bgp.extension.LinkstateModule"]
         }
 
         ssh = SSH()
@@ -466,6 +480,7 @@ class HoneycombSetup(object):
 
         Karaf should be located in the provided path, and VPP and Honeycomb
         should already be running, otherwise the start will fail.
+
         :param node: Node to start ODL client on.
         :param path: Path to ODL client on node.
         :type node: dict
@@ -488,13 +503,15 @@ class HoneycombSetup(object):
                         "in progress ...".format(node['host']))
 
     @staticmethod
-    def install_odl_features(node, path, *features):
+    def install_odl_features(node, odl_name, path, *features):
         """Install required features on a running ODL client.
 
         :param node: Honeycomb node.
+        :param odl_name: Name of ODL client version to use.
         :param path: Path to ODL client on node.
         :param features: Optional, list of additional features to install.
         :type node: dict
+        :type odl_name: str
         :type path: str
         :type features: list
         """
@@ -502,10 +519,14 @@ class HoneycombSetup(object):
         ssh = SSH()
         ssh.connect(node)
 
-        cmd = "{path}/*karaf*/bin/client -u karaf feature:install " \
+        auth = "-u karaf"
+        if odl_name.lower() == "oxygen":
+            auth = "-u karaf -p karaf"
+
+        cmd = "{path}/*karaf*/bin/client {auth} feature:install " \
               "odl-restconf-all " \
               "odl-netconf-connector-all " \
-              "odl-netconf-topology".format(path=path)
+              "odl-netconf-topology".format(path=path, auth=auth)
         for feature in features:
             cmd += " {0}".format(feature)
 
@@ -643,6 +664,26 @@ class HoneycombSetup(object):
 
         logger.info("ODL client service stopped.")
 
+    @staticmethod
+    def set_static_arp(node, ip_address, mac_address):
+        """Configure a static ARP entry using arp.
+
+        :param node: Node in topology.
+        :param ip_address: IP address for the entry.
+        :param mac_address: MAC adddress for the entry.
+        :type node: dict
+        :type ip_address: str
+        :type mac_address: str
+        :raises RuntimeError: If the operation fails.
+        """
+
+        ssh = SSH()
+        ssh.connect(node)
+        ret_code, _, _ = ssh.exec_command_sudo("arp -s {0} {1}".format(
+            ip_address, mac_address))
+
+        if ret_code != 0:
+            raise RuntimeError("Failed to configure static ARP adddress.")
 
 
 class HoneycombStartupConfig(object):
@@ -679,11 +720,11 @@ class HoneycombStartupConfig(object):
 
     def apply_config(self, node):
         """Generate configuration file /opt/honeycomb/honeycomb on the specified
-         node.
+        node.
 
-         :param node: Honeycomb node.
-         :type node: dict
-         """
+        :param node: Honeycomb node.
+        :type node: dict
+        """
 
         self.ssh.connect(node)
         _, filename, _ = self.ssh.exec_command("ls /opt/honeycomb | grep .jar")
@@ -748,7 +789,7 @@ class HoneycombStartupConfig(object):
 
         :param mem_min: Minimum amount of memory (MB).
         :param mem_max: Maximum amount of memory (MB). Default is 4 times
-        minimum value.
+            minimum value.
         :type mem_min: int
         :type mem_max: int
         """
@@ -761,7 +802,7 @@ class HoneycombStartupConfig(object):
 
         :param mem_min: Minimum metaspace size (MB).
         :param mem_max: Maximum metaspace size (MB). Defailt is 4 times
-        minimum value.
+            minimum value.
         :type mem_min: int
         :type mem_max: int
         """