diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py index 053e6d542788e5231e48ee17fde88d31c186a86b..7cd419c6be3896c034abf43a8abe45fccbad1733 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py @@ -61,9 +61,11 @@ class ConnectionEntry: uuid: str = '' service_type : ServiceTypeEnum = ServiceTypeEnum.SERVICETYPE_UNKNOWN path_hops : List[Dict] = field(default_factory=list) - dependencies : List[str] = field(default_factory=list) + dependencies : List['ConnectionEntry'] = field(default_factory=list) def calculate_subservice_uuid(self, main_service_uuid: str) -> None: + if self.uuid: + return composed_string = main_service_uuid + '-'.join( f'{path_hop["device"]}/{path_hop["ingress_ep"]}/{path_hop["egress_ep"]}' for path_hop in self.path_hops ) @@ -103,28 +105,25 @@ def convert_explicit_path_hops_to_connections( prv_service_type = connection_stack.queue[-1].service_type service_type = get_service_type(res_class[1], prv_service_type) connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop]) - connection_entry.calculate_subservice_uuid(main_service_uuid) connection_stack.put(connection_entry) # underlying connection ended connection: ConnectionEntry = connection_stack.get() connections.append(connection) - connection_stack.queue[-1].dependencies.append(connection.uuid) - #connection_stack.queue[-1][2].append(path_hop) + connection_stack.queue[-1].dependencies.append(connection) elif prv_res_class[2] is None and res_class[2] is not None: # entering domain of a device controller, create underlying connection LOGGER.debug(' entering domain of a device controller, create underlying connection') prv_service_type = connection_stack.queue[-1].service_type service_type = get_service_type(res_class[1], prv_service_type) connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop]) - connection_entry.calculate_subservice_uuid(main_service_uuid) connection_stack.put(connection_entry) elif prv_res_class[2] is not None and res_class[2] is None: # leaving domain of a device controller, terminate underlying connection LOGGER.debug(' leaving domain of a device controller, terminate underlying connection') connection = connection_stack.get() connections.append(connection) - connection_stack.queue[-1].dependencies.append(connection.uuid) + connection_stack.queue[-1].dependencies.append(connection) connection_stack.queue[-1].path_hops.append(path_hop) elif prv_res_class[2] is not None and res_class[2] is not None: if prv_res_class[2] == res_class[2]: @@ -136,12 +135,11 @@ def convert_explicit_path_hops_to_connections( LOGGER.debug(' switching to different device controller, chain connections') connection = connection_stack.get() connections.append(connection) - connection_stack.queue[-1].dependencies.append(connection.uuid) + connection_stack.queue[-1].dependencies.append(connection) prv_service_type = connection_stack.queue[-1].service_type service_type = get_service_type(res_class[1], prv_service_type) connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop]) - connection_entry.calculate_subservice_uuid (main_service_uuid) connection_stack.put(connection_entry) elif prv_res_class[0] is None: # path ingress @@ -154,7 +152,6 @@ def convert_explicit_path_hops_to_connections( prv_service_type = connection_stack.queue[-1].service_type service_type = get_service_type(res_class[1], prv_service_type) connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop]) - connection_entry.calculate_subservice_uuid(main_service_uuid) connection_stack.put(connection_entry) elif prv_res_class[0] == res_class[0]: # same resource group kind @@ -168,19 +165,18 @@ def convert_explicit_path_hops_to_connections( LOGGER.debug(' chain connections') connection = connection_stack.get() connections.append(connection) - connection_stack.queue[-1].dependencies.append(connection.uuid) + connection_stack.queue[-1].dependencies.append(connection) prv_service_type = connection_stack.queue[-1].service_type service_type = get_service_type(res_class[1], prv_service_type) connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop]) - connection_entry.calculate_subservice_uuid(main_service_uuid) connection_stack.put(connection_entry) elif prv_res_class[0] < res_class[0]: # underlying connection ended LOGGER.debug(' underlying connection ended') connection = connection_stack.get() connections.append(connection) - connection_stack.queue[-1].dependencies.append(connection.uuid) + connection_stack.queue[-1].dependencies.append(connection) connection_stack.queue[-1].path_hops.append(path_hop) else: raise Exception('Uncontrolled condition') @@ -193,7 +189,9 @@ def convert_explicit_path_hops_to_connections( connections.append(connection_stack.get()) LOGGER.debug('connections={:s}'.format(str(connections))) assert connection_stack.empty() - return [(c.uuid, c.service_type, c.path_hops, c.dependencies) for c in connections] + for c in connections: + c.calculate_subservice_uuid(main_service_uuid) + return [(c.uuid, c.service_type, c.path_hops, [cd.uuid for cd in c.dependencies]) for c in connections] def convert_explicit_path_hops_to_plain_connection( path_hops : List[Dict], main_service_uuid : str, main_service_type : ServiceTypeEnum