CSIT-577 HC Test: Scripts for test jobs using ODL client
[csit.git] / resources / libraries / python / HTTPRequest.py
index 1f5df52..869078b 100644 (file)
@@ -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
@@ -36,6 +38,7 @@ class HTTPCodes(IntEnum):
     UNAUTHORIZED = 401
     FORBIDDEN = 403
     NOT_FOUND = 404
+    CONFLICT = 409
     INTERNAL_SERVER_ERROR = 500
     SERVICE_UNAVAILABLE = 503
 
@@ -113,6 +116,14 @@ class HTTPRequest(object):
         :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)
 
@@ -167,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))
@@ -202,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.
@@ -228,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.
@@ -254,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.
@@ -265,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.