ZIO
Python and C++ interface to ZeroMQ and Zyre
node.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from .util import guess_hostname
4 
5 import zmq
6 from .port import Port
7 from .peer import Peer
8 
9 class Node:
10  '''
11  A vertex in a ported graph with ZIO edges
12  '''
13 
14  def __init__(self, nick, origin=0, hostname='127.0.0.1'):
15  '''
16  Create a node.
17 
18  A node has a nickname. It may assert a unique origin number.
19  A hostname may be specified for default binds of its ports or
20  one will attempt to be autodetected.
21  '''
22  self.nick = nick
23  self.origin = origin
24  self._hostname = hostname or guess_hostname()
25  self.ports = dict() # by name
26 
27  def __str__(self):
28  sp = ' '.join([str(p) for p in self.ports.values()])
29  return "[node %s]: origin:%d ports:[%s]" % (self.nick, self.origin, sp)
30 
31  def port(self, name, stype=None):
32  '''
33  Return a port.
34 
35  If the port with this name exists, return it. Otherwise,
36  create one with the given ZeroMQ socket type.
37  '''
38  if name in self.ports:
39  return self.ports[name]
40  if stype is None:
41  raise KeyError('No port "%s"' % name)
42  port = Port(name, stype, self._hostname)
43  port.origin = self.origin
44  self.ports[name] = port
45  return port
46 
47  def online(self, **headers):
48  '''
49  Bring node online.
50 
51  The node will advertise a number of ZIO headers based on the
52  ports that have been prepared. Additional application headers
53  may also be included.
54  '''
55  if hasattr(self,"peer"):
56  print ('Node "%s" already online' % self.nick)
57  return
58 
59  for port in self.ports.values():
60  hh = port.do_binds()
61  headers.update(hh)
62  self.peer = Peer(self.nick, **headers)
63  for port in self.ports.values():
64  port.online(self.peer)
65  return
66 
67  def offline(self):
68  '''
69  Bring node offline.
70 
71  This will cause all ports to disconnect and unbind and the
72  peer to be destroyed.
73  '''
74 
75  for port in self.ports.values():
76  port.offline()
77  self.ports = dict()
78  if hasattr(self,"peer"):
79  del(self.peer)
def __init__(self, nick, origin=0, hostname='127.0.0.1')
Definition: node.py:14
def online(self, headers)
Definition: node.py:47
def port(self, name, stype=None)
Definition: node.py:31
def offline(self)
Definition: node.py:67
def guess_hostname()
Definition: util.py:46
def __str__(self)
Definition: node.py:27