From bd680a762d945b7970f7e62b7ee47776f0301f8c Mon Sep 17 00:00:00 2001 From: selias Date: Tue, 14 Mar 2017 12:00:01 +0100 Subject: [PATCH] HC Test: support testing using ipv6 management interface and https Change-Id: Ia38388a87171ad3bec7307f9ca74eaa99adc2624 Signed-off-by: selias --- resources/libraries/python/HTTPRequest.py | 20 +++++++++++-- .../libraries/python/honeycomb/HoneycombSetup.py | 34 ++++++++++++---------- tests/func/honeycomb/__init__.robot | 2 +- .../mgmt-cfg-pluginacl-apihc-apivat-func.robot | 2 +- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/resources/libraries/python/HTTPRequest.py b/resources/libraries/python/HTTPRequest.py index adf3d168eb..5f87484fa2 100644 --- a/resources/libraries/python/HTTPRequest.py +++ b/resources/libraries/python/HTTPRequest.py @@ -18,6 +18,7 @@ The HTTP requests are implemented in the class HTTPRequest which uses requests.request. """ +from ipaddress import IPv6Address, AddressValueError 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.packages.urllib3 import disable_warnings +from requests.packages.urllib3.exceptions import InsecureRequestWarning from requests.auth import HTTPBasicAuth @@ -75,6 +78,9 @@ class HTTPRequestError(Exception): logger.error(self._msg) logger.debug(self._details) + # suppress warnings about disabled SSL verification + disable_warnings(InsecureRequestWarning) + def __repr__(self): return repr(self._msg) @@ -115,8 +121,16 @@ class HTTPRequest(object): :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): @@ -190,7 +204,7 @@ class HTTPRequest(object): 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)) diff --git a/resources/libraries/python/honeycomb/HoneycombSetup.py b/resources/libraries/python/honeycomb/HoneycombSetup.py index 117b3e57c4..858aa21344 100644 --- a/resources/libraries/python/honeycomb/HoneycombSetup.py +++ b/resources/libraries/python/honeycomb/HoneycombSetup.py @@ -13,6 +13,8 @@ """Implementation of keywords for Honeycomb setup.""" +from ipaddress import IPv6Address, AddressValueError + from robot.api import logger from resources.libraries.python.HTTPRequest import HTTPRequest, HTTPCodes, \ @@ -228,31 +230,33 @@ class HoneycombSetup(object): 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. """ - # 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() - 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): diff --git a/tests/func/honeycomb/__init__.robot b/tests/func/honeycomb/__init__.robot index 9057cef9f8..086660bfc3 100644 --- a/tests/func/honeycomb/__init__.robot +++ b/tests/func/honeycomb/__init__.robot @@ -29,7 +29,7 @@ | 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 diff --git a/tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot b/tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot index 6a53cfd224..ba63cf6dd4 100644 --- a/tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot +++ b/tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot @@ -638,7 +638,7 @@ # 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 -- 2.16.6