[LNT] r318485 - Add a rest API to query the test suite schema

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 16 16:36:32 PST 2017


Author: matze
Date: Thu Nov 16 16:36:32 2017
New Revision: 318485

URL: http://llvm.org/viewvc/llvm-project?rev=318485&view=rev
Log:
Add a rest API to query the test suite schema

This helps users get things like display_names and units for the
metrics.

Modified:
    lnt/trunk/docs/api.rst
    lnt/trunk/lnt/server/db/testsuite.py
    lnt/trunk/lnt/server/ui/api.py
    lnt/trunk/tests/server/ui/test_api.py

Modified: lnt/trunk/docs/api.rst
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/docs/api.rst?rev=318485&r1=318484&r2=318485&view=diff
==============================================================================
--- lnt/trunk/docs/api.rst (original)
+++ lnt/trunk/docs/api.rst Thu Nov 16 16:36:32 2017
@@ -36,6 +36,8 @@ once.
 +---------------------------+------------------------------------------------------------------------------------------+
 | /samples/`id`             | Get all non-empty sample info for Sample `id`.                                           |
 +---------------------------+------------------------------------------------------------------------------------------+
+| /schema                   | Return test suite schema.                                                                |
++---------------------------+------------------------------------------------------------------------------------------+
 
 .. _auth_tokens:
 

Modified: lnt/trunk/lnt/server/db/testsuite.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/db/testsuite.py?rev=318485&r1=318484&r2=318485&view=diff
==============================================================================
--- lnt/trunk/lnt/server/db/testsuite.py (original)
+++ lnt/trunk/lnt/server/db/testsuite.py Thu Nov 16 16:36:32 2017
@@ -164,6 +164,48 @@ class TestSuite(Base):
         ts.jsonschema = data
         return ts
 
+    def __json__(self):
+        metrics = []
+        for sample_field in self.sample_fields:
+            metric = {
+                'bigger_is_better': (sample_field.bigger_is_better != 0),
+                'display_name': sample_field.display_name,
+                'name': sample_field.name,
+                'type': sample_field.type.name,
+                'unit': sample_field.unit,
+                'unit_abbrev': sample_field.unit_abbrev,
+            }
+            metrics.append(metric)
+        machine_fields = []
+        for machine_field in self.machine_fields:
+            field = {
+                'name': machine_field.name
+            }
+            machine_fields.append(field)
+        run_fields = []
+        for run_field in self.run_fields:
+            field = {
+                'name': run_field.name
+            }
+            run_fields.append(field)
+        for order_field in self.order_fields:
+            field = {
+                'name': order_field.name,
+                'order': True,
+            }
+            run_fields.append(field)
+        metrics.sort(key=lambda x: x['name'])
+        machine_fields.sort(key=lambda x: x['name'])
+        run_fields.sort(key=lambda x: x['name'])
+
+        return {
+            'format_version': '2',
+            'machine_fields': machine_fields,
+            'metrics': metrics,
+            'name': self.name,
+            'run_fields': run_fields,
+        }
+
 
 class FieldMixin(object):
     @property

Modified: lnt/trunk/lnt/server/ui/api.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/api.py?rev=318485&r1=318484&r2=318485&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/api.py (original)
+++ lnt/trunk/lnt/server/ui/api.py Thu Nov 16 16:36:32 2017
@@ -318,6 +318,15 @@ class Order(Resource):
         return result
 
 
+class Schema(Resource):
+    method_decorators = [in_db]
+
+    @staticmethod
+    def get():
+        ts = request.get_testsuite()
+        return ts.test_suite
+
+
 class SampleData(Resource):
     method_decorators = [in_db]
 
@@ -498,6 +507,7 @@ def load_api_resources(api):
     api.add_resource(Run, ts_path("runs/<int:run_id>"))
     api.add_resource(SamplesData, ts_path("samples"), ts_path("samples/"))
     api.add_resource(SampleData, ts_path("samples/<sample_id>"))
+    api.add_resource(Schema, ts_path("schema"), ts_path("schema/"))
     api.add_resource(Order, ts_path("orders/<int:order_id>"))
     graph_url = "graph/<int:machine_id>/<int:test_id>/<int:field_index>"
     api.add_resource(Graph, ts_path(graph_url))

Modified: lnt/trunk/tests/server/ui/test_api.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/tests/server/ui/test_api.py?rev=318485&r1=318484&r2=318485&view=diff
==============================================================================
--- lnt/trunk/tests/server/ui/test_api.py (original)
+++ lnt/trunk/tests/server/ui/test_api.py Thu Nov 16 16:36:32 2017
@@ -7,13 +7,13 @@
 #
 # RUN: python %s %t.instance
 
+from V4Pages import check_json
+import lnt.server.db.migrate
+import lnt.server.ui.app
 import logging
 import sys
 import unittest
-
-import lnt.server.db.migrate
-import lnt.server.ui.app
-from V4Pages import check_json
+import yaml
 
 logging.basicConfig(level=logging.DEBUG)
 
@@ -113,6 +113,7 @@ class JSONAPITester(unittest.TestCase):
     def setUp(self):
         """Bind to the LNT test instance."""
         _, instance_path = sys.argv
+        self.instance_path = instance_path
         app = lnt.server.ui.app.App.create_standalone(instance_path)
         app.testing = True
         self.client = app.test_client()
@@ -241,6 +242,28 @@ class JSONAPITester(unittest.TestCase):
         self._check_response_is_well_formed(two_runs)
         self.assertEqual(j, two_runs)
 
+    def test_schema(self):
+        client = self.client
+        rest_schema = check_json(client, 'api/db_default/v4/nts/schema')
+
+        # The reported schema should be the same as the yaml one on the top.
+        with open('%s/schemas/nts.yaml' % self.instance_path) as syaml:
+            yaml_schema = yaml.load(syaml)
+            # Do some massaging to make it similar to the rest API result.
+            for m in yaml_schema['metrics']:
+                if 'unit' not in m:
+                    m['unit'] = None
+                if 'unit_abbrev' not in m:
+                    m['unit_abbrev'] = None
+                if 'display_name' not in m:
+                    m['display_name'] = m['name']
+                if 'bigger_is_better' not in m:
+                    m['bigger_is_better'] = False
+            yaml_schema['metrics'].sort(key=lambda x: x['name'])
+            yaml_schema['run_fields'].sort(key=lambda x: x['name'])
+            yaml_schema['machine_fields'].sort(key=lambda x: x['name'])
+        self.assertEqual(rest_schema, yaml_schema)
+
 
 if __name__ == '__main__':
     unittest.main(argv=[sys.argv[0], ])




More information about the llvm-commits mailing list