diff --git a/src/device/service/drivers/oc_driver/templates/VPN/physical.py b/src/device/service/drivers/oc_driver/templates/VPN/physical.py index 3bd87c604bd43447dceb1e7defc53473fa38d39c..a16c6466f9e1899c21eb4bdc615743d97b574a57 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/physical.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/physical.py @@ -127,6 +127,7 @@ def create_optical_band (resources) : results =[] unwanted_keys=['destination_port','source_port','channel_namespace','frequency','optical-band-parent'] config,ports,index= seperate_port_config(resources,unwanted_keys=unwanted_keys) + logging.info(f"BBBBBBBBBBBBB {ports}") doc, tag, text = Doc().tagtext() #with tag('config'): with tag('config',xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"): @@ -174,6 +175,7 @@ def create_media_channel (resources): results=[] unwanted_keys=['destination_port','source_port','channel_namespace','frequency','operational-mode', 'optical-band-parent'] config,ports,index= seperate_port_config(resources,unwanted_keys=unwanted_keys) + logging.info(f"BBBBBBBBBBBBB {ports}") doc, tag, text = Doc().tagtext() #with tag('config'): with tag('config',xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"): diff --git a/src/device/service/drivers/oc_driver/templates/VPN/roadms.py b/src/device/service/drivers/oc_driver/templates/VPN/roadms.py index 2421d549670e5600ff3b57f28f06733285214e33..a1844fe44020967d0f8b63292e71a9ec0521179b 100644 --- a/src/device/service/drivers/oc_driver/templates/VPN/roadms.py +++ b/src/device/service/drivers/oc_driver/templates/VPN/roadms.py @@ -167,7 +167,11 @@ def create_media_channel_v2 (resources): with tag('source'): with tag('config'): with tag('port-name'):text(src) - n+=1 + if dest is not None and dest != '0': + with tag('dest'): + with tag('config'): + with tag('port-name'):text(dest) + n+=1 result = indent( doc.getvalue(), @@ -235,7 +239,7 @@ def create_optical_band (resources) : results =[] unwanted_keys=['destination_port','source_port','channel_namespace','frequency','optical-band-parent','handled_flow'] config,ports,index= filter_config(resources,unwanted_keys=unwanted_keys) - + logging.info(f"SSSSSSSSSSSSSSS {ports}") doc, tag, text = Doc().tagtext() #with tag('config'): with tag('config',xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"): @@ -246,6 +250,7 @@ def create_optical_band (resources) : for flow in ports: #with tag('optical-band', operation="create"): src,dest=flow + logging.info(f"SSSSSSSSSSSSSSS {src}, {dest}") with tag('optical-band'): if index is not None: with tag('index'):text(str(int(index)+n)) diff --git a/src/service/service/service_handlers/oc/OCServiceHandler.py b/src/service/service/service_handlers/oc/OCServiceHandler.py index 6ffb7e870596266ad53779918b90c627f0cd8559..c43dd8cbbb2a8480ad5d0955673624e0f2c69d01 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._ServiceHandler import _ServiceHandler 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 convert_endpoints_to_flows, handle_flows_names , check_media_channel_existance +from .OCTools import convert_endpoints_to_flows, endpoints_to_flows, handle_flows_names , check_media_channel_existance LOGGER = logging.getLogger(__name__) @@ -58,15 +58,18 @@ class OCServiceHandler(_ServiceHandler): LOGGER.info(f"setEndpoint {connection_uuid}") settings = self.__settings_handler.get('/settings') - + bidir = settings.value.get("bidir") + LOGGER.debug(f"Bidir bvalue is: {bidir}") # settings = self.__settings_handler.get('/settings') #flow is the new variable that stores input-output relationship + #flows = convert_endpoints_to_flows(endpoints) + + flows = endpoints_to_flows(endpoints, bidir, is_opticalband) - flows = convert_endpoints_to_flows(endpoints) #handled_flows=handle_flows_names(flows=flows,task_executor=self.__task_executor) - #LOGGER.info("Handled Flows %s",handled_flows) + LOGGER.info(f"Computed Flows {flows}") results = [] #new cycle for setting optical devices @@ -94,6 +97,7 @@ class OCServiceHandler(_ServiceHandler): is_opticalband =False flows = convert_endpoints_to_flows(endpoints) + chk_type('endpoints', endpoints, list) diff --git a/src/service/service/service_handlers/oc/OCTools.py b/src/service/service/service_handlers/oc/OCTools.py index 76a1e4f8d0052b134acb4f67b3e923401b6499c7..bfb28f5ef7eda9dc4b4e080f992359ff37742901 100644 --- a/src/service/service/service_handlers/oc/OCTools.py +++ b/src/service/service/service_handlers/oc/OCTools.py @@ -116,6 +116,197 @@ def convert_endpoints_to_flows(endpoints : List[Tuple[str, str, Optional[str]]]) return entries +def ob_flows(endpoints : List[Tuple[str, str, Optional[str]]], bidir : int): + entries = {} + end = len(endpoints) + i = 0 + if bidir: + 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] = [] + 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: + if next_device_uuid not in entries.keys(): + entries[next_device_uuid] = [] + entry_tuple = next_endpoint_uuid, "0" + entries[next_device_uuid].append(entry_tuple) + else: + log.info("error expected device_id {}, found {}".format(device_uuid, next_device_uuid)) + return {} + i = i + 2 + if end > 4: + log.info("Bidirectional optical band connection with {} (>4) endpoints".format(end)) + while(i < end-2): + #i + endpoint = endpoints[i] + device_uuid, endpoint_uuid = endpoint[0:2] + log.debug("current OCTools step {}, {}, {}".format(i, device_uuid, endpoint_uuid)) + if device_uuid not in entries.keys(): + entries[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 ob") + log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) + return {} + #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 + 4 + else: + log.debug("ERROR in bidirection ob") + return {} + endpoint = endpoints[i] + device_uuid, endpoint_uuid = endpoint[0:2] + if device_uuid not in entries.keys(): + entries[device_uuid] = [] + entry_tuple = endpoint_uuid, "0", + 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: + if next_device_uuid not in entries.keys(): + entries[next_device_uuid] = [] + entry_tuple = "0", next_endpoint_uuid + entries[next_device_uuid].append(entry_tuple) + else: + log.debug("error expected device_id {}, found {}".format(device_uuid, next_device_uuid)) + else: + 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] = [] + entry_tuple = "0", endpoint_uuid + entries[device_uuid].append(entry_tuple) + i = i + 1 + if end > 2: + log.info("Unidirectional optical band connection with {} (>2) endpoints".format(end)) + while(i < end-1): + #i + 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] = [] + #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 ob") + log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) + return {} + i = i + 2 + next_endpoint = endpoints[i] + next_device_uuid, next_endpoint_uuid = next_endpoint[0:2] + if next_device_uuid not in entries.keys(): + entries[next_device_uuid] = [] + entry_tuple = next_endpoint_uuid, "0" + entries[next_device_uuid].append(entry_tuple) + return entries + + +def conn_flows(endpoints : List[Tuple[str, str, Optional[str]]], bidir : int): + entries = {} + end = len(endpoints) + i = 0 + #tx tp + 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] = [] + entry_tuple = "0", endpoint_uuid + entries[device_uuid].append(entry_tuple) + i = i + 1 + #if bidir reading 4 endpoints per node + if bidir: + while(i < end-1): + #i + 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] = [] + #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.info("ERROR in bidirectional ob") + log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) + return {} + #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 + 4 + else: + log.info("ERROR in bidirection ob") + return {} + else: + while(i < end-1): + #i + 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] = [] + #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) + i = i + 2 + else: + log.debug("ERROR in bidirectional ob") + log.debug("{}, {}, {}".format(i, next_device_uuid, device_uuid)) + return {} + #rx tp + endpoint = endpoints[i] + device_uuid, endpoint_uuid = endpoint[0:2] + if device_uuid not in entries.keys(): + entries[device_uuid] = [] + entry_tuple = endpoint_uuid, "0", + 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: + log.info("AAAAAAAAAAAAAAAAAAAAAAAA: {}".format(endpoints)) + 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: device_obj = task_executor.get_device(DeviceId(**json_device_id(device_uuid))) endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py index 9c3387a66bd46bd9146229d25f7d810a98f7794f..b5bda00710e82c6c7290c648f24a4319cb318326 100644 --- a/src/service/service/tools/OpticalTools.py +++ b/src/service/service/tools/OpticalTools.py @@ -163,6 +163,8 @@ def adapt_reply(devices, service, reply_json, context_id, topology_id, optical_b rules_ob= [] ob_id = 0 connection_ob=None + r = reply_json + bidir_f = r["bidir"] if optical_band_txt != "": ob_json = json.loads(optical_band_txt) ob = ob_json @@ -184,7 +186,7 @@ def adapt_reply(devices, service, reply_json, context_id, topology_id, optical_b bx = ob["band"] lf = int(int(freq)-int(bx/2)) uf = int(int(freq)+int(bx/2)) - val_ob = {"band_type": band_type, "low-freq": lf, "up-freq": uf, "frequency": freq, "band": bx, "ob_id": ob_id} + val_ob = {"band_type": band_type, "low-freq": lf, "up-freq": uf, "frequency": freq, "band": bx, "ob_id": ob_id, "bidir": bidir_f} rules_ob.append(ConfigRule_Custom(resource_key="/settings-ob_{}".format(uuuid_x), resource_value=json.dumps(val_ob))) bidir_ob = ob["bidir"] for devxb in ob["flows"].keys(): @@ -229,8 +231,7 @@ def adapt_reply(devices, service, reply_json, context_id, topology_id, optical_b else: log.info("no map device port for device {} port {}".format(devxb, out_end_point_b)) log.debug("optical-band connection {}".format(connection_ob)) - r = reply_json - bidir_f = r["bidir"] + connection_f = add_connection_to_reply(opt_reply) connection_f.connection_id.connection_uuid.uuid = str(uuid.uuid4()) connection_f.service_id.CopyFrom(service.service_id) @@ -293,9 +294,9 @@ def adapt_reply(devices, service, reply_json, context_id, topology_id, optical_b band_type = "C_BAND" if ob_id != 0: - val = {"target-output-power": "1.0", "frequency": frequency, "operational-mode": op_mode, "band": band, "flow_id": flow_id, "ob_id": ob_id, "band_type": band_type,} + val = {"target-output-power": "1.0", "frequency": frequency, "operational-mode": op_mode, "band": band, "flow_id": flow_id, "ob_id": ob_id, "band_type": band_type, "bidir": bidir_f} else: - val = {"target-output-power": "1.0", "frequency": frequency, "operational-mode": op_mode, "band": band, "flow_id": flow_id, "band_type": band_type,} + val = {"target-output-power": "1.0", "frequency": frequency, "operational-mode": op_mode, "band": band, "flow_id": flow_id, "band_type": band_type, "bidir": bidir_f} custom_rule = ConfigRule_Custom(resource_key="/settings", resource_value=json.dumps(val)) rule = ConfigRule(action=ConfigActionEnum.CONFIGACTION_SET, custom=custom_rule) service.service_config.config_rules.add().CopyFrom(rule)