blob: fd78d0758a22cd79bd7db89b3da82e2ff89138af [file] [log] [blame]
from twisted.internet import defer
from twisted.python import log
from twisted.web import resource, server, error
from slavealloc import exceptions
class TacSlaveResource(resource.Resource):
"dynamically created resource for a particular slave's buildbot.tac"
isLeaf = True
def __init__(self, slave_name):
resource.Resource.__init__(self)
# lowercase the slave name, since some windows systems use the
# uppercase
self.slave_name = slave_name.lower()
def render_GET(self, request):
allocator = request.site.allocator
d = defer.succeed(None)
d.addCallback(lambda _: allocator.getBuildbotTac(self.slave_name))
def handle_success(buildbot_tac):
request.setHeader('content-type', 'text/plain')
request.setHeader('Cache-control', 'no-cache')
request.write(buildbot_tac)
request.finish()
d.addCallback(handle_success)
def handle_noalloc(f):
f.trap(exceptions.NoAllocationError)
request.setResponseCode(404)
request.setHeader('content-type', 'text/plain')
request.setHeader('Cache-control', 'no-cache')
request.write('no allocation available')
request.finish()
d.addErrback(handle_noalloc)
def handle_error(f):
log.err(f, "while handling request for '%s'" % self.slave_name)
request.setResponseCode(500)
request.setHeader('content-type', 'text/plain')
request.setHeader('Cache-control', 'no-cache')
request.write('error processing request: %s' % f.getErrorMessage())
request.finish()
d.addErrback(handle_error)
# render_GET does not know how to wait for a Deferred, so we return
# NOT_DONE_YET which has a similar effect
return server.NOT_DONE_YET
class TacResource(resource.Resource):
"Parent resource for all TacSlaveResources"
addSlash = True
isLeaf = False
def getChild(self, name, request):
if name:
return TacSlaveResource(name)
else:
return error.NoResource()
def makeRootResource():
return TacResource()