HC Test: support testing using ipv6 management interface and https 69/5769/5
authorselias <samelias@cisco.com>
Tue, 14 Mar 2017 11:00:01 +0000 (12:00 +0100)
committerTibor Frank <tifrank@cisco.com>
Thu, 30 Mar 2017 09:48:34 +0000 (09:48 +0000)
Change-Id: Ia38388a87171ad3bec7307f9ca74eaa99adc2624
Signed-off-by: selias <samelias@cisco.com>
resources/libraries/python/HTTPRequest.py
resources/libraries/python/honeycomb/HoneycombSetup.py
tests/func/honeycomb/__init__.robot
tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot

index adf3d16..5f87484 100644 (file)
@@ -18,6 +18,7 @@ The HTTP requests are implemented in the class HTTPRequest which uses
 requests.request.
 """
 
 requests.request.
 """
 
+from ipaddress import IPv6Address, AddressValueError
 from enum import IntEnum, unique
 
 from robot.api.deco import keyword
 from enum import IntEnum, unique
 
 from robot.api.deco import keyword
@@ -26,6 +27,8 @@ from robot.libraries.BuiltIn import BuiltIn
 
 from requests import request, RequestException, Timeout, TooManyRedirects, \
     HTTPError, ConnectionError
 
 from requests import request, RequestException, Timeout, TooManyRedirects, \
     HTTPError, ConnectionError
+from requests.packages.urllib3 import disable_warnings
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
 from requests.auth import HTTPBasicAuth
 
 
 from requests.auth import HTTPBasicAuth
 
 
@@ -75,6 +78,9 @@ class HTTPRequestError(Exception):
             logger.error(self._msg)
             logger.debug(self._details)
 
             logger.error(self._msg)
             logger.debug(self._details)
 
+        # suppress warnings about disabled SSL verification
+        disable_warnings(InsecureRequestWarning)
+
     def __repr__(self):
         return repr(self._msg)
 
     def __repr__(self):
         return repr(self._msg)
 
@@ -115,8 +121,16 @@ class HTTPRequest(object):
         :return: Full url.
         :rtype: str
         """
         :return: Full url.
         :rtype: str
         """
-        return "http://{ip}:{port}{path}".format(ip=ip_addr, port=port,
-                                                 path=path)
+
+        try:
+            IPv6Address(unicode(ip_addr))
+            # IPv6 address must be in brackets
+            ip_addr = "[{0}]".format(ip_addr)
+        except (AttributeError, AddressValueError):
+            pass
+
+        return "https://{ip}:{port}{path}".format(ip=ip_addr, port=port,
+                                                  path=path)
 
     @staticmethod
     def _http_request(method, node, path, enable_logging=True, **kwargs):
 
     @staticmethod
     def _http_request(method, node, path, enable_logging=True, **kwargs):
@@ -190,7 +204,7 @@ class HTTPRequest(object):
         try:
             auth = HTTPBasicAuth(node['honeycomb']['user'],
                                  node['honeycomb']['passwd'])
         try:
             auth = HTTPBasicAuth(node['honeycomb']['user'],
                                  node['honeycomb']['passwd'])
-            rsp = request(method, url, auth=auth, **kwargs)
+            rsp = request(method, url, auth=auth, verify=False, **kwargs)
 
             logger.debug("Status code: {0}".format(rsp.status_code))
             logger.debug("Response: {0}".format(rsp.content))
 
             logger.debug("Status code: {0}".format(rsp.status_code))
             logger.debug("Response: {0}".format(rsp.content))
index 117b3e5..858aa21 100644 (file)
@@ -13,6 +13,8 @@
 
 """Implementation of keywords for Honeycomb setup."""
 
 
 """Implementation of keywords for Honeycomb setup."""
 
+from ipaddress import IPv6Address, AddressValueError
+
 from robot.api import logger
 
 from resources.libraries.python.HTTPRequest import HTTPRequest, HTTPCodes, \
 from robot.api import logger
 
 from resources.libraries.python.HTTPRequest import HTTPRequest, HTTPCodes, \
@@ -228,31 +230,33 @@ class HoneycombSetup(object):
         return True
 
     @staticmethod
         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.
          """
          :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\\",'
+        find = "restconf-https-binding-address"
+        try:
+            IPv6Address(unicode(node["host"]))
+            # if management IP of the node is in IPv6 format
+            replace = '\\"restconf-https-binding-address\\": \\"0::0\\",'
+        except (AttributeError, AddressValueError):
+            replace = '\\"restconf-https-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()
 
         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 print_environment(nodes):
 
     @staticmethod
     def print_environment(nodes):
index 9057cef..086660b 100644 (file)
@@ -29,7 +29,7 @@
 | Configure Honeycomb for testing
 | | [Arguments] | ${node}
 | | Copy Java Libraries | ${node}
 | Configure Honeycomb for testing
 | | [Arguments] | ${node}
 | | Copy Java Libraries | ${node}
-| | Configure Unsecured Access | ${node}
+| | Configure Restconf binding address | ${node}
 | | Enable Module Features | ${node}
 | | Configure Log Level | ${node} | TRACE
 | | Configure Persistence | ${node} | disable
 | | Enable Module Features | ${node}
 | | Configure Log Level | ${node} | TRACE
 | | Configure Persistence | ${node} | disable
index 6a53cfd..ba63cf6 100644 (file)
 # routed interfaces not yet supported by ACL plugin (no Jira id available)
 # Bug VPP-633, VPP crashes when any packet hits a reflexive rule
 | | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
 # routed interfaces not yet supported by ACL plugin (no Jira id available)
 # Bug VPP-633, VPP crashes when any packet hits a reflexive rule
 | | Given Setup Interface IPs And Routes For IPv4 plugin-acl Test
-| | ... | icmp | ${acl_name_reflex}
+| | ... | reflex | ${acl_name_reflex}
 | | And Add ARP on DUT
 | | ... | ${node} | ${dut_to_tg_if1} | ${gateway2} | ${tg_to_dut_if1_mac}
 | | And VPP Route Add
 | | And Add ARP on DUT
 | | ... | ${node} | ${dut_to_tg_if1} | ${gateway2} | ${tg_to_dut_if1_mac}
 | | And VPP Route Add