Added webui and celery background jobs
This commit is contained in:
parent
ce1ba76593
commit
a3b34632bc
4
Procfile
Normal file
4
Procfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
webui: gunicorn --error-logfile - --log-level info ostack_validator.webui:app
|
||||||
|
redis: redis-server
|
||||||
|
worker: celery worker --app=ostack_validator.celery:app
|
||||||
|
|
15
Vagrantfile
vendored
Normal file
15
Vagrantfile
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# -*- mode: ruby -*-
|
||||||
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
|
Vagrant::Config.run do |config|
|
||||||
|
config.vm.box = "ubuntu12.04-server-amd64"
|
||||||
|
# config.vm.box_url = "http://domain.com/path/to/above.box"
|
||||||
|
|
||||||
|
# config.vm.forward_port 80, 8080
|
||||||
|
config.vm.forward_port 5000, 5000
|
||||||
|
|
||||||
|
config.vm.provision :chef_solo do |chef|
|
||||||
|
chef.cookbooks_path = ["vagrant/cookbooks"]
|
||||||
|
chef.add_recipe "openstack-validator"
|
||||||
|
end
|
||||||
|
end
|
22
ostack_validator/celery.py
Normal file
22
ostack_validator/celery.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
from celery import Celery
|
||||||
|
|
||||||
|
broker_url = os.getenv('CELERY_BROKER_URL', 'redis://localhost:6379/0')
|
||||||
|
backend_url = os.getenv('CELERY_RESULT_BACKEND', broker_url)
|
||||||
|
|
||||||
|
app = Celery('ostack_validator', broker=broker_url, backend=backend_url)
|
||||||
|
app.conf.update(
|
||||||
|
CELERY_TRACK_STARTED=True
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.task
|
||||||
|
def ostack_inspect_task(nodes, username, password=None, private_key=None):
|
||||||
|
time.sleep(10)
|
||||||
|
return username[::-1]
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.start()
|
||||||
|
|
13
ostack_validator/templates/validation_form.html
Normal file
13
ostack_validator/templates/validation_form.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{% extends "bootstrap/base.html" %}
|
||||||
|
{% import "bootstrap/wtf.html" as wtf %}
|
||||||
|
|
||||||
|
{% block title %}OpenStack Validator{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<h1>OpenStack Validator</h1>
|
||||||
|
{{ wtf.quick_form(form, action='/validation', method='POST', button_map={'launch': 'primary'}) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
53
ostack_validator/webui.py
Normal file
53
ostack_validator/webui.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from flask import Flask, request, redirect, render_template, json
|
||||||
|
from flask_bootstrap import Bootstrap
|
||||||
|
from flask_wtf import Form
|
||||||
|
from wtforms import StringField, TextAreaField, SubmitField
|
||||||
|
from wtforms.validators import DataRequired
|
||||||
|
|
||||||
|
from ostack_validator.celery import app as celery, ostack_inspect_task
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
Bootstrap(app)
|
||||||
|
app.debug = True
|
||||||
|
app.config.update(
|
||||||
|
WTF_CSRF_SECRET_KEY = 'foo bar baz'
|
||||||
|
)
|
||||||
|
app.secret_key = 'A0Zr98j/3fooN]LWX/,?RT'
|
||||||
|
|
||||||
|
|
||||||
|
class ValidationLaunchForm(Form):
|
||||||
|
nodes = StringField('Nodes', validators=[DataRequired()])
|
||||||
|
username = StringField('Username', default='root', validators=[DataRequired()])
|
||||||
|
private_key = TextAreaField('Private Key', validators=[DataRequired()])
|
||||||
|
|
||||||
|
launch = SubmitField('Launch validation')
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return redirect('/validation')
|
||||||
|
|
||||||
|
@app.route('/validation', methods=['GET', 'POST'])
|
||||||
|
def launch_validation():
|
||||||
|
form = ValidationLaunchForm()
|
||||||
|
if form.validate_on_submit():
|
||||||
|
nodes = form.nodes.data.split(' ')
|
||||||
|
username = form.username.data
|
||||||
|
private_key = form.private_key.data
|
||||||
|
|
||||||
|
job = ostack_inspect_task.delay(nodes=nodes, username=username, private_key=private_key)
|
||||||
|
|
||||||
|
return redirect('/validation/%s' % job.id)
|
||||||
|
else:
|
||||||
|
return render_template('validation_form.html', form=form)
|
||||||
|
|
||||||
|
@app.route('/validation/<id>')
|
||||||
|
def job(id):
|
||||||
|
job = celery.AsyncResult(id)
|
||||||
|
if job.ready():
|
||||||
|
return 'Result is %s' % job.result
|
||||||
|
else:
|
||||||
|
return 'State is %s' % job.state
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host='0.0.0.0', debug=True)
|
||||||
|
|
8
requirements.txt
Normal file
8
requirements.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
spur==0.3.5
|
||||||
|
Flask==0.10.1
|
||||||
|
Flask-Bootstrap>=3.0.0
|
||||||
|
Flask-WTF==0.9.2
|
||||||
|
gunicorn==18.0
|
||||||
|
celery-with-redis>=3.0
|
||||||
|
# Jinja2==2.7.1
|
||||||
|
|
8
vagrant/cookbooks/openstack-validator/recipes/default.rb
Normal file
8
vagrant/cookbooks/openstack-validator/recipes/default.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package 'redis-server'
|
||||||
|
package 'python-pip'
|
||||||
|
|
||||||
|
bash 'Install python dependencies' do
|
||||||
|
code 'pip install -r requirements.txt'
|
||||||
|
cwd '/vagrant'
|
||||||
|
end
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user