def __prepare(self): self.log.debug("initiating preparation") # create the spool directory self.__spool = self.__createSpool() # create the instance self.__inst = InstanceManager.getInstance().newInstance(self.__spool) self.__inst.task = self from xbe.xbed.task_activities import SetUpActivity, AcquireResourceActivity from xbe.util.activity import ComplexActivity, ThreadedActivity mac_pool = XBEDaemon.getInstance().macAddresses jail_package = XBEDaemon.getInstance().opts.jail_package mac_acquirer = ThreadedActivity( AcquireResourceActivity(mac_pool)) setup_activity = ThreadedActivity( SetUpActivity(self.__spool, jail_package), (self.__jsdl_doc, self.__activity_logs["stage-in"])) complex_activity = ComplexActivity([setup_activity, mac_acquirer]) self.mgr.registerActivity(self, complex_activity, on_finish=self._cb_stage_in_succeed, on_fail=self._eb_stage_in_failed, on_abort=None)
def logStateChange(self, task, state): stateMap = { "Pending:Reserved" : 1, "Pending:Confirmed" : 1, "Running:Stage-In" : 64, "Running:Instance-Starting" : 2, "Running:Executing" : 2, "Running:Stage-Out" : 128, "Running:Instance-Stopping" : 128, "Finished" : 8, "Failed" : 4, "Terminated" : 4 } XBEDaemon.getInstance().protocolfactory.brokerJobState(task.ticket_id(), task.id(), state, stateMap[state]) try: log.info("state of task changed: %s -> %s", task.id(), state) # calana extension self.mtx.acquire() exitcode = 0 if hasattr(task, "exitcode"): exitcode = task.exitcode self.taskStateLog.write("%s;%d;%s;%d;%d\n" % ("001", int(time.time()), task.ticket_id(), stateMap[state], exitcode )) self.taskStateLog.flush() finally: self.mtx.release()
def write_networking(self): print >>self.out, "# Networking configuration" bridge = self.config.getBridge() or "xenbr0" if self.config.getMac(): vif = [ "mac=%s, bridge=%s" % (self.config.getMac(), bridge) ] else: vif = [ 'bridge=%s' % bridge ] self._write_helper("vif", vif) if self.config.getIP(): gw = XBEDaemon.getInstance().opts.network_gateway dns = XBEDaemon.getInstance().opts.network_nameserver or gw nm = XBEDaemon.getInstance().opts.network_netmask or "255.255.255.0" self._write_helper("ip", "%s:%s:%s:%s" % (self.config.getIP(), dns, gw, nm))
def __configureInstance(self, inst, jsdl): # set the uri through which i am reachable inst.config().addToKernelCommandLine(XBE_SERVER="%s" % ( XBEDaemon.getInstance().opts.uri )) inst.config().addToKernelCommandLine(XBE_UUID="%s" % ( inst.id() )) # new environment variables # inst.config().addToKernelCommandLine(XBE_BROKER="%s" % ( # XBEDaemon.getInstance().broker # )) # inst.config().addToKernelCommandLine(XBE_DAEMON="%s" % ( # XBEDaemon.getInstance().qname # )) # inst.config().addToKernelCommandLine(XBE_INSTID="%s" % ( # inst.id() # )) try: ncpus = int(jsdl.lookup_path("JobDefinition/JobDescription/Resources/"+ "TotalCPUCount").get_value()) except Exception, e: ncpus = 1 self.log.debug("using default number of cpus: %d", ncpus)
def __transform_cache_uri_hack(self, uri): # XXX: this is a hack, please, think about a better way! xbed = XBEDaemon.getInstance() if not hasattr(xbed, "cache") or xbed.cache is None: raise ValueError("could not transform uri, no cache", uri) cache_id = uri.split("/")[-1] log.debug("looking up cache-id %s", cache_id) import threading from twisted.python import failure from twisted.internet import defer cv = threading.Condition() def notify(result): cv.acquire() cv.notifyAll() self.__result = result cv.release() d = xbed.cache.lookupByUUID(cache_id) d.addBoth(notify) try: cv.acquire() while not d.called: cv.wait(1) finally: cv.release() result = self.__result del self.__result if isinstance(result, failure.Failure): result.raiseException() return result
def _cb_assign_mac_ip_to_inst(self, mac_ip): inst = self.__inst self.log.debug( "assigning mac '%s' with IP '%s' on Bridge '%s' to instance: %s" % (mac_ip[0], mac_ip[1], XBEDaemon.getInstance().opts.xen_bridge, inst.id())) inst.config().setMac(mac_ip[0]) inst.config().setBridge(XBEDaemon.getInstance().opts.xen_bridge) inst.config().setIP(mac_ip[1]) inst.ip = mac_ip[1]
def do_CacheFile(self, elem, *a, **kw): msg = message.MessageBuilder.from_xml(elem.getroottree()) log.debug("caching file: %s", msg.uri()) cached = XBEDaemon.getInstance().cache d = cached.cache(msg.uri(), msg.type_of_file(), msg.description()) def _success(uid): return message.Error(errcode.OK, uid) def _failure(reason): return message.Error(errcode.CACHING_FAILED, reason.getErrorMessage()) d.addCallback(_success).addErrback(_failure).addCallback(self.sendMessage)
def do_CacheRemove(self, elem, *a, **kw): msg = message.MessageBuilder.from_xml(elem.getroottree()) log.debug("removing cache entry: %s", msg.uri()) cached = XBEDaemon.getInstance().cache d = cached.remove(msg.uri()) def _success(uid): return message.Error(errcode.OK, uid) def _failure(reason): return message.Error(errcode.INTERNAL_SERVER_ERROR, reason.getErrorMessage()) d.addCallback(_success).addErrback(_failure).addCallback(self.sendMessage)
def write_disks(self): print >>self.out, "# Disk device(s)" # root self._write_helper("root", "/dev/"+self.config.getDisks()[0]["target"] + " ro") # all disks disks = [] disk_proto = XBEDaemon.getInstance().opts.disk_proto or "file" for disk in self.config.getDisks(): disk["proto"] = disk_proto disks.append( "%(proto)s:%(path)s,%(target)s,w" % disk ) self._write_helper("disk", disks)
def __transform_cache_uri_hack(self, uri): # XXX: this is a hack, please, think about a better way! try: xbed = XBEDaemon.getInstance() if not hasattr(xbed, "cache") or xbed.cache is None: raise ValueError("could not transform uri, no cache", uri) cache_id = uri.split("/")[-1] log.debug("looking up cache-id %s" % cache_id) from twisted.internet import defer cache_uri = defer.waitForDeferred( xbed.cache.lookupByUUID(cache_id)).getResult() return cache_uri except Exception, e: log.warn("could not look up cache entry", e) raise
def _cb_release_resources(self): self.log.info("releasing acquired resources") mac_ip = (self.__inst.config().getMac(), self.__inst.ip) XBEDaemon.getInstance().macAddresses.release(mac_ip) self.__delete_instance() log.info("resources released")
def certificateChecker(self, certificate): return XBEDaemon.getInstance().userDatabase.check_x509(certificate)
#return message.Error(errcode.OK, "termination in progress") #else: # return message.Error(errcode.TICKET_INVALID, request.ticket()) def do_ConfirmReservation(self, elem, *args, **kw): log.debug("=============== XenBEEClient2BrokerProtocol::do_ConfirmReservation") try: confirm = message.MessageBuilder.from_xml(elem.getroottree()) except Exception, e: return message.BrokerError(confirm.uuid(), errcode.ILLEGAL_REQUEST, str(e)) ticket = TicketStore.getInstance().lookup(confirm.ticket()) if ticket is None: return message.BrokerError(confirm.uuid(), errcode.TICKET_INVALID, confirm.ticket()) log.debug("got confirmation with ticket %s" % confirm.ticket()) xbed = XBEDaemon.getInstance() jsdl_doc = jsdl.JsdlDocument(schema_map=xbed.schema_map) try: if hasattr(etree, 'clearErrorLog'): etree.clearErrorLog() if hasattr(etree, 'clear_error_log'): etree.clear_error_log() parsed_jsdl = jsdl_doc.parse(confirm.jsdl()) except etree.DocumentInvalid, e: log.info("got invalid document: %s" % str(e.error_log)) # TaskManager.getInstance().removeTask(ticket.task) # del ticket.task # TicketStore.getInstance().release(ticket) return message.BrokerError(confirm.uuid(), errcode.ILLEGAL_REQUEST, "JSDL document is invalid: %s" % (e.error_log,)) try: # does the job have our InstanceDescription element? # otherwise drop the job