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:
sslypushenko 2014-08-21 22:36:40 +03:00
parent b591a58d0f
commit 26eb7fe135
6 changed files with 1 additions and 408 deletions

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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