コード例 #1
0
ファイル: task.py プロジェクト: BackupTheBerlios/xenbee-svn
    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)
コード例 #2
0
ファイル: task.py プロジェクト: BackupTheBerlios/xenbee-svn
 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()	
コード例 #3
0
ファイル: xen.py プロジェクト: BackupTheBerlios/xenbee-svn
 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))
コード例 #4
0
ファイル: task.py プロジェクト: BackupTheBerlios/xenbee-svn
    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)
コード例 #5
0
    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
コード例 #6
0
ファイル: task.py プロジェクト: BackupTheBerlios/xenbee-svn
 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]
コード例 #7
0
ファイル: proto.py プロジェクト: BackupTheBerlios/xenbee-svn
    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)
コード例 #8
0
ファイル: proto.py プロジェクト: BackupTheBerlios/xenbee-svn
    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)
コード例 #9
0
ファイル: xen.py プロジェクト: BackupTheBerlios/xenbee-svn
    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)
コード例 #10
0
    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
コード例 #11
0
ファイル: task.py プロジェクト: BackupTheBerlios/xenbee-svn
 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")
コード例 #12
0
ファイル: proto.py プロジェクト: BackupTheBerlios/xenbee-svn
 def certificateChecker(self, certificate):
     return XBEDaemon.getInstance().userDatabase.check_x509(certificate)
コード例 #13
0
ファイル: proto.py プロジェクト: BackupTheBerlios/xenbee-svn
                #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