예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
 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))
예제 #4
0
 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']})
예제 #5
0
 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))
예제 #6
0
 def tick(self):
     mlog(" [%s] tick" % (self.logkey,))
     self.announce_self()
예제 #7
0
 def shutdown(self):
     mlog(" [%s] exiting"% (self.logkey,))