diff --git a/src/device/service/drivers/oc_driver/templates/VPN/transponder.py b/src/device/service/drivers/oc_driver/templates/VPN/transponder.py index e7b64ff977f53618326e14e4ea8ae39547a185db..6b0afc8d58ceda5a35dbe231d08ef71df9f0a66c 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/transponder.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/transponder.py @@ -65,7 +65,8 @@ def add_transceiver (transceiver_name:str): def create_optical_channel(resources:list[dict],ports:list[dict],config:list[dict] ): - #unwanted_keys=['destination_port','source_port','channel_namespace','optical-band-parent','index', 'name','admin-state'] + # unwanted_keys=['bidir','source_port','destination_port','handled_flow','name','channel_namespace','admin-state' + # ,'optical-band-parent'] results =[] data ={} data["channel_namespace"]=next((i["value"] for i in resources if i["resource_key"] == "channel_namespace"), None) @@ -141,7 +142,7 @@ def change_optical_channel_status (state:str,ports:list[dict]) : def edit_optical_channel (resources:list[dict]): unwanted_keys=['destination_port','source_port','channel_namespace' - ,'optical-band-parent','index', 'name','admin-state','handled_flow'] + ,'optical-band-parent','index', 'name','admin-state','handled_flow','bidir'] config,ports,index=seperate_port_config(resources,unwanted_keys=unwanted_keys) results = [] # channel_name=next((i["value"] for i in resources if i["resource_key"]=="channel_name" and i["value"] != None),None) diff --git a/src/service/service/service_handlers/oc/OCServiceHandler.py b/src/service/service/service_handlers/oc/OCServiceHandler.py index b636272946cc408f771ebd114c9ce986902afc98..89946130cdbbb20ec29421493a3bf07b232b2e5f 100644 --- a/src/service/service/service_handlers/oc/OCServiceHandler.py +++ b/src/service/service/service_handlers/oc/OCServiceHandler.py @@ -25,7 +25,7 @@ from service.service.service_handler_api.SettingsHandler import SettingsHandler from service.service.task_scheduler.TaskExecutor import TaskExecutor from .ConfigRules import setup_config_rules, teardown_config_rules from .OCTools import ( - endpoints_to_flows + endpoints_to_flows,convert_endpoints_to_flows #handle_flows_names, check_media_channel_existance ) @@ -136,11 +136,11 @@ class OCServiceHandler(_ServiceHandler): self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None ) -> List[Union[bool, Exception]]: is_opticalband =False - flows = convert_endpoints_to_flows(endpoints) + service_uuid = self.__service.service_id.service_uuid.uuid chk_type('endpoints', endpoints, list) if len(endpoints) == 0: return [] - + if self.__settings_handler.get('/settings-ob_{}'.format(connection_uuid)): is_opticalband =True settings = self.__settings_handler.get('/settings-ob_{}'.format(connection_uuid)) @@ -148,6 +148,7 @@ class OCServiceHandler(_ServiceHandler): settings = self.__settings_handler.get('/settings') bidir = settings.value.get("bidir",None) + flows = convert_endpoints_to_flows(endpoints) results = [] for endpoint in endpoints: @@ -174,7 +175,7 @@ class OCServiceHandler(_ServiceHandler): except Exception as e: # pylint: disable=broad-except LOGGER.exception('Unable to DeleteEndpoint({:s})'.format(str(endpoint))) results.append(e) - + LOGGER.info(f"delete_endpoints_flows-> {flows}") for device_uuid, dev_flows in flows.items(): try: channel_indexes= [] diff --git a/src/service/service/service_handlers/oc/OCTools.py b/src/service/service/service_handlers/oc/OCTools.py index 6f3b2af1ab391ea67ae1592391003e4783475846..b7ed410c72bbd6e55987e5235efd55b4ec058d85 100644 --- a/src/service/service/service_handlers/oc/OCTools.py +++ b/src/service/service/service_handlers/oc/OCTools.py @@ -20,100 +20,98 @@ from service.service.service_handler_api.Tools import get_endpoint_matching log = logging.getLogger(__name__) -#def convert_endpoints_to_flows(endpoints : List[Tuple[str, str, Optional[str]]])->Dict[str: List[Tuple[str, str]]]: - -# def convert_endpoints_to_flows(endpoints : List[Tuple[str, str, Optional[str]]])->Dict: -# #entries = List[Tuple[str, str, str, Optional[str]]] -# #entries = Dict[str: List[Tuple[str, str]]] -# entries = {} -# #tuple is in, out -# #end = len(endpoints) if isinstance(endpoints,list) else 0 -# end = len(endpoints) -# i = 0 -# bidir = 0 -# log.debug("end={}".format(end)) -# while(i < end): -# endpoint = endpoints[i] -# device_uuid, endpoint_uuid = endpoint[0:2] -# log.info("current OCTools step {}, {}, {}".format(i, device_uuid, endpoint_uuid)) -# if device_uuid not in entries.keys(): -# entries[device_uuid] = [] -# if i == 0: -# entry_tuple = "0", endpoint_uuid -# entries[device_uuid].append(entry_tuple) -# next_endpoint = endpoints[i+1] -# next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] -# if next_device_uuid == device_uuid: -# bidir = 1 -# log.info("connection is bidirectional") -# entry_tuple = next_endpoint_uuid, "0" -# entries[device_uuid].append(entry_tuple) -# i = i + 1 -# else: -# log.debug("connection is unidirectional") -# else: -# if not bidir: -# if i == end-1: -# #is the last node -# entry_tuple = endpoint_uuid, "0" -# entries[device_uuid].append(entry_tuple) -# else: -# #it is a transit node -# next_endpoint = endpoints[i+1] -# next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] -# if next_device_uuid == device_uuid: -# entry_tuple = endpoint_uuid, next_endpoint_uuid -# entries[device_uuid].append(entry_tuple) -# i = i + 1 -# log.info("current OCTools step {}, {}, {}".format(i, next_device_uuid, device_uuid)) -# else: -# log.debug("ERROR in unidirectional connection 4") -# return {} -# else: -# log.debug("Ocheck i {}, {}, {}".format(i, i+1, end-1)) -# if i + 1 == end-1: -# log.debug("current OCTools step {}, {}, {}".format(i, device_uuid, endpoint_uuid)) -# #is the last node -# entry_tuple = endpoint_uuid, "0" -# entries[device_uuid].append(entry_tuple) -# next_endpoint = endpoints[i+1] -# log.debug("OCTools i+1 step {}, {}, {}".format(i+1, next_device_uuid, device_uuid)) +def convert_endpoints_to_flows(endpoints : List[Tuple[str, str, Optional[str]]])->Dict: + #entries = List[Tuple[str, str, str, Optional[str]]] + #entries = Dict[str: List[Tuple[str, str]]] + entries = {} + #tuple is in, out + #end = len(endpoints) if isinstance(endpoints,list) else 0 + end = len(endpoints) + i = 0 + bidir = 0 + log.debug("end={}".format(end)) + while(i < end): + endpoint = endpoints[i] + device_uuid, endpoint_uuid = endpoint[0:2] + log.info("current OCTools step {}, {}, {}".format(i, device_uuid, endpoint_uuid)) + if device_uuid not in entries.keys(): + entries[device_uuid] = [] + if i == 0: + entry_tuple = "0", endpoint_uuid + entries[device_uuid].append(entry_tuple) + next_endpoint = endpoints[i+1] + next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] + if next_device_uuid == device_uuid: + bidir = 1 + log.info("connection is bidirectional") + entry_tuple = next_endpoint_uuid, "0" + entries[device_uuid].append(entry_tuple) + i = i + 1 + else: + log.debug("connection is unidirectional") + else: + if not bidir: + if i == end-1: + #is the last node + entry_tuple = endpoint_uuid, "0" + entries[device_uuid].append(entry_tuple) + else: + #it is a transit node + next_endpoint = endpoints[i+1] + next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] + if next_device_uuid == device_uuid: + entry_tuple = endpoint_uuid, next_endpoint_uuid + entries[device_uuid].append(entry_tuple) + i = i + 1 + log.info("current OCTools step {}, {}, {}".format(i, next_device_uuid, device_uuid)) + else: + log.debug("ERROR in unidirectional connection 4") + return {} + else: + log.debug("Ocheck i {}, {}, {}".format(i, i+1, end-1)) + if i + 1 == end-1: + log.debug("current OCTools step {}, {}, {}".format(i, device_uuid, endpoint_uuid)) + #is the last node + entry_tuple = endpoint_uuid, "0" + entries[device_uuid].append(entry_tuple) + next_endpoint = endpoints[i+1] + log.debug("OCTools i+1 step {}, {}, {}".format(i+1, next_device_uuid, device_uuid)) -# next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] -# if next_device_uuid == device_uuid: -# entry_tuple = "0", next_endpoint_uuid -# entries[device_uuid].append(entry_tuple) -# i = i + 1 -# else: -# log.debug("ERROR in bidirectional connection 2") -# return entries -# else: -# log.debug("OCTools i+1+2+3 step {}, {}, {}".format(i+1, next_device_uuid, device_uuid)) -# #i+1 -# next_endpoint = endpoints[i+1] -# next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] -# if next_device_uuid == device_uuid: -# entry_tuple = endpoint_uuid, next_endpoint_uuid -# entries[device_uuid].append(entry_tuple) -# else: -# log.debug("ERROR in bidirectional connection 3") -# log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) -# return entries -# #i+2 -# next_2_endpoint = endpoints[i+2] -# next_2_device_uuid, next_2_endpoint_uuid = next_2_endpoint[0:2] -# #i+3 -# next_3_endpoint = endpoints[i+3] -# next_3_device_uuid, next_3_endpoint_uuid = next_3_endpoint[0:2] -# if next_2_device_uuid == next_3_device_uuid and next_3_device_uuid == device_uuid: -# entry_tuple = next_2_endpoint_uuid, next_3_endpoint_uuid -# entries[device_uuid].append(entry_tuple) -# i = i + 3 -# else: -# log.debug("ERROR in bidirection connection 4") -# return {} -# i = i + 1 -# return entries + next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] + if next_device_uuid == device_uuid: + entry_tuple = "0", next_endpoint_uuid + entries[device_uuid].append(entry_tuple) + i = i + 1 + else: + log.debug("ERROR in bidirectional connection 2") + return entries + else: + log.debug("OCTools i+1+2+3 step {}, {}, {}".format(i+1, next_device_uuid, device_uuid)) + #i+1 + next_endpoint = endpoints[i+1] + next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] + if next_device_uuid == device_uuid: + entry_tuple = endpoint_uuid, next_endpoint_uuid + entries[device_uuid].append(entry_tuple) + else: + log.debug("ERROR in bidirectional connection 3") + log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) + return entries + #i+2 + next_2_endpoint = endpoints[i+2] + next_2_device_uuid, next_2_endpoint_uuid = next_2_endpoint[0:2] + #i+3 + next_3_endpoint = endpoints[i+3] + next_3_device_uuid, next_3_endpoint_uuid = next_3_endpoint[0:2] + if next_2_device_uuid == next_3_device_uuid and next_3_device_uuid == device_uuid: + entry_tuple = next_2_endpoint_uuid, next_3_endpoint_uuid + entries[device_uuid].append(entry_tuple) + i = i + 3 + else: + log.debug("ERROR in bidirection connection 4") + return {} + i = i + 1 + return entries @@ -398,11 +396,17 @@ def conn_flows(endpoints : List[Tuple[str, str, Optional[str]]], bidir : int): entries[device_uuid].append(entry_tuple) return entries + + + + + def endpoints_to_flows(endpoints : List[Tuple[str, str, Optional[str]]], bidir : int, is_ob: bool)->Dict: if is_ob: entries = ob_flows(endpoints, bidir) else: entries = conn_flows(endpoints, bidir) + return entries def get_device_endpint_name(endpoint_uuid : str, device_uuid : str, task_executor) -> Tuple: diff --git a/src/service/service/task_scheduler/tasks/Task_OpticalConnectionConfigure.py b/src/service/service/task_scheduler/tasks/Task_OpticalConnectionConfigure.py index 1665c41b18dba0a7c09ae124092e018afb4c6fb2..a71761fb4199b1373dfa5e126283e3b0866da6ba 100644 --- a/src/service/service/task_scheduler/tasks/Task_OpticalConnectionConfigure.py +++ b/src/service/service/task_scheduler/tasks/Task_OpticalConnectionConfigure.py @@ -21,7 +21,9 @@ from service.service.service_handler_api.Tools import check_errors_setendpoint from service.service.task_scheduler.TaskExecutor import TaskExecutor from service.service.tools.EndpointIdFormatters import endpointids_to_raw from service.service.tools.ObjectKeys import get_connection_key + from ._Task import _Task +import logging if TYPE_CHECKING: from service.service.service_handler_api._ServiceHandler import _ServiceHandler @@ -49,23 +51,36 @@ class Task_OpticalConnectionConfigure(_Task): service = self._task_executor.get_service(connection.service_id) service_handler_settings = {} - service_handlers : Dict[DeviceTypeEnum, Tuple['_ServiceHandler', Dict[str, Device]]] = \ - self._task_executor.get_service_handlers(connection, service, **service_handler_settings) - + service_handler=None + service_handlers = self._task_executor.get_service_handlers(connection, service, **service_handler_settings) + for _, (handler, connection_devices) in service_handlers.items(): + logging.info(f"type_servicehandler {type(handler)}") + if service_handler is None : service_handler=handler + else : + if type(handler) != type(service_handler) : + raise Exception("Devices are not compatible ") + connection_uuid = connection.connection_id.connection_uuid.uuid + logging.info(f"connection-> uuid{connection_uuid}") endpointids_to_set = endpointids_to_raw(connection.path_hops_endpoint_ids) - + logging.info(f" _endpointids_to_set-> {endpointids_to_set}") errors = list() - for _, (service_handler, connection_devices) in service_handlers.items(): - _endpointids_to_set = [ - (device_uuid, endpoint_uuid, topology_uuid) - for device_uuid, endpoint_uuid, topology_uuid in endpointids_to_set - if device_uuid in connection_devices - ] - results_setendpoint = service_handler.SetEndpoint( - _endpointids_to_set, connection_uuid=connection_uuid - ) - errors.extend(check_errors_setendpoint(endpointids_to_set, results_setendpoint)) + + connection_uuid = connection.connection_id.connection_uuid.uuid + results_setendpoint = service_handler.SetEndpoint(endpointids_to_set, connection_uuid=connection_uuid) + + # for _, (service_handler, connection_devices) in service_handlers.items(): + # logging.info(f" connection_devices-> {connection_devices}") + # _endpointids_to_set = [ + # (device_uuid, endpoint_uuid, topology_uuid) + # for device_uuid, endpoint_uuid, topology_uuid in endpointids_to_set + # if device_uuid in connection_devices + # ] + # logging.info(f" results_endpointids_to_set-> {_endpointids_to_set}") + # results_setendpoint = service_handler.SetEndpoint( + # _endpointids_to_set, connection_uuid=connection_uuid + # ) + errors.extend(check_errors_setendpoint(endpointids_to_set, results_setendpoint)) if len(errors) > 0: MSG = 'SetEndpoint for Connection({:s}) from Service({:s})' @@ -76,7 +91,7 @@ class Task_OpticalConnectionConfigure(_Task): self._task_executor.set_connection(connection) results_setendOpticalConfigs = service_handler.SetOpticalConfig( - _endpointids_to_set, connection_uuid=connection_uuid + endpointids_to_set, connection_uuid=connection_uuid ) errors.extend(check_errors_setendpoint(endpointids_to_set, results_setendOpticalConfigs)) diff --git a/src/service/service/tools/EndpointIdFormatters.py b/src/service/service/tools/EndpointIdFormatters.py index bcc73ba07976ec628e5d8cf7f41c4f37c0819d12..4758b28096e1bd1d73764145c32560449c9d3e41 100644 --- a/src/service/service/tools/EndpointIdFormatters.py +++ b/src/service/service/tools/EndpointIdFormatters.py @@ -12,10 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import List, Optional, Tuple +from typing import List, Optional, Tuple +import logging from common.proto.context_pb2 import EndPointId def endpointids_to_raw(traversed_endpoint_ids : List[EndPointId]) -> List[Tuple[str, str, Optional[str]]]: + raw_endpoint_ids : List[Tuple[str, str, Optional[str]]] = [] for endpoint_id in traversed_endpoint_ids: device_uuid = endpoint_id.device_id.device_uuid.uuid diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py index ab7b6fbce959d8b565126855fc0b2493fe9d08da..10787ca1dd2ecffe18091ec3a720082d27f5f213 100644 --- a/src/service/service/tools/OpticalTools.py +++ b/src/service/service/tools/OpticalTools.py @@ -370,6 +370,8 @@ def adapt_reply(devices, service, reply_json, context_id, topology_id, optical_b opt_reply.services.add().CopyFrom(service) return opt_reply + + def add_service_to_reply(reply : PathCompReply, service : Service) -> Service: service_x = reply.services.add() service_x.CopyFrom(service) diff --git a/src/tests/ofc24/r_t.sh b/src/tests/ofc24/r_t.sh index f4ce3d22a83fe62a78534f445f587483ddd64bce..92ee7a9e097797284936e05a29c5967f518a1965 100755 --- a/src/tests/ofc24/r_t.sh +++ b/src/tests/ofc24/r_t.sh @@ -25,7 +25,9 @@ docker rm na3 docker rm t2 docker rm na2 -screen -dmS t1 -T xterm sh -c "docker run --name t1 -p 10.0.2.4:2023:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/oc23bgp.img:latest bash -c 'cp /files/transponders_x4.xml demoECOC21.xml ; ./startNetconfAgent.sh'" -screen -dmS t3 -T xterm sh -c "docker run --name na3 -p 10.0.2.4:2025:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/flexscale-node.img:latest bash -c 'cp /files/platform_r1.xml init_openconfig-platform.xml ; ./startNetconfAgent.sh'" -screen -dmS t2 -T xterm sh -c "docker run --name t2 -p 10.0.2.4:2024:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/oc23bgp.img:latest bash -c 'cp /files/transponders_x4_2.xml demoECOC21.xml ; ./startNetconfAgent.sh'" -screen -dmS t4 -T xterm sh -c "docker run --name na2 -p 10.0.2.4:2026:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/flexscale-node.img:latest bash -c 'cp /files/platform_r2.xml init_openconfig-platform.xml ; ./startNetconfAgent.sh'" +docker network create --subnet=192.168.100.0/24 my-custom-network + +screen -dmS t1 -T xterm sh -c "docker run --name t1 --net my-custom-network -p 10.0.2.4:2023:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/oc23bgp.img:latest bash -c 'cp /files/transponders_x4.xml demoECOC21.xml ; ./startNetconfAgent.sh'" +screen -dmS t3 -T xterm sh -c "docker run --name na3 --net my-custom-network -p 10.0.2.4:2025:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/flexscale-node.img:latest bash -c 'cp /files/platform_r1.xml init_openconfig-platform.xml ; ./startNetconfAgent.sh'" +screen -dmS t2 -T xterm sh -c "docker run --name t2 --net my-custom-network -p 10.0.2.4:2024:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/oc23bgp.img:latest bash -c 'cp /files/transponders_x4_2.xml demoECOC21.xml ; ./startNetconfAgent.sh'" +screen -dmS t4 -T xterm sh -c "docker run --name na2 --net my-custom-network -p 10.0.2.4:2026:2022 -v /home/tfs/tfs-ctrl/src/tests/ofc24/tempOC/files:/files -it asgamb1/flexscale-node.img:latest bash -c 'cp /files/platform_r2.xml init_openconfig-platform.xml ; ./startNetconfAgent.sh'"