Exemple #1
0
def dockerfile(bid):
    """
    Displays the dockerfile contents for the build in question.
    :param bid: Identfies the build object in the database.
    :return: An HTML template rendered with log information, sent periodically from worker nodes.
    """
    if request.method == 'GET':

        fname = 'dockerfile.html'
        if demo_mode:
            fname = 'demo/dockerfile.html'

        bid_short = bid[0:5]
        created = "Unknown"
        description = "Unknown"
        git_url = "Unknown"
        state = "Unknown"
        dockerfile = "<center>This build is waiting for a worker.</center>"
        err = False

        b = models.Build.query.filter_by(bid=bid).first()
        if b is None:
            err = True
        else:
            form = Dockerfile()
            created = formatting.pretty_date(b.created)
            description = b.options['description']
            git_url = b.options['url']
            state = b.state
            if b.dockerfile is not None:
                dockerfile = b.dockerfile
                form.dockerfile.data = dockerfile
            port_data = json.dumps(b.options['ports'])
        return render_template(fname,
                               title='Chorus - Logs',
                               ports=port_data,
                               form=form,
                               bid=bid,
                               bid_short=bid_short,
                               created=created,
                               description=description,
                               git_url=git_url,
                               state=state,
                               err=False)
    elif request.method == 'POST':
        b = models.Build.query.filter_by(bid=bid).first()
        if b is None or b.state not in ['Stopped', 'Failed']:
            return make_response(redirect('/queue'))
        else:
            form = Dockerfile(request.form)
            if form.validate():
                options = dict(b.options)
                options['bid'] = str(uuid.uuid4())
                options['timeout'] = app.config['BUILD_TIMEOUT']
                options['dockerfile_content'] = form.dockerfile.data

                # Insert build into db
                db.session.commit()
                q.schedule(options)
            return make_response(redirect('/queue'))
Exemple #2
0
def ajax_queue(taskid):
    """
    This route is an ajax call from the /queue page that populates a table via javascript.
    :param taskid: The TaskID of the celery task started in '/queue'
    :return: A json object that can be used to create a table on the client side HTML.
    """
    State.hosts = {}
    try:
        ret_value = list(State.tasks[taskid].get(timeout=TIMEOUT))
        parsed = []
        for i in ret_value:
            q.update_state(i, parsed)
    except Exception as e:
        app.logger.error(str(e))
        pass
    results = []
    records = list(models.Build.query.filter_by().order_by(models.Build.created).all())
    db.session.commit()
    for b in records:
        s = dict()
        s['created'] = formatting.pretty_date(b.created)
        s['id'] = b.bid
        s['description'] = b.options['description']
        s['url'] = b.options['url']
        s['state'] = b.state
        results.append(s)
    results.reverse()
    return jsonify(builds=results)
Exemple #3
0
def logs(bid):
    """
    Displays the log contents for the build in question.
    :param bid: Identfies the build object in the database.
    :return: An HTML template rendered with log information, sent periodically from worker nodes.
    """
    bid_short = bid[0:5]
    created = "Unknown"
    description = "Unknown"
    git_url = "Unknown"
    state = "Unknown"
    logdata = "<center>This build is waiting for a worker.</center>"
    err = False

    b = models.Build.query.filter_by(bid=bid).first()
    if b is None:
        err = True
    else:
        created = formatting.pretty_date(b.created)
        description = b.options['description']
        git_url = b.options['url']
        state = b.state
        if b.log is not None:
            logdata = b.log.replace('\n\n', '\n').replace('\n', '<br>')
        if b.dockerfile is not None:
            dockerfile_available = True
        else:
            dockerfile_available = False
        port_data = json.dumps(b.options['ports'])
    return render_template('logs.html',
                           title='Chorus - Logs',
                           bid=bid,
                           ports=port_data,
                           bid_short=bid_short,
                           created=created,
                           description=description,
                           git_url=git_url,
                           state=state,
                           logdata=logdata,
                           dockerfile_available=dockerfile_available,
                           err=False)