X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FHTTPRequest.py;h=869078bca307e56ca5df7e5c694ce7de9c9a95ad;hp=fd2925cec4b4c1223e969ef8478477d98f802987;hb=df228e1794d4a5a1c3028e1e214731b5f0450b99;hpb=3121b691debad27fcea1c6e2031e4a2544e42fbf diff --git a/resources/libraries/python/HTTPRequest.py b/resources/libraries/python/HTTPRequest.py index fd2925cec4..869078bca3 100644 --- a/resources/libraries/python/HTTPRequest.py +++ b/resources/libraries/python/HTTPRequest.py @@ -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: @@ -18,10 +18,12 @@ 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 from robot.api import logger +from robot.libraries.BuiltIn import BuiltIn from requests import request, RequestException, Timeout, TooManyRedirects, \ HTTPError, ConnectionError @@ -32,9 +34,12 @@ from requests.auth import HTTPBasicAuth class HTTPCodes(IntEnum): """HTTP status codes""" OK = 200 + ACCEPTED = 201 UNAUTHORIZED = 401 FORBIDDEN = 403 NOT_FOUND = 404 + CONFLICT = 409 + INTERNAL_SERVER_ERROR = 500 SERVICE_UNAVAILABLE = 503 @@ -108,9 +113,17 @@ class HTTPRequest(object): :type ip_addr: str :type port: str or int :type path: str - :return: full url + :return: Full url. :rtype: str """ + + try: + IPv6Address(unicode(ip_addr)) + # IPv6 address must be in brackets + ip_addr = "[{0}]".format(ip_addr) + except (AttributeError, AddressValueError): + pass + return "http://{ip}:{port}{path}".format(ip=ip_addr, port=port, path=path) @@ -155,7 +168,7 @@ class HTTPRequest(object): :type path: str :type enable_logging: bool :type kwargs: dict - :return: Status code and content of response + :return: Status code and content of response. :rtype: tuple :raises HTTPRequestError: If 1. it is not possible to connect, @@ -165,13 +178,31 @@ class HTTPRequest(object): 5. there is any other unexpected HTTP request exception. """ timeout = kwargs["timeout"] + + use_odl = BuiltIn().get_variable_value("${use_odl_client}") + + if use_odl: + port = 8181 + # Using default ODL Restconf port + # TODO: add node["honeycomb"]["odl_port"] to topology, use it here + odl_url_part = "/network-topology:network-topology/topology/" \ + "topology-netconf/node/vpp/yang-ext:mount" + else: + port = node["honeycomb"]["port"] + odl_url_part = "" + + try: + path = path.format(odl_url_part=odl_url_part) + except KeyError: + pass + url = HTTPRequest.create_full_url(node['host'], - node['honeycomb']['port'], + port, path) 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)) @@ -200,7 +231,7 @@ class HTTPRequest(object): @staticmethod @keyword(name="HTTP Get") - def get(node, path, headers=None, timeout=10, enable_logging=True): + def get(node, path, headers=None, timeout=15, enable_logging=True): """Sends a GET request and returns the response and status code. :param node: Honeycomb node. @@ -226,7 +257,7 @@ class HTTPRequest(object): @staticmethod @keyword(name="HTTP Put") - def put(node, path, headers=None, payload=None, json=None, timeout=10): + def put(node, path, headers=None, payload=None, json=None, timeout=15): """Sends a PUT request and returns the response and status code. :param node: Honeycomb node. @@ -252,7 +283,8 @@ class HTTPRequest(object): @staticmethod @keyword(name="HTTP Post") - def post(node, path, headers=None, payload=None, json=None, timeout=10): + def post(node, path, headers=None, payload=None, json=None, timeout=15, + enable_logging=True): """Sends a POST request and returns the response and status code. :param node: Honeycomb node. @@ -263,22 +295,27 @@ class HTTPRequest(object): :param json: JSON formatted string to send in the body of the Request. :param timeout: How long to wait for the server to send data before giving up, as a float, or a (connect timeout, read timeout) tuple. + :param enable_logging: Used to suppress errors when checking ODL + state during suite setup and teardown. When True, logging is enabled, + otherwise logging is disabled. :type node: dict :type path: str :type headers: dict :type payload: dict, bytes, or file-like object :type json: str :type timeout: float or tuple + :type enable_logging: bool :return: Status code and content of response. :rtype: tuple """ - return HTTPRequest._http_request('POST', node, path, headers=headers, - data=payload, json=json, - timeout=timeout) + return HTTPRequest._http_request('POST', node, path, + enable_logging=enable_logging, + headers=headers, data=payload, + json=json, timeout=timeout) @staticmethod @keyword(name="HTTP Delete") - def delete(node, path, timeout=10): + def delete(node, path, timeout=15): """Sends a DELETE request and returns the response and status code. :param node: Honeycomb node.