aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorselias <samelias@cisco.com>2017-03-14 12:00:01 +0100
committerTibor Frank <tifrank@cisco.com>2017-03-30 09:48:34 +0000
commitbd680a762d945b7970f7e62b7ee47776f0301f8c (patch)
treeba94d97f67c1075fa5968617633a1afb39a7cac3
parentd30aa3a0c0e64682266b0fbf5c8506952e39e414 (diff)
HC Test: support testing using ipv6 management interface and https
Change-Id: Ia38388a87171ad3bec7307f9ca74eaa99adc2624 Signed-off-by: selias <samelias@cisco.com>
-rw-r--r--resources/libraries/python/HTTPRequest.py20
-rw-r--r--resources/libraries/python/honeycomb/HoneycombSetup.py34
-rw-r--r--tests/func/honeycomb/__init__.robot2
-rw-r--r--tests/func/honeycomb/mgmt-cfg-pluginacl-apihc-apivat-func.robot2
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