|
|
@@ -189,15 +189,23 @@ class PathEndpoint(models.Model):
|
|
|
abstract = True
|
|
|
|
|
|
def trace(self):
|
|
|
- if self._path is None:
|
|
|
- return []
|
|
|
+ origin = self
|
|
|
+ path = []
|
|
|
|
|
|
# Construct the complete path
|
|
|
- path = [self, *self._path.get_path()]
|
|
|
- while (len(path) + 1) % 3:
|
|
|
- # Pad to ensure we have complete three-tuples (e.g. for paths that end at a non-connected FrontPort)
|
|
|
- path.append(None)
|
|
|
- path.append(self._path.destination)
|
|
|
+ while origin is not None:
|
|
|
+
|
|
|
+ if origin._path is None:
|
|
|
+ return path
|
|
|
+
|
|
|
+ path.extend([origin, *origin._path.get_path()])
|
|
|
+ while (len(path) + 1) % 3:
|
|
|
+ # Pad to ensure we have complete three-tuples (e.g. for paths that end at a non-connected FrontPort)
|
|
|
+ path.append(None)
|
|
|
+ path.append(origin._path.destination)
|
|
|
+
|
|
|
+ # Check for bridge interface to continue the trace
|
|
|
+ origin = getattr(origin._path.destination, 'bridge', None)
|
|
|
|
|
|
# Return the path as a list of three-tuples (A termination, cable, B termination)
|
|
|
return list(zip(*[iter(path)] * 3))
|