Total Complexity | 5 |
Total Lines | 39 |
Duplicated Lines | 0 % |
Coverage | 100% |
Changes | 0 |
1 | """Module with identifier types for Links and Interfaces""" |
||
2 | |||
3 | 1 | import hashlib |
|
4 | |||
5 | |||
6 | 1 | class InterfaceID(str): |
|
7 | """Interface Identifier""" |
||
8 | |||
9 | 1 | __slots__ = ("switch", "port") |
|
10 | |||
11 | 1 | def __new__(cls, switch: str, port: int): |
|
12 | 1 | return super().__new__(cls, f"{switch}:{port}") |
|
13 | |||
14 | 1 | def __init__(self, switch: str, port: int): |
|
15 | # Used for sorting, but can be accessed |
||
16 | 1 | self.switch = switch |
|
17 | 1 | self.port = port |
|
18 | 1 | super().__init__() |
|
19 | |||
20 | 1 | def __lt__(self, other): |
|
21 | # Ensures that instances are sortable in a way that maintains backwards |
||
22 | # compatibility when creating instances of LinkID |
||
23 | 1 | dpid_a = self.switch |
|
24 | 1 | port_a = self.port |
|
25 | 1 | dpid_b = other.switch |
|
26 | 1 | port_b = other.port |
|
27 | 1 | if dpid_a < dpid_b: |
|
28 | 1 | return True |
|
29 | 1 | return dpid_a == dpid_b and port_a < port_b |
|
30 | |||
31 | |||
32 | 1 | class LinkID(str): |
|
33 | """Link Identifier""" |
||
34 | |||
35 | 1 | def __new__(cls, interface_1: InterfaceID, interface_2: InterfaceID): |
|
36 | 1 | raw_str = ":".join(sorted((interface_1, interface_2))) |
|
37 | 1 | digest = hashlib.sha256(raw_str.encode('utf-8')).hexdigest() |
|
38 | return super().__new__(cls, digest) |
||
39 |