def __init__(self, slave_infos=swarm_settings.SLAVE_INFOS): self.slave_infos = slave_infos self.heartbeat_client = HeartbeatClient() self.status_listener = SwarmMaster.SwarmStatusListener(self) self.master_httpd = MasterHTTPD(self)
class SwarmMaster: """The class which manages all of the master's roles: heartbeat generator, status listener, and httpd""" def __init__(self, slave_infos=swarm_settings.SLAVE_INFOS): self.slave_infos = slave_infos self.heartbeat_client = HeartbeatClient() self.status_listener = SwarmMaster.SwarmStatusListener(self) self.master_httpd = MasterHTTPD(self) class SwarmStatusListener(StatusListener): def __init__(self, swarm_master): self.swarm_master = swarm_master StatusListener.__init__(self) def handle_status(self, status): """ CHANGE ME: This is where you'd implement your application's reaction to any tests you've defined. """ print 'The SwarmStatusListener received status: %s' % status def start(self): self.heartbeat_client.start() self.status_listener.start() self.master_httpd.start() def stop(self): self.heartbeat_client.stop() self.status_listener.stop() self.master_httpd.stop() def receive_message(self, slave_id, action, message): """ CHANGE ME: This is where you'd implement your application specific functions. You could triggering a change in the master hardware or use self.send_message(...) to trigger actions by the slaves. """ print 'Master received %s: "%s" from slave %s' % (action, message, slave_id) def send_message(self, slave_host, action, message): """Send a message to a host""" params = urllib.urlencode({swarm_settings.ACTION_PARAMETER_NAME:action, swarm_settings.MESSAGE_PARAMETER_NAME:message}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} try: conn = httplib.HTTPConnection('%s:%s' % (slave_host, swarm_settings.SLAVE_WEB_PORT)) conn.request("POST", "/master/message/", params, headers) response = conn.getresponse() response.read() conn.close() return True except: return False def narrowcast_message(self, slave_id, action, message): """Send a message to a single slave""" for slave_info in self.slave_infos: if slave_info[0] == slave_id: return self.send_message(slave_info[1], action, message) return false def broadcast_message(self, action, message): """Send a message to all of the slaves""" for slave_info in self.slave_infos: if not self.send_message(slave_info[1], action, message): print 'Error'