[LNT] r242149 - Revert "Start adding a simple REST API to LNT"
Renato Golin
renato.golin at linaro.org
Tue Jul 14 07:47:26 PDT 2015
Author: rengolin
Date: Tue Jul 14 09:47:26 2015
New Revision: 242149
URL: http://llvm.org/viewvc/llvm-project?rev=242149&view=rev
Log:
Revert "Start adding a simple REST API to LNT"
This reverts commit r242070, as it was breaking the LNT builds.
Removed:
lnt/trunk/lnt/server/ui/api.py
lnt/trunk/tests/server/ui/test_api.py
Modified:
lnt/trunk/lnt/server/ui/app.py
lnt/trunk/setup.py
lnt/trunk/tests/server/ui/V4Pages.py
Removed: lnt/trunk/lnt/server/ui/api.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/api.py?rev=242148&view=auto
==============================================================================
--- lnt/trunk/lnt/server/ui/api.py (original)
+++ lnt/trunk/lnt/server/ui/api.py (removed)
@@ -1,161 +0,0 @@
-from flask import current_app, g
-from flask import request
-from sqlalchemy.orm.exc import NoResultFound
-from flask_restful import Resource, reqparse, fields, marshal_with, abort
-
-parser = reqparse.RequestParser()
-parser.add_argument('db', type=str)
-
-
-def in_db(func):
- """Extract the database information off the request and attach to
- particular test suite and database."""
- def wrap(*args, **kwargs):
- db = kwargs.pop('db')
- ts = kwargs.pop('ts')
- g.db_name = db
- g.testsuite_name = ts
- g.db_info = current_app.old_config.databases.get(g.db_name)
- if g.db_info is None:
- abort(404, message="Invalid database.")
- # Compute result.
- result = func(*args, **kwargs)
-
- # Make sure that any transactions begun by this request are finished.
- request.get_db().rollback()
- return result
- return wrap
-
-
-def ts_path(path):
- """Make a URL path with a database and test suite embedded in them."""
- return "/api/db_<string:db>/v4/<string:ts>/" + path
-
-
-def with_ts(obj):
- """For Url type fields to work, the objects we return must have a test-suite
- and database attribute set, the function attempts to set them."""
- if type(obj) == list:
- # For lists, set them on all elements.
- return [with_ts(x) for x in obj]
- if type(obj) == dict:
- # If already a dict, just add the fields.
- new_obj = obj
- else:
- # Sqlalcamey objects are read-only and store their attributes in a
- # sub-dict. Make a copy so we can edit it.
- new_obj = obj.__dict__.copy()
-
- new_obj['db'] = g.db_name
- new_obj['ts'] = g.testsuite_name
- return new_obj
-
-
-# This date format is what the JavaScript in the LNT frontend likes.
-DATE_FORMAT = "iso8601"
-
-
-machines_fields = {
- 'id': fields.Integer,
- 'name': fields.String,
- 'os': fields.String,
- 'hardware': fields.String,
-}
-
-
-class Machines(Resource):
- """List all the machines and give summary information."""
- method_decorators = [in_db]
-
- @marshal_with(machines_fields)
- def get(self):
- ts = request.get_testsuite()
- changes = ts.query(ts.Machine).all()
- return changes
-
-
-machine_fields = {
- 'id': fields.Integer,
- 'name': fields.String,
- 'os': fields.String,
- 'hardware': fields.String,
- 'runs': fields.List(fields.Url('runs')),
-}
-
-
-class Machine(Resource):
- """Detailed results about a particular machine, including runs on it."""
- method_decorators = [in_db]
-
- @marshal_with(machine_fields)
- def get(self, machine_id):
-
- ts = request.get_testsuite()
- try:
- machine = ts.query(ts.Machine).filter(
- ts.Machine.id == machine_id).one()
- except NoResultFound:
- abort(404, message="Invalid machine.")
-
- machine = with_ts(machine)
- machine_runs = ts.query(ts.Run.id).join(ts.Machine).filter(
- ts.Machine.id == machine_id).all()
-
- machine['runs'] = with_ts([dict(run_id=x[0]) for x in machine_runs])
- print machine['runs']
- return machine
-
-
-run_fields = {
- 'id': fields.Integer,
- 'start_time': fields.DateTime(dt_format=DATE_FORMAT),
- 'end_time': fields.DateTime(dt_format=DATE_FORMAT),
- 'machine_id': fields.Integer,
- 'machine': fields.Url("machine"),
- 'order_id': fields.Integer,
- 'order': fields.Url("order"),
-}
-
-
-class Runs(Resource):
- method_decorators = [in_db]
-
- @marshal_with(run_fields)
- def get(self, run_id):
- ts = request.get_testsuite()
- try:
- changes = ts.query(ts.Run).join(ts.Machine).filter(
- ts.Run.id == run_id).one()
- except NoResultFound:
- abort(404, message="Invalid run.")
-
- changes = with_ts(changes)
- return changes
-
-
-order_fields = {
- 'id': fields.Integer,
- 'llvm_project_revision': fields.String,
- 'next_order_id': fields.Integer,
- 'previous_order_id': fields.Integer,
-}
-
-
-class Order(Resource):
- method_decorators = [in_db]
-
- @marshal_with(order_fields)
- def get(self, order_id):
- ts = request.get_testsuite()
- try:
- changes = ts.query(ts.Order).filter(ts.Order.id == order_id).one()
- except NoResultFound:
- abort(404, message="Invalid order.")
- return changes
-
-
-def load_api_resources(api):
- api.add_resource(Machines, ts_path("machines"))
- api.add_resource(Machine, ts_path("machine/<int:machine_id>"))
- api.add_resource(Runs, ts_path("run/<int:run_id>"))
- api.add_resource(Order, ts_path("order/<int:order_id>"))
Modified: lnt/trunk/lnt/server/ui/app.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/app.py?rev=242149&r1=242148&r2=242149&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/app.py (original)
+++ lnt/trunk/lnt/server/ui/app.py Tue Jul 14 09:47:26 2015
@@ -10,8 +10,6 @@ import flask
from flask import current_app
from flask import g
from flask import url_for
-from flask import Flask
-from flask_restful import Resource, Api
import lnt
import lnt.server.db.v4db
@@ -19,8 +17,6 @@ import lnt.server.instance
import lnt.server.ui.filters
import lnt.server.ui.globals
import lnt.server.ui.views
-from lnt.server.ui.api import load_api_resources
-
class RootSlashPatchMiddleware(object):
def __init__(self, app):
@@ -102,11 +98,7 @@ class App(flask.Flask):
# Load the application routes.
app.register_module(lnt.server.ui.views.frontend)
-
- # Load the flaskRESTful API.
- app.api = Api(app)
- load_api_resources(app.api)
-
+
return app
@staticmethod
Modified: lnt/trunk/setup.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/setup.py?rev=242149&r1=242148&r2=242149&view=diff
==============================================================================
--- lnt/trunk/setup.py (original)
+++ lnt/trunk/setup.py Tue Jul 14 09:47:26 2015
@@ -90,5 +90,5 @@ http://llvm.org/svn/llvm-project/lnt/tru
'lnt = lnt.lnttool:main',
],
},
- install_requires=['SQLAlchemy', 'Flask', 'flask-restful'],
+ install_requires=['SQLAlchemy', 'Flask'],
)
Modified: lnt/trunk/tests/server/ui/V4Pages.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/tests/server/ui/V4Pages.py?rev=242149&r1=242148&r2=242149&view=diff
==============================================================================
--- lnt/trunk/tests/server/ui/V4Pages.py (original)
+++ lnt/trunk/tests/server/ui/V4Pages.py Tue Jul 14 09:47:26 2015
@@ -15,26 +15,16 @@ from htmlentitydefs import name2codepoin
import lnt.server.db.migrate
import lnt.server.ui.app
-import json
logging.basicConfig(level=logging.DEBUG)
-def check_code(client, url, expected_code=200, data_to_send=None):
- """Call a flask url, and make sure the return code is good."""
- resp = client.get(url, follow_redirects=False, data=data_to_send)
+def check_code(client, url, expected_code=200):
+ resp = client.get(url, follow_redirects=False)
assert resp.status_code == expected_code, \
"Call to %s returned: %d, not the expected %d"%(url, resp.status_code, expected_code)
return resp
-
-def check_json(client, url, expected_code=200, data_to_send=None):
- """Call a flask url, make sure the return code is good,
- and grab reply data from the json payload."""
- return json.loads(check_code(client, url, expected_code,
- data_to_send=data_to_send).data)
-
-
def check_redirect(client, url, expected_redirect_regex):
resp = client.get(url, follow_redirects=False)
assert resp.status_code == 302, \
Removed: lnt/trunk/tests/server/ui/test_api.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/tests/server/ui/test_api.py?rev=242148&view=auto
==============================================================================
--- lnt/trunk/tests/server/ui/test_api.py (original)
+++ lnt/trunk/tests/server/ui/test_api.py (removed)
@@ -1,100 +0,0 @@
-# Check that the LNT REST JSON API is working.
-# create temporary instance
-# RUN: rm -rf %t.instance
-# RUN: python %{shared_inputs}/create_temp_instance.py \
-# RUN: %{shared_inputs}/SmallInstance \
-# RUN: %t.instance %S/Inputs/V4Pages_extra_records.sql
-#
-# RUN: python %s %t.instance
-
-import unittest
-import logging
-import sys
-
-import lnt.server.db.migrate
-import lnt.server.ui.app
-
-from V4Pages import check_json
-logging.basicConfig(level=logging.DEBUG)
-
-machines_expected_response = [{u'hardware': u'x86_64',
- u'os': u'Darwin 11.3.0',
- u'id': 1,
- u'name': u'localhost__clang_DEV__x86_64'},
- {u'hardware': u'AArch64',
- u'os': u'linux',
- u'id': 2,
- u'name': u'machine2'},
- {u'hardware': u'AArch64',
- u'os': u'linux',
- u'id': 3,
- u'name': u'machine3'}]
-
-# Machine add some extra fields, so add them.
-machine_expected_response = list(machines_expected_response)
-machine_expected_response[0] = machines_expected_response[0].copy()
-machine_expected_response[0][u'runs'] = [u'/api/db_default/v4/nts/run/1',
- u'/api/db_default/v4/nts/run/2']
-
-machine_expected_response[1] = machines_expected_response[1].copy()
-machine_expected_response[1][u'runs'] = [u'/api/db_default/v4/nts/run/3']
-
-machine_expected_response[2] = machines_expected_response[2].copy()
-machine_expected_response[2][u'runs'] = [u'/api/db_default/v4/nts/run/4']
-
-
-run_expected_response = [{u'end_time': u'2012-04-11T16:28:58',
- u'id': 1,
- u'machine_id': 1,
- u'machine': u'/api/db_default/v4/nts/machine/1',
- u'order_id': 3,
- u'order': u'/api/db_default/v4/nts/order/3',
- u'start_time': u'2012-04-11T16:28:23'}]
-
-order_expected_response = {u'id': 3,
- u'llvm_project_revision': "154331",
- u'next_order_id': 0,
- u'previous_order_id': 4}
-
-
-class JSONAPITester(unittest.TestCase):
- """Test the REST api."""
-
- def setUp(self):
- """Bind to the LNT test instance."""
- _, instance_path = sys.argv
- app = lnt.server.ui.app.App.create_standalone(instance_path)
- app.testing = True
- self.client = app.test_client()
-
- def test_machine_api(self):
- """Check /machines and /machine/n return expected results from
- testdb.
- """
- client = self.client
- j = check_json(client, 'api/db_default/v4/nts/machines')
- self.assertEquals(j, machines_expected_response)
- for i in xrange(0, len(machine_expected_response)):
- j = check_json(client, 'api/db_default/v4/nts/machine/' +
- str(i + 1))
- self.assertEquals(j, machine_expected_response[i])
-
- def test_run_api(self):
- """Check /run/n returns expected run information."""
- client = self.client
- j = check_json(client, 'api/db_default/v4/nts/run/1')
- self.assertEquals(j, run_expected_response[0])
-
- for i in xrange(0, len(run_expected_response)):
- j = check_json(client, 'api/db_default/v4/nts/run/' + str(i + 1))
- self.assertEquals(j, run_expected_response[i])
-
- def test_order_api(self):
- """ Check /order/n returns the expected order information."""
- client = self.client
- j = check_json(client, 'api/db_default/v4/nts/order/3')
- self.assertEquals(j, order_expected_response)
-
-
-if __name__ == '__main__':
- unittest.main(argv=[sys.argv[0], ])
More information about the llvm-commits
mailing list