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
|
1 |
|
def __getnewargs__(self): |
32
|
|
|
"""To make sure it's pickleable""" |
33
|
1 |
|
return (self.switch, self.port) |
34
|
|
|
|
35
|
|
|
|
36
|
1 |
|
class LinkID(str): |
37
|
|
|
"""Link Identifier""" |
38
|
|
|
|
39
|
1 |
|
def __new__(cls, interface_a: InterfaceID, interface_b: InterfaceID): |
40
|
1 |
|
raw_str = ":".join(sorted((interface_a, interface_b))) |
41
|
1 |
|
digest = hashlib.sha256(raw_str.encode('utf-8')).hexdigest() |
42
|
1 |
|
return super().__new__(cls, digest) |
43
|
|
|
|
44
|
1 |
|
def __init__(self, interface_a: InterfaceID, interface_b: InterfaceID): |
45
|
1 |
|
self.interfaces = (interface_a, interface_b) |
46
|
1 |
|
super().__init__() |
47
|
|
|
|
48
|
1 |
|
def __getnewargs__(self): |
49
|
|
|
"""To make sure it's pickleable""" |
50
|
|
|
return self.interfaces |
51
|
|
|
|