Remove code to trigger test from web ui functionality
Remove depricated code (part 2) We've removed the use cases for both local and official web driven test runs. We remove all the excess web ui for creating new clouds and starting and monitoring test runs. https://storyboard.openstack.org/#!/story/110 Spec: specs/approved/identify-code-to-deprecate.rst Change-Id: I8fdeb5331bb46423c5d018d2fa395ae287f0499b
This commit is contained in:
parent
b591a58d0f
commit
26eb7fe135
@ -1,30 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}Create Cloud{% endblock %}
|
||||
{% block body %}
|
||||
<h2>Create Cloud</h2>
|
||||
<form action="#" method='post'>
|
||||
<dl>
|
||||
<dt>Label:</dt>
|
||||
<dd><input type='text' name='label' size='30' value="{{ request.values.label }}"></dd>
|
||||
<dt>v3 Endpoint:</dt>
|
||||
<dd><input type='text' name='endpoint_v3' size='30' value="{{ request.values.endpoint_v3 }}"></dd>
|
||||
<dt>Non-Admin Keystone Endpoint:</dt>
|
||||
<dd><input type='text' name='endpoint' size='30' value="{{ request.values.endpoint }}"></dd>
|
||||
<dt>Non-Admin Test User:</dt>
|
||||
<dd><input type='text' name='test_user' size='30' value="{{ request.values.test_user }}"></dd>
|
||||
<dt>Alternate Non-Admin Test User:</dt>
|
||||
<dd><input type='text' name='alt_user' size='30' value="{{ request.values.alt_user }}"></dd>
|
||||
<dt>Admin Keystone Endpoint:</dt>
|
||||
<dd><input type='text' name='admin_endpoint' size='30' value="{{ request.values.admin_endpoint }}"></dd>
|
||||
<dt>Admin User:</dt>
|
||||
<dd><input type='text' name='admin_user' size='30' value="{{ request.values.admin_user }}"></dd>
|
||||
<dt>Version:</dt>
|
||||
<dd><input type='text' name='version' size='30' value="{{ request.values.version }}"></dd>
|
||||
</dl>
|
||||
<p>
|
||||
<input type='button' value="Cancel" onclick="location.href='/'">
|
||||
<input type='submit' value="Create">
|
||||
<input type='hidden' name='next' value="{{ next }}">
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
@ -1,30 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}Create Cloud{% endblock %}
|
||||
{% block body %}
|
||||
<h2>Edit Cloud</h2>
|
||||
<form action="" method='post'>
|
||||
<dl>
|
||||
<dt>Label:</dt>
|
||||
<dd><input type='text' name='label' size='30' value="{{ form.label }}"></dd>
|
||||
<dt>v3 Endpoint:</dt>
|
||||
<dd><input type='text' name='endpoint_v3' size='30' value="{{ form.endpoint_v3 }}"></dd>
|
||||
<dt>Non-Admin Keystone Endpoint:</dt>
|
||||
<dd><input type='text' name='endpoint' size='30' value="{{ form.endpoint }}"></dd>
|
||||
<dt>Non-Admin Test User:</dt>
|
||||
<dd><input type='text' name='test_user' size='30' value="{{ form.test_user }}"></dd>
|
||||
<dt>Alternate Non-Admin Test User:</dt>
|
||||
<dd><input type='text' name='alt_user' size='30' value="{{ form.alt_user }}"></dd>
|
||||
<dt>Admin Keystone Endpoint:</dt>
|
||||
<dd><input type='text' name='admin_endpoint' size='30' value="{{ form.admin_endpoint }}"></dd>
|
||||
<dt>Admin User:</dt>
|
||||
<dd><input type='text' name='admin_user' size='30' value="{{ form.admin_user }}"></dd>
|
||||
<dt>Version:</dt>
|
||||
<dd><input type='text' name='version' size='30' value="{{ form.version }}"></dd>
|
||||
</dl>
|
||||
<p>
|
||||
<input type='button' value="Cancel" onclick="location.href='/'">
|
||||
<input type='submit' value="Save">
|
||||
<input type='hidden' name='next' value="{{ next }}">
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
@ -1,65 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}Test Report{% endblock %}
|
||||
{% block body %}
|
||||
<h2>Test Report</h2>
|
||||
|
||||
<table class="table report_text_table">
|
||||
{% if test.cloud %}
|
||||
<tr>
|
||||
<th>Cloud:</th>
|
||||
<td class="blue"> {{ test.cloud.label }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<th>Test ID:</th>
|
||||
<td class="blue"> {{ test.id}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="table report_data_table">
|
||||
<tr>
|
||||
<th>Pass</th>
|
||||
<th>Fail</th>
|
||||
<th>Fail Setup</th>
|
||||
<th>Error</th>
|
||||
<th>Skip</th>
|
||||
<th>Total</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="green">{{ test_result['summary']['PASS'] }}</td>
|
||||
<td class="red">{{ test_result['summary']['FAIL'] }}</td>
|
||||
<td class="red">{{ test_result['summary']['FAIL_SETUP'] }}</td>
|
||||
<td class="red">{{ test_result['summary']['ERROR'] }}</td>
|
||||
<td>{{ test_result['summary']['SKIP'] }}</td>
|
||||
<td class="blue"><b>{{ test_result['summary']['Total'] }}</b></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="table report_data_table">
|
||||
<tr>
|
||||
<th class="left">Testcase</th>
|
||||
<th>Status</th>
|
||||
<th>Elapsed Time</th>
|
||||
</tr>
|
||||
{% for classname, testcases in test_result['data'].items() %}
|
||||
<tr>
|
||||
<td class="report_data_path" colspan=3 style="text-align:left"><b>Test Group:</b> {{ classname }}</td>
|
||||
</tr>
|
||||
{% for testcase in testcases %}
|
||||
<tr>
|
||||
<td style="text-align:left">{{ testcase[0] }}</td>
|
||||
{% if testcase[1] == "PASS" %}
|
||||
<td class="green">{{ testcase[1] }}</td>
|
||||
{% elif testcase[1] == "SKIP" %}
|
||||
<td>{{ testcase[1] }}</td>
|
||||
{% else %}
|
||||
<td class="red">{{ testcase[1] }}</td>
|
||||
{% endif %}
|
||||
<td>{{ testcase[2] }}s</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<input type='button' value="Back" onclick="location.href='{{ next_url }}'">
|
||||
{% endblock %}
|
@ -1,8 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}Test Status{% endblock %}
|
||||
{% block body %}
|
||||
<h2>Test Status</h2>
|
||||
Test ID: {{ test.id }}
|
||||
<br>
|
||||
<input type='button' value="Back" onclick="location.href='{{ next_url }}'">
|
||||
{% endblock %}
|
@ -1,16 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}Test Cloud{% endblock %}
|
||||
{% block body %}
|
||||
<h2>Test Cloud</h2>
|
||||
<form action="" method='post'>
|
||||
<dl>
|
||||
<dt>Test User ({{ names.user }}) Password:</dt>
|
||||
<dd><input type='password' name='pw_user' size='30' value="{{ request.values.pw_user }}"></dd>
|
||||
<dt>Admin User ({{ names.admin }}) Password:</dt>
|
||||
<dd><input type='password' name='pw_admin' size='30' value="{{ request.values.pw_admin }}"></dd>
|
||||
</dl>
|
||||
<p>
|
||||
<input type='button' value="Cancel" onclick="location.href='{{ next_url }}'">
|
||||
<input type='submit' value="Run">
|
||||
</form>
|
||||
{% endblock %}
|
260
refstack/web.py
260
refstack/web.py
@ -16,17 +16,15 @@
|
||||
|
||||
import flask
|
||||
from flask import abort, flash, request, redirect, url_for, \
|
||||
render_template, g, session, make_response
|
||||
render_template, g, session
|
||||
from flask_mail import Mail
|
||||
from refstack import app as base_app
|
||||
from refstack.extensions import db
|
||||
from refstack.extensions import oid
|
||||
from refstack.models import Cloud
|
||||
from refstack.models import Test
|
||||
from refstack.models import TestStatus
|
||||
from refstack.models import User
|
||||
from refstack.models import Vendor
|
||||
from refstack.tools.tempest_tester import TempestTester
|
||||
|
||||
app = base_app.create_app()
|
||||
mail = Mail(app)
|
||||
@ -111,132 +109,6 @@ def create_profile():
|
||||
'create_profile.html', next_url=oid.get_next_url())
|
||||
|
||||
|
||||
@app.route('/delete-cloud/<int:cloud_id>', methods=['GET', 'POST'])
|
||||
def delete_cloud(cloud_id):
|
||||
"""Delete function for clouds."""
|
||||
cloud = Cloud.query.filter_by(id=cloud_id).first()
|
||||
|
||||
if not cloud:
|
||||
flash(u'Not a valid Cloud ID!')
|
||||
elif not cloud.user_id == g.user.id:
|
||||
flash(u"This isn't your cloud!")
|
||||
else:
|
||||
# Delete all the tests associated with the cloud from DB
|
||||
for test in cloud.tests:
|
||||
db.session.delete(test)
|
||||
# Delete the cloud from DB
|
||||
db.session.delete(cloud)
|
||||
db.session.commit()
|
||||
|
||||
return redirect('/')
|
||||
|
||||
|
||||
@app.route('/delete-test/<int:test_id>', methods=['GET', 'POST'])
|
||||
def delete_test(test_id):
|
||||
"""Delete function for tests."""
|
||||
test = Test.query.filter_by(id=test_id).first()
|
||||
|
||||
if not test:
|
||||
flash(u'Not a valid Test ID!')
|
||||
elif not test.cloud.user_id == g.user.id:
|
||||
flash(u"This isn't your test!")
|
||||
else:
|
||||
db.session.delete(test)
|
||||
db.session.commit()
|
||||
|
||||
return redirect('/')
|
||||
|
||||
|
||||
@app.route('/edit-cloud/<int:cloud_id>', methods=['GET', 'POST'])
|
||||
def edit_cloud(cloud_id):
|
||||
cloud = Cloud.query.filter_by(id=cloud_id).first()
|
||||
|
||||
if not cloud:
|
||||
flash(u'Not a valid Cloud ID!')
|
||||
return redirect('/')
|
||||
elif not cloud.user_id == g.user.id:
|
||||
flash(u"This isn't your cloud!")
|
||||
|
||||
if request.method == 'POST':
|
||||
# some validation
|
||||
# todo: do this smarter
|
||||
if not request.form['label']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['endpoint']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['test_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['alt_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['admin_endpoint']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['admin_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
else:
|
||||
cloud.label = request.form['label']
|
||||
cloud.endpoint = request.form['endpoint']
|
||||
cloud.test_user = request.form['test_user']
|
||||
cloud.alt_user = request.form['alt_user']
|
||||
cloud.admin_endpoint = request.form['admin_endpoint']
|
||||
cloud.endpoint_v3 = request.form['endpoint_v3']
|
||||
cloud.version = request.form['version']
|
||||
cloud.admin_user = request.form['admin_user']
|
||||
|
||||
db.session.commit()
|
||||
|
||||
flash(u'Cloud Saved!')
|
||||
return redirect('/')
|
||||
|
||||
form = dict(label=cloud.label,
|
||||
endpoint=cloud.endpoint,
|
||||
endpoint_v3=cloud.endpoint_v3,
|
||||
admin_endpoint=cloud.admin_endpoint,
|
||||
admin_user=cloud.admin_user,
|
||||
version=cloud.version,
|
||||
test_user=cloud.test_user,
|
||||
alt_user=cloud.alt_user)
|
||||
|
||||
return render_template('edit_cloud.html', form=form)
|
||||
|
||||
|
||||
@app.route('/create-cloud', methods=['GET', 'POST'])
|
||||
def create_cloud():
|
||||
"""This is the handler for creating a new cloud."""
|
||||
|
||||
if g.user is None:
|
||||
abort(401)
|
||||
if request.method == 'POST':
|
||||
if not request.form['label']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['endpoint']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['test_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['alt_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['admin_endpoint']:
|
||||
flash(u'Error: All fields are required')
|
||||
elif not request.form['admin_user']:
|
||||
flash(u'Error: All fields are required')
|
||||
else:
|
||||
new_cloud = Cloud()
|
||||
new_cloud.user_id = g.user.id
|
||||
new_cloud.label = request.form['label']
|
||||
new_cloud.endpoint = request.form['endpoint']
|
||||
new_cloud.test_user = request.form['test_user']
|
||||
new_cloud.alt_user = request.form['alt_user']
|
||||
new_cloud.admin_endpoint = request.form['admin_endpoint']
|
||||
new_cloud.endpoint_v3 = request.form['endpoint_v3']
|
||||
new_cloud.version = request.form['version']
|
||||
new_cloud.admin_user = request.form['admin_user']
|
||||
|
||||
db.session.add(new_cloud)
|
||||
db.session.commit()
|
||||
return redirect('/')
|
||||
|
||||
return render_template('create_cloud.html', next_url='/')
|
||||
|
||||
|
||||
@app.route('/profile/edit', methods=['GET', 'POST'])
|
||||
def edit_profile():
|
||||
"""Updates a profile."""
|
||||
@ -282,55 +154,6 @@ def logout():
|
||||
return redirect(oid.get_next_url())
|
||||
|
||||
|
||||
@app.route('/test-cloud/<int:cloud_id>', methods=['GET', 'POST'])
|
||||
def test_cloud(cloud_id):
|
||||
"""Handler for creating a new test."""
|
||||
|
||||
cloud = Cloud.query.filter_by(id=cloud_id).first()
|
||||
|
||||
if not cloud:
|
||||
flash(u'Not a valid Cloud ID!')
|
||||
return redirect('/')
|
||||
elif not cloud.user_id == g.user.id:
|
||||
flash(u"This isn't your cloud!")
|
||||
return redirect('/')
|
||||
|
||||
if request.method == 'POST':
|
||||
|
||||
# Check for required fields
|
||||
REQUIRED_FIELDS = ('pw_admin', 'pw_user')
|
||||
if not all(request.form[field] for field in REQUIRED_FIELDS):
|
||||
flash(u'Error: All fields are required')
|
||||
else:
|
||||
# Create new test object in db
|
||||
new_test = Test()
|
||||
new_test.cloud = cloud
|
||||
new_test.cloud_id = cloud.id
|
||||
db.session.add(new_test)
|
||||
db.session.commit()
|
||||
|
||||
# Construct confJSON with the passwords provided
|
||||
# and using the same user for alt_user
|
||||
pw_admin = request.form['pw_admin']
|
||||
pw_user = request.form['pw_user']
|
||||
pw_alt = request.form['pw_user']
|
||||
json_str = '{"identity":{"password":"%s","admin_password":"%s",\
|
||||
"alt_password":"%s"}}' % (pw_user, pw_admin, pw_alt)
|
||||
|
||||
# Excute the test
|
||||
try:
|
||||
TempestTester(new_test.id).execute_test(json_str)
|
||||
flash(u'Test started!')
|
||||
except ValueError:
|
||||
flash(u'Fail to start test!')
|
||||
|
||||
return redirect('/')
|
||||
|
||||
names = dict(user=cloud.test_user, admin=cloud.admin_user)
|
||||
|
||||
return render_template('test_cloud.html', next_url='/', names=names)
|
||||
|
||||
|
||||
@app.route('/post-result', methods=['POST'])
|
||||
def post_result():
|
||||
"""Receive tempest test result from a remote test runner."""
|
||||
@ -359,84 +182,3 @@ def post_result():
|
||||
|
||||
db.session.commit()
|
||||
return 'thank you', 201
|
||||
|
||||
|
||||
@app.route('/update-test-status/<int:test_id>', methods=['POST'])
|
||||
def update_test_status(test_id):
|
||||
"""updates the test status."""
|
||||
|
||||
test = Test.query.filter_by(id=test_id).first()
|
||||
|
||||
if not test or request.args.get('status', ''):
|
||||
return 'bad request', 400
|
||||
|
||||
message = request.args.get('status', '')
|
||||
status = TestStatus(test_id, message)
|
||||
|
||||
db.session.add(status)
|
||||
db.session.commit()
|
||||
|
||||
return 'thank you', 201
|
||||
|
||||
|
||||
@app.route('/show-status/<int:test_id>', methods=['GET', 'POST'])
|
||||
def show_status(test_id):
|
||||
"""Handler for showing test status."""
|
||||
|
||||
test = Test.query.filter_by(id=test_id).first()
|
||||
|
||||
if not test:
|
||||
flash(u'Not a valid Test ID!')
|
||||
return redirect('/')
|
||||
elif not test.cloud.user_id == g.user.id:
|
||||
flash(u"This isn't your test!")
|
||||
return redirect('/')
|
||||
|
||||
# This is a place holder for now
|
||||
''' TODO: Generate the appropriate status page '''
|
||||
|
||||
return render_template('show_status.html', next_url='/', test=test)
|
||||
|
||||
|
||||
@app.route('/show-report/<int:test_id>', methods=['GET', 'POST'])
|
||||
def show_report(test_id):
|
||||
"""Handler for showing test report."""
|
||||
|
||||
test = Test.query.filter_by(id=test_id).first()
|
||||
|
||||
if not test:
|
||||
flash(u'Not a valid Test ID!')
|
||||
return redirect('/')
|
||||
|
||||
# Users can see report of all tests (including other people's tests)
|
||||
|
||||
test_result = TempestTester(test_id).get_result()
|
||||
if not test_result:
|
||||
flash(u"No test result available!")
|
||||
return redirect('/')
|
||||
|
||||
return render_template('show_report.html', next_url='/', test=test,
|
||||
test_result=test_result)
|
||||
|
||||
|
||||
@app.route('/download-result/<int:test_id>', methods=['GET', 'POST'])
|
||||
def download_result(test_id):
|
||||
"""Handler for downloading test results."""
|
||||
|
||||
test = Test.query.filter_by(id=test_id).first()
|
||||
|
||||
if not test:
|
||||
flash(u'Not a valid Test ID!')
|
||||
return redirect('/')
|
||||
elif not test.cloud.user_id == g.user.id:
|
||||
# Users can only download result of their own tests
|
||||
flash(u"This isn't your test!")
|
||||
return redirect('/')
|
||||
|
||||
# Send back the subunit data stream
|
||||
|
||||
response = make_response(test.subunit)
|
||||
response.headers['Content-Disposition'] = \
|
||||
'attachment; filename=subunit_%s.txt' % (test_id)
|
||||
response.content_type = "text/plain"
|
||||
return response
|
||||
|
Loading…
x
Reference in New Issue
Block a user