Skip to content

Commit 43584d6

Browse files
authored
Merge pull request #9 from theElandor/cleanup
Cleanup
2 parents 2c8f4eb + 3b5128a commit 43584d6

File tree

3 files changed

+111
-42
lines changed

3 files changed

+111
-42
lines changed

Nodes/Nodes/Node.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -312,21 +312,30 @@ def send_to_all(self, message:Message):
312312
self.total_messages += 1
313313

314314
def send_to_all_except(self, sender: int, message: Message):
315-
"""!Send given message to all neighbors except the sender."""
315+
"""!Send given message to all neighbors except the sender.
316+
317+
@param sender (int): node to exclude.
318+
@param message (Message): message to send.
319+
320+
@return None
321+
"""
316322
for v, address in self.local_dns.items():
317323
if v == sender: continue
318324
self._send(message, address)
319325
self.total_messages += 1
320326

321-
def send_to_missing(self, senders: list, message: Message, silent: bool=False):
322-
"""!Send given message to all neighbors except the ones in the list."""
327+
def send_to_missing(self, senders: list, message: Message):
328+
"""!Send given message to all neighbors except the ones in the list.
329+
330+
@param senders (list): nodes to exclude
331+
@param message (Message): message to send
332+
333+
@return None
334+
"""
323335
s = set(senders)
324336
assert len(s) == len(senders)-1
325337
for v, address in self.local_dns.items():
326-
if v not in s:
327-
if not silent:
328-
self.log(str(message))
329-
338+
if v not in s:
330339
self._send(message, address)
331340
self.total_messages += 1
332341

@@ -342,7 +351,7 @@ def send_total_messages(self):
342351

343352
def _send_start_of_protocol(self):
344353
"""!Send SOP message to the initializer."""
345-
message = Message("SOP", self.port)
354+
message = Message(Command.START_PROTOCOL, self.port)
346355
self._send(message, self.back)
347356

348357
def _start_at(self, message:WakeupAllMessage):

Nodes/Nodes/RingNode.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ class RingNode(Node):
99
def __init__(self, hostname: str, back_port: int, listen_port: int):
1010
super().__init__(hostname, back_port, listen_port)
1111

12-
def send_to_other(self, sender: int, message: Message, silent: bool = False):
13-
"""Send message to the other node in the ring."""
12+
def send_to_other(self, sender: int, message: Message):
13+
"""!Send message to the other node in the ring.
14+
15+
@param sender (int): sender of the previous message. This primitive will
16+
send the message to the other neighbor.
17+
@param message (Message): message to send.
18+
19+
@return None
20+
"""
1421
for v, address in self.local_dns.items():
1522
if sender != v:
16-
if not silent:
17-
self.log(f"Sending to: {v}({address}) this message: {message}")
1823
self._send(message, address)
1924
break
2025
self.total_messages += 1

Nodes/initializers.py

+85-30
Original file line numberDiff line numberDiff line change
@@ -38,43 +38,97 @@ def __init__(self,
3838
@return None
3939
"""
4040
super().__init__()
41-
# Initializer node hostname.
42-
self.HOSTNAME: str = HOSTNAME
43-
# Initializer port
44-
self.PORT: int = PORT
45-
# Maximum buffer size
46-
self.BUFFER_SIZE:int = 4096
47-
# Graph
48-
self.G: nx.Graph = G
49-
# Number of nodes in the graph
50-
self.N: int = G.number_of_nodes()
51-
# Available ports, one for each node of the graph
52-
self.ports: list = [65432+x for x in range(self.N)] # one port for each node
53-
# DNS server holding tuples <node:port>
54-
self.DNS: dict = {node:port for node,port in zip(G.nodes(), self.ports)}
55-
# path of the client file
56-
self.client: str = client
57-
# Boolean
58-
self.shell: bool = shell
59-
if not log_path:
60-
self.log_path = os.path.join(os.path.split(self.client)[0], "logs")
61-
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
62-
self.s.bind(("", self.PORT))
63-
self.start_listener(self.s, self.message_queue)
64-
self.visualizer_port = None
41+
self._HOSTNAME: str = HOSTNAME
42+
self._PORT: int = PORT
43+
self._G: nx.Graph = G
44+
self._ports: list = [65432+x for x in range(self.number_of_nodes())] # one port for each node
45+
self._DNS: dict = {node:port for node,port in zip(G.nodes(), self.ports)}
46+
self._client: str = client
47+
self._shell: bool = shell
48+
49+
if not log_path: self._log_path = os.path.join(os.path.split(self.client)[0], "logs")
50+
else: self._log_path = None
51+
52+
self._s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
53+
self._s.bind(("", self.PORT))
54+
self.start_listener(self._s, self.message_queue)
55+
56+
self._visualizer_port = None
57+
self._visualizer = None
6558
if visualizer:
66-
self.visualizer_port = self.ports[-1]+1
67-
self.visualizer = Visualizer(self.visualizer_port, self.G)
59+
self._visualizer_port = self.ports[-1]+1
60+
self._visualizer = Visualizer(self.visualizer_port, self.G)
61+
6862
self.initialize_clients()
6963
self.setup_clients()
7064

65+
@property
66+
def HOSTNAME(self):
67+
"""!Return server hostname."""
68+
return self._HOSTNAME
69+
70+
@property
71+
def PORT(self):
72+
"""!Return server listener port."""
73+
return self._PORT
74+
75+
@property
76+
def G(self):
77+
"""!Return network structure."""
78+
return self._G
79+
80+
@property
81+
def ports(self):
82+
"""!Return ports used by the client nodes."""
83+
return self._ports
84+
85+
@property
86+
def DNS(self):
87+
"""!Return DNS (nodeID : Port)"""
88+
return self._DNS
89+
90+
@property
91+
def client(self):
92+
"""!Return path to client file."""
93+
return self._client
94+
95+
@property
96+
def shell(self):
97+
"""!Return True if each node should get a separate terminal."""
98+
return self._shell
99+
100+
@property
101+
def log_path(self):
102+
"""!Return root path to log files."""
103+
return self._log_path
104+
105+
@property
106+
def s(self):
107+
"""!Return socket used by the server to send messages."""
108+
return self._s
109+
110+
@property
111+
def visualizer_port(self):
112+
"""!Return visualizer port if visualizer is active."""
113+
return self._visualizer_port
114+
115+
@property
116+
def visualizer(self):
117+
"""!Return visualizer if activated."""
118+
return self._visualizer
119+
120+
71121
def __str__(self):
72122
"""!Convert node to string."""
73123
table = PrettyTable()
74124
table.field_names = ["Node", "Port"]
75125
for key, val in self.DNS.items():
76126
table.add_row([key, val])
77127
return table.__str__()
128+
129+
def number_of_nodes(self) -> int:
130+
"""Return number of nodes in the network."""
131+
return self.G.number_of_nodes()
78132

79133
def initialize_clients(self):
80134
"""!Initialize all of the nodes of the graph.
@@ -120,7 +174,7 @@ def wait_for_termination(self):
120174
message = TerminationMessage.deserialize(data)
121175
if message.command == Command.END_PROTOCOL:
122176
EOP_received += 1
123-
if EOP_received == self.N:
177+
if EOP_received == self.number_of_nodes():
124178
print("Received EOP from all nodes in the network.")
125179
break
126180
elif message.command == Command.ERROR:
@@ -141,7 +195,7 @@ def wait_for_number_of_messages(self):
141195
message = CountMessage.deserialize(data)
142196
total_count += message.counter
143197
counts_received += 1
144-
if counts_received == self.N:
198+
if counts_received == self.number_of_nodes():
145199
print("Received message count from all nodes.")
146200
print(f"Total number of messages: {total_count}")
147201
break
@@ -176,7 +230,7 @@ def setup_clients(self):
176230
data = self.receive_message()
177231
if not data: continue
178232
ans_message = Message.deserialize(data)
179-
if ans_message.command != "SOP":
233+
if ans_message.command != Command.START_PROTOCOL:
180234
print("Something went wrong during clients setup.")
181235
break
182236
else:
@@ -231,7 +285,8 @@ def send_termination(self):
231285
for node, port in self.DNS.items():
232286
s.sendto(termination_message.serialize(), ("localhost", port))
233287

234-
def start_visualization(self):
288+
def start_visualization(self):
289+
"""!Communicate to the visualizer to start the visualization loop."""
235290
assert self.visualizer, "Specify visualizer=True in the constructor to use this method."
236291
state = self.visualizer.start_visualization()
237292
if state == VisualizerState.INTERNAL_ERROR:

0 commit comments

Comments
 (0)