105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from itertools import groupby
 | |
| 
 | |
| 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, InspectionRequest
 | |
| from ostack_validator.common import Issue, MarkedIssue
 | |
| from ostack_validator.model import Openstack
 | |
| 
 | |
| 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.template_filter()
 | |
| def to_label(s):
 | |
|     if s in [Issue.FATAL, Issue.ERROR]:
 | |
|         return 'label-danger'
 | |
|     elif s == Issue.WARNING:
 | |
|         return 'label-warning'
 | |
|     else:
 | |
|         return 'label-info'
 | |
| 
 | |
| 
 | |
| @app.route('/')
 | |
| def index():
 | |
|     return redirect('/validation')
 | |
| 
 | |
| 
 | |
| @app.route('/validation', methods=['GET', 'POST'])
 | |
| def launch_validation():
 | |
|     form = ValidationLaunchForm()
 | |
|     if form.validate_on_submit():
 | |
|         request = InspectionRequest(
 | |
|             form.nodes.data.split(
 | |
|                 ' '),
 | |
|             form.username.data,
 | |
|             private_key=form.private_key.data)
 | |
| 
 | |
|         job = ostack_inspect_task.delay(request)
 | |
| 
 | |
|         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():
 | |
|         r = job.result.request
 | |
| 
 | |
|         form = ValidationLaunchForm()
 | |
|         form.nodes.data = ' '.join(r.nodes)
 | |
|         form.username.data = r.username
 | |
|         form.private_key.data = r.private_key
 | |
| 
 | |
|         openstack = job.result.value
 | |
| 
 | |
|         if isinstance(openstack, Openstack):
 | |
|             issue_source_f = lambda i: i.mark.source if isinstance(
 | |
|                 i, MarkedIssue) else None
 | |
|             source_groupped_issues = groupby(
 | |
|                 sorted(openstack.issues,
 | |
|                        key=issue_source_f),
 | |
|                 key=issue_source_f)
 | |
| 
 | |
|             return (
 | |
|                 render_template(
 | |
|                     'validation_result.html',
 | |
|                     form=form,
 | |
|                     openstack=openstack,
 | |
|                     grouped_issues=source_groupped_issues)
 | |
|             )
 | |
|         else:
 | |
|             return (
 | |
|                 render_template(
 | |
|                     'validation_error.html',
 | |
|                     form=form,
 | |
|                     message=openstack)
 | |
|             )
 | |
|     else:
 | |
|         return render_template('validation_state.html', state=job.state)
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     app.run(host='0.0.0.0', debug=True)
 | 
