Commit 87d0e798 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Device component - TAPI Driver:

- added basic support for HTTPS
- added optional support for authentication
parent 227bdc14
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
# limitations under the License.

import json, logging, requests
from requests.auth import HTTPBasicAuth
from typing import Optional
from device.service.driver_api._Driver import RESOURCE_ENDPOINTS

LOGGER = logging.getLogger(__name__)
@@ -28,11 +30,13 @@ def find_key(resource, key):
    return json.loads(resource[1])[key]


def config_getter(root_url, resource_key, timeout):
def config_getter(
    root_url : str, resource_key : str, auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None
):
    url = '{:s}/restconf/data/tapi-common:context'.format(root_url)
    result = []
    try:
        response = requests.get(url, timeout=timeout)
        response = requests.get(url, timeout=timeout, verify=False, auth=auth)
    except requests.exceptions.Timeout:
        LOGGER.exception('Timeout connecting {:s}'.format(url))
    except Exception as e:  # pylint: disable=broad-except
@@ -63,8 +67,10 @@ def config_getter(root_url, resource_key, timeout):
    return result

def create_connectivity_service(
    root_url, timeout, uuid, input_sip, output_sip, direction, capacity_value, capacity_unit, layer_protocol_name,
    layer_protocol_qualifier):
    root_url, uuid, input_sip, output_sip, direction, capacity_value, capacity_unit, layer_protocol_name,
    layer_protocol_qualifier,
    auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None
):

    url = '{:s}/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context'.format(root_url)
    headers = {'content-type': 'application/json'}
@@ -105,7 +111,8 @@ def create_connectivity_service(
    results = []
    try:
        LOGGER.info('Connectivity service {:s}: {:s}'.format(str(uuid), str(data)))
        response = requests.post(url=url, data=json.dumps(data), timeout=timeout, headers=headers)
        response = requests.post(
            url=url, data=json.dumps(data), timeout=timeout, headers=headers, verify=False, auth=auth)
        LOGGER.info('TAPI response: {:s}'.format(str(response)))
    except Exception as e:  # pylint: disable=broad-except
        LOGGER.exception('Exception creating ConnectivityService(uuid={:s}, data={:s})'.format(str(uuid), str(data)))
@@ -117,12 +124,12 @@ def create_connectivity_service(
        results.append(response.status_code in HTTP_OK_CODES)
    return results

def delete_connectivity_service(root_url, timeout, uuid):
def delete_connectivity_service(root_url, uuid, auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None):
    url = '{:s}/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context/connectivity-service={:s}'
    url = url.format(root_url, uuid)
    results = []
    try:
        response = requests.delete(url=url, timeout=timeout)
        response = requests.delete(url=url, timeout=timeout, verify=False, auth=auth)
    except Exception as e:  # pylint: disable=broad-except
        LOGGER.exception('Exception deleting ConnectivityService(uuid={:s})'.format(str(uuid)))
        results.append(e)
+13 −6
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
# limitations under the License.

import logging, requests, threading
from requests.auth import HTTPBasicAuth
from typing import Any, Iterator, List, Optional, Tuple, Union
from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
from common.type_checkers.Checkers import chk_string, chk_type
@@ -29,7 +30,11 @@ class TransportApiDriver(_Driver):
        self.__lock = threading.Lock()
        self.__started = threading.Event()
        self.__terminate = threading.Event()
        self.__tapi_root = 'http://' + address + ':' + str(port)
        username = settings.get('username')
        password = settings.get('password')
        self.__auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None
        scheme = settings.get('scheme', 'http')
        self.__tapi_root = '{:s}://{:s}:{:d}'.format(scheme, address, int(port))
        self.__timeout = int(settings.get('timeout', 120))

    def Connect(self) -> bool:
@@ -37,7 +42,7 @@ class TransportApiDriver(_Driver):
        with self.__lock:
            if self.__started.is_set(): return True
            try:
                requests.get(url, timeout=self.__timeout)
                requests.get(url, timeout=self.__timeout, verify=False, auth=self.__auth)
            except requests.exceptions.Timeout:
                LOGGER.exception('Timeout connecting {:s}'.format(str(self.__tapi_root)))
                return False
@@ -67,7 +72,8 @@ class TransportApiDriver(_Driver):
            for i, resource_key in enumerate(resource_keys):
                str_resource_name = 'resource_key[#{:d}]'.format(i)
                chk_string(str_resource_name, resource_key, allow_empty=False)
                results.extend(config_getter(self.__tapi_root, resource_key, self.__timeout))
                results.extend(config_getter(
                    self.__tapi_root, resource_key, timeout=self.__timeout, auth=self.__auth))
        return results

    @metered_subclass_method(METRICS_POOL)
@@ -89,8 +95,8 @@ class TransportApiDriver(_Driver):
                direction = find_key(resource, 'direction')

                data = create_connectivity_service(
                    self.__tapi_root, self.__timeout, uuid, input_sip, output_sip, direction, capacity_value,
                    capacity_unit, layer_protocol_name, layer_protocol_qualifier)
                    self.__tapi_root, uuid, input_sip, output_sip, direction, capacity_value, capacity_unit,
                    layer_protocol_name, layer_protocol_qualifier, timeout=self.__timeout, auth=self.__auth)
                results.extend(data)
        return results

@@ -102,7 +108,8 @@ class TransportApiDriver(_Driver):
            for resource in resources:
                LOGGER.info('resource = {:s}'.format(str(resource)))
                uuid = find_key(resource, 'uuid')
                results.extend(delete_connectivity_service(self.__tapi_root, self.__timeout, uuid))
                results.extend(delete_connectivity_service(
                    self.__tapi_root, uuid, timeout=self.__timeout, auth=self.__auth))
        return results

    @metered_subclass_method(METRICS_POOL)