Example #1
0
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')
Example #2
0
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]
Example #3
0
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)
Example #4
0
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()
Example #5
0
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)
Example #6
0
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()