def status(): """ The /status handler. Return the status of existing builds. Requires secret_key parameter in query. """ secret_key = request.values.get('secret_key', '') if check_secret_key(secret_key): builds = app.config["BUILDS"] res = "<status>\n" for h, b in builds.items(): if b.status is not None: res += ( "<build hash='%s' status='%s' since='%s' accessed='%s' accessed-secs-ago='%s'/>\n" % (h, Status.lookup[b.status], pretty_epoch_time(b.status_change_time), pretty_epoch_time(b.accessed_time), round(time.time() - b.accessed_time, 1))) res += "</status>\n" else: res = "<error>Failed to show status: secret key could not be confirmed.</error>\n" return Response(res, mimetype='application/xml', content_type='application/xml; charset=utf-8')
def status(builds): """ Status of builds """ res = "<status>\n" for h, b in builds.iteritems(): if b.status is not None: res += ("<build hash='%s' status='%s' since='%s' accessed='%s' accessed-secs-ago='%s'/>\n" % (h, Status.lookup[b.status], pretty_epoch_time(b.status_change_time), pretty_epoch_time(b.accessed_time), round(time.time() - b.accessed_time,1))) res += "</status>\n" return [res]
def build(builds, original_text, settings, incremental, fmt, files=None): """ Start a build for this corpus. If it is already running, join it. Messages from the build are received on a queue. """ if not files: build = Build(original_text, settings) else: build = Build(original_text, settings, files=files) # Start build or listen to existing build if build.build_hash not in builds: builds[build.build_hash] = build build.make_files() t = Thread(target=Build.run, args=[build, fmt]) t.start() # elif builds[build.build_hash].status == (Status.Error or Status.ParseError): # log.info("Errorneous build found! Retrying...") # t = Thread(target=Build.run, args=[build, fmt]) # t.start() else: build = builds[build.build_hash] log.info( "Joining existing build (%s) which started at %s" % (build.build_hash, pretty_epoch_time(build.status_change_time))) if files: return join_build(build, incremental, fileupload=True) else: return join_build(build, incremental)
def join_build(build, incremental): """ Joins an existing build, and sends increment messages until it is completed, then sends the build's result. """ # Make a new queue which receives messages from the builder process queue = Queue() build.queues.append(queue) def get_result(): assert(finished(build.status)) build.access() return build.result() + '</result>\n' # Send this build's hash yield "<build hash='%s'/>\n" % build.build_hash # Result already exists if finished(build.status): log.info("Result already exists since %s" % pretty_epoch_time(build.status_change_time)) yield get_result() # Listen for completion else: if incremental and build.status == Status.Running: log.info("Already running, sending increment message") yield build.increment_msg() while True: msg_type, msg = queue.get() if msg_type == Message.StatusChange: log.info("Message %s" % Status.lookup[msg]) # Has status changed to finished? if msg_type == Message.StatusChange: if finished(msg): break # Increment message elif incremental and msg_type == Message.Increment: yield msg log.info("Getting result...") yield get_result()
def build(builds, original_text, settings, incremental, fmt): """ Starts a build for this corpus. If it is already running, joins it. Messages from the build is received on a queue. """ build = Build(original_text, settings) # Start build or listen to existing build if build.build_hash not in builds: log.info("Starting a new build") builds[build.build_hash] = build build.make_files() t = Thread(target=Build.run, args=[build, fmt]) t.start() else: build = builds[build.build_hash] log.info("Joining existing build which started at %s" % pretty_epoch_time(build.status_change_time)) return join_build(build, incremental)
def join_build(build, incremental, fileupload=False): """ Join an existing build, and send increment messages until it is completed. Then send the build's result or the link to the downloadable zip file. """ # Make a new queue which receives messages from the builder process queue = Queue() build.queues.append(queue) def get_result(): assert (finished(build.status)) build.access() try: return build.result() + '</result>\n' except Exception as error: log.error("Error while getting result: %s" % str(error)) return "<error>%s\n</error>\n</result>\n" % ERROR_MSG["no_result"] # Send this build's hash if fileupload: yield "<build hash='%s' type='files'/>\n" % build.build_hash, build else: yield "<build hash='%s'/>\n" % build.build_hash # Result already exists if finished(build.status): log.info("Result already exists since %s" % pretty_epoch_time(build.status_change_time)) if fileupload: yield get_result(), build else: yield get_result() # Listen for completion else: if incremental and build.status == Status.Running: log.info("Already running, sending increment message") if fileupload: yield build.increment_msg(), build else: yield build.increment_msg() while True: msg_type, msg = queue.get() if msg_type == Message.StatusChange: log.info("Message %s" % Status.lookup[msg]) # Has status changed to finished? if msg_type == Message.StatusChange: if finished(msg): break # Increment message elif incremental and msg_type == Message.Increment: if fileupload: yield msg, build else: yield msg log.info("Getting result...") if fileupload: yield get_result(), build else: yield get_result()