def find_vminfo_by_uuid(self, uuid): for configured_worker in self.config['workers']: debug('Check %r'% configured_worker) name = configured_worker['name'] if not name in self.config['var']['vmhostdefinitions']: mlog(" [%s] Configuration error: %s is not a defined guest" %(self.logkey, name)) continue guest = self.config['var']['vmhostdefinitions'][name] if uuid == guest['uuid']: mlog(" [%s] FOUND %s" %(self.logkey, name)) return guest return None
def find_vminfo_by_hwaddr(self, addrlist): for configured_worker in self.config['workers']: debug('Check %r'% configured_worker) name = configured_worker['name'] if not name in self.config['var']['vmhostdefinitions']: mlog(" [%s] Configuration error: %s is not a defined guest" %(self.logkey, name)) continue guest = self.config['var']['vmhostdefinitions'][name] for addr in addrlist: if addr in guest['hwaddr']: mlog(" [%s] FOUND %s" %(self.logkey, name)) return guest return None
def on_request(self, ch, method, props, body): mlog(" [%s] Got request %r:%r" % (self.logkey, method.routing_key, body,)) #announcements from a worker if method.routing_key in ('worker_request_uuid.metal',): self.provide_uuid_for_worker(body) elif method.routing_key in ('worker_alive.metal', 'worker_ping_reply.metal'): self.check_worker(body) #request from hub elif 'ping.metal' == method.routing_key: self.ping_reply() else: mlog(" [%s] Unknown request %r" % (self.logkey, method.routing_key))
def provide_uuid_for_worker(self, body): body = self.jsondecode(body) if body is None: return try: workeraddrlist = body['worker']['hwaddrlist'] except KeyError: warning(" [%s] invalid request" % (self.logkey, )) return mlog(" [%s] check worker %s" % (self.logkey, repr(workeraddrlist))) vminfo = self.find_vminfo_by_hwaddr(workeraddrlist) if vminfo is None: return self.update_found_workers(vminfo['uuid'], {'host-uuid':vminfo['uuid']}) self.update_found_workers(vminfo['uuid'], body['worker']) self.update_guest_config(workeraddrlist[0], {'host-uuid': vminfo['uuid']})
def ping_reply(self, routing_key='metal_ping_reply.hub'): data = {} data['envelope'] = { 'host-uuid': self.config['host-uuid'], 'hostname': self.config['hostname'] } try: data['workers'] = [w for w in self.config['var']['found_workers'].values()] except KeyError: data['workers'] = [] data['metal'] = { 'platform': self.config['var']['identity']['platform'], 'state': self.state } self.send(simplejson.dumps(data), exchange_name = self.exchange_name, routing_key = routing_key, props = { 'content_type': 'application/json' }) mlog(" [%s] Sent %r:%r" % (self.logkey, routing_key, repr(data))) mlog(" [%s] Sent %r" % (self.logkey, routing_key))
def tick(self): mlog(" [%s] tick" % (self.logkey,)) self.announce_self()
def shutdown(self): mlog(" [%s] exiting"% (self.logkey,))