-
Notifications
You must be signed in to change notification settings - Fork 43
/
destination.py
151 lines (113 loc) · 5.33 KB
/
destination.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from .candidate import Candidate
from .meta import MetaObject
class Destination(MetaObject):
class Implementation(MetaObject.Implementation):
pass
def setup(self, message):
"""
Setup is called after the meta message is initially created.
"""
from .message import Message
assert isinstance(message, Message)
def __str__(self):
return "<%s>" % (self.__class__.__name__,)
class CandidateDestination(Destination):
"""
A destination policy where the message is sent to one or more specified candidates.
"""
class Implementation(Destination.Implementation):
def __init__(self, meta, *candidates):
"""
Construct a CandidateDestination.Implementation object.
META the associated CandidateDestination object.
CANDIDATES is a tuple containing zero or more Candidate objects. These will contain the
destination addresses when the associated message is sent.
"""
assert isinstance(candidates, tuple), type(candidates)
assert len(candidates) >= 0, len(candidates)
assert all(isinstance(candidate, Candidate) for candidate in candidates), [type(candidate) for candidate in candidates]
super(CandidateDestination.Implementation, self).__init__(meta)
self._candidates = candidates
@property
def candidates(self):
return self._candidates
class CommunityDestination(Destination):
"""
A destination policy where the message is sent to one or more community members selected from
the current candidate list.
At the time of sending at most NODE_COUNT addresses are obtained using
community.yield_random_candidates(...) to receive the message.
"""
class Implementation(Destination.Implementation):
def __init__(self, meta, *candidates, **kwargs):
"""
Construct a CandidateDestination.Implementation object.
META the associated CandidateDestination object.
CANDIDATES is a tuple containing zero or more Candidate objects. These will contain the
destination addresses when the associated message is sent.
"""
assert isinstance(candidates, tuple), type(candidates)
assert len(candidates) >= 0, len(candidates)
assert all(isinstance(candidate, Candidate) for candidate in candidates), [type(candidate) for candidate in candidates]
super(CommunityDestination.Implementation, self).__init__(meta)
self._candidates = candidates
@property
def node_count(self):
return self._meta._node_count
@property
def candidates(self):
return self._candidates
def __init__(self, node_count):
"""
Construct a CommunityDestination object.
NODE_COUNT is an integer giving the number of nodes where, when the message is created, the
message must be sent to. These nodes are selected using the
community.yield_random_candidates(...) method. NODE_COUNT must be zero or higher.
DEPTH is an integer in [0, 127] v -1, this determines the _remaining_ hop count for this message. If
DEPTH is equal to -1, no hop depth will be used.
"""
assert isinstance(node_count, int)
assert node_count >= 0
self._node_count = node_count
@property
def node_count(self):
return self._node_count
def __str__(self):
return "<%s node_count:%d>" % (self.__class__.__name__, self._node_count)
class NHopCommunityDestination(CommunityDestination):
"""
An extension of the default CommunityDestination which also takes a maximum number of hops for the message
to traverse.
"""
class Implementation(CommunityDestination.Implementation):
def __init__(self, meta, *candidates, **kwargs):
"""
Construct a NHopCommunityDestination.Implementation object.
META the associated CandidateDestination object.
CANDIDATES is a tuple containing zero or more Candidate objects. These will contain the
destination addresses when the associated message is sent.
"""
super(NHopCommunityDestination.Implementation, self).__init__(meta, *candidates, **kwargs)
if 'depth' in kwargs:
self._depth = kwargs['depth']
else:
self._depth = meta.depth
@property
def depth(self):
return self._depth
def __init__(self, node_count, depth=-1):
"""
Construct a NHopCommunityDestination object.
NODE_COUNT is an integer giving the number of nodes where, when the message is created, the
message must be sent to. These nodes are selected using the
community.yield_verified_candidates(...) method. NODE_COUNT must be zero or higher.
DEPTH is an integer in [0, 127] v -1, this determines the _remaining_ hop count for this message. If
DEPTH is equal to -1, no hop depth will be used.
"""
super(NHopCommunityDestination, self).__init__(node_count)
self._depth = depth
@property
def depth(self):
return self._depth
def __str__(self):
return "<%s node_count:%d, depth:%d>" % (self.__class__.__name__, self._node_count, self.depth)