From a6ff6475546773c63d009ac73897dde7c775fb0e Mon Sep 17 00:00:00 2001
From: gifrerenom <lluis.gifre@cttc.es>
Date: Tue, 21 Feb 2023 16:36:09 +0000
Subject: [PATCH] Device component - IETF L2VPN Driver:

- Created placeholders to start implementation
---
 .../drivers/ietf_l2vpn/IetfL2VpnDriver.py     | 57 ++++++++++++++-----
 1 file changed, 42 insertions(+), 15 deletions(-)

diff --git a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
index 609221963..68b8090e5 100644
--- a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
+++ b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
@@ -17,16 +17,30 @@ 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
 from device.service.driver_api._Driver import _Driver, RESOURCE_ENDPOINTS, RESOURCE_SERVICES
-from .Tools import find_key
+from .Tools import connection_point, find_key, wim_mapping
 from .WimconnectorIETFL2VPN import WimconnectorIETFL2VPN
 
 LOGGER = logging.getLogger(__name__)
 
+def process_endpoint(method : str, endpoint : Any) -> Any:
+    LOGGER.warning('[{:s}][process_endpoint] endpoint={:s}'.format(str(method), str(endpoint)))
+    return endpoint
+
+def process_connectivity_service(method : str, service : Any) -> Any:
+    LOGGER.warning('[{:s}][process_connectivity_service] service={:s}'.format(str(method), str(service)))
+    return service
+
+def service_exists(param : Any) -> bool:
+    LOGGER.warning('[service_exists] param={:s}'.format(str(param)))
+    return False
+
 ALL_RESOURCE_KEYS = [
     RESOURCE_ENDPOINTS,
     RESOURCE_SERVICES,
 ]
 
+SERVICE_TYPE = 'ELINE'
+
 METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': 'ietf_l2vpn'})
 
 class IetfL2VpnDriver(_Driver):
@@ -39,7 +53,8 @@ class IetfL2VpnDriver(_Driver):
         scheme = settings.get('scheme', 'http')
         wim = {'wim_url': '{:s}://{:s}:{:d}'.format(scheme, address, int(port))}
         wim_account = {'user': username, 'password': password}
-        config = {'mapping_not_needed': False, 'service_endpoint_mapping': mapping}
+        # Mapping updated dynamically with each request
+        config = {'mapping_not_needed': False, 'service_endpoint_mapping': []}
         self.wim = WimconnectorIETFL2VPN(wim, wim_account, config=config)
         self.conn_info = {} # internal database emulating OSM storage provided to WIM Connectors
 
@@ -48,7 +63,7 @@ class IetfL2VpnDriver(_Driver):
             try:
                 self.wim.check_credentials()
             except Exception:  # pylint: disable=broad-except
-                LOGGER.exception('Exception connecting {:s}'.format(str(self.__tapi_root)))
+                LOGGER.exception('Exception checking credentials')
                 return False
             else:
                 self.__started.set()
@@ -78,15 +93,15 @@ class IetfL2VpnDriver(_Driver):
                 if resource_key == RESOURCE_ENDPOINTS:
                     # return endpoints through debug-api and list-devices method
                     endpoints = self.debug_api.get_endpoints()
-                    for endpoint in endpoints: results.append(process_endpoint(endpoint))
+                    for endpoint in endpoints: results.append(process_endpoint('GetConfig', endpoint))
                 elif resource_key == RESOURCE_SERVICES:
                     # return all services through 
                     services = self.wim.get_all_active_connectivity_services()
-                    for service in services: results.append(process_service(service))
+                    for service in services: results.append(process_connectivity_service('GetConfig', service))
                 else:
                     # assume single-service retrieval
                     service = self.wim.get_connectivity_service()
-                    results.append(process_service(service))
+                    results.append(process_connectivity_service('GetConfig', service))
         return results
 
     @metered_subclass_method(METRICS_POOL)
@@ -98,24 +113,34 @@ class IetfL2VpnDriver(_Driver):
             for resource in resources:
                 LOGGER.info('resource = {:s}'.format(str(resource)))
 
-                uuid = find_key(resource, 'uuid')
-                #input_sip = find_key(resource, 'input_sip')
-                #output_sip = find_key(resource, 'output_sip')
+                service_uuid = find_key(resource, 'uuid')
+                a_endpoint = find_key(resource, 'a_endpoint')
+                z_endpoint = find_key(resource, 'z_endpoint')
                 #capacity_value = find_key(resource, 'capacity_value')
                 #capacity_unit = find_key(resource, 'capacity_unit')
                 #layer_protocol_name = find_key(resource, 'layer_protocol_name')
                 #layer_protocol_qualifier = find_key(resource, 'layer_protocol_qualifier')
                 #direction = find_key(resource, 'direction')
+                encapsulation_type = find_key(resource, 'encapsulation_type')
+                vlan_id = find_key(resource, 'vlan_id')
+
+                conn_info = {}
 
                 result = self.wim.get_connectivity_service_status(
                     service_uuid, conn_info=conn_info)
+
+                connection_points = []
+                for endpoint_id in [a_endpoint, z_endpoint]:
+                    site_id = str(endpoint_id)
+                    self.wim.mappings[endpoint_id] = wim_mapping(site_id, endpoint_id)
+                    connection_points.append(connection_point(endpoint_id, encapsulation_type, vlan_id))
                 if service_exists(result):
                     result = self.wim.create_connectivity_service(
-                        service_type, connection_points)
+                        SERVICE_TYPE, connection_points)
                 else:
-                    result = self.wim.edit_connectivity_service(
+                    self.wim.edit_connectivity_service(
                         service_uuid, conn_info=conn_info, connection_points=connection_points)
-                results.extend(process_result(result))
+                results.extend(process_connectivity_service('SetConfig', None))
         return results
 
     @metered_subclass_method(METRICS_POOL)
@@ -126,16 +151,18 @@ class IetfL2VpnDriver(_Driver):
             self.wim.check_credentials()
             for resource in resources:
                 LOGGER.info('resource = {:s}'.format(str(resource)))
-                uuid = find_key(resource, 'uuid')
+                service_uuid = find_key(resource, 'uuid')
+
+                conn_info = {}
 
                 result = self.wim.get_connectivity_service_status(
                     service_uuid, conn_info=conn_info)
                 if service_exists(result):
-                    result = self.wim.delete_connectivity_service(
+                    self.wim.delete_connectivity_service(
                         service_uuid, conn_info=conn_info)
                 else:
                     result = False
-                results.append(process_result(result))
+                results.extend(process_connectivity_service('DeleteConfig', None))
         return results
 
     @metered_subclass_method(METRICS_POOL)
-- 
GitLab