<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">LGTM.<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 19, 2015, at 5:06 PM, Michael Zolotukhin <<a href="mailto:mzolotukhin@apple.com" class="">mzolotukhin@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi,</div><div class=""><br class=""></div>It turned out that fetching data from all runs for all tests isn’t a good idea - with a big enough databases it hangs the server. Thus, I’d suggest to simply report in JSON format only what’s already available in usual HTML format.<div class=""><br class=""></div><div class="">Does it look good?</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""></div></div><span id="cid:E35C2741-902C-4B62-8104-76FA0640C7EC@apple.com"><lnt-json.patch></span><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Michael</div><div class=""><br class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 22, 2014, at 1:57 PM, Michael Zolotukhin <<a href="mailto:mzolotukhin@apple.com" class="">mzolotukhin@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Thanks, r224737.<div class=""><br class=""></div><div class="">Michael</div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 16, 2014, at 9:22 AM, Chris Matthews <<a href="mailto:chris.matthews@apple.com" class="">chris.matthews@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div dir="auto" class=""><div class="">The bool in if's with dict.get is unneeded, get returns None on missing key, which is false. </div><div class=""><br class=""></div><div class="">Otherwise, LGTM. <br class=""></div><div class=""><br class="">On Dec 15, 2014, at 1:06 PM, Michael Zolotukhin <<a href="mailto:mzolotukhin@apple.com" class="">mzolotukhin@apple.com</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div class="">Hi Chris,</div><div class=""><br class=""></div>How about this one?<div class=""><br class=""></div><div class="">Michael</div><div class=""><br class=""></div><div class=""><div class=""><font face="Menlo" class="">Index: lnt/server/ui/views.py</font></div><div class=""><font face="Menlo" class="">===================================================================</font></div><div class=""><font face="Menlo" class="">--- lnt/server/ui/views.py<span class="Apple-tab-span" style="white-space:pre">  </span>(revision 223085)</font></div><div class=""><font face="Menlo" class="">+++ lnt/server/ui/views.py<span class="Apple-tab-span" style="white-space:pre">    </span>(working copy)</font></div><div class=""><font face="Menlo" class="">@@ -172,6 +172,26 @@</font></div><div class=""><font face="Menlo" class="">             order_by(ts.Run.start_time.desc()))</font></div><div class=""><font face="Menlo" class="">     associated_runs = associated_runs.items()</font></div><div class=""><font face="Menlo" class="">     associated_runs.sort()</font></div><div class=""><font face="Menlo" class="">+    if bool(request.args.get('json')):</font></div><div class=""><font face="Menlo" class="">+        json_obj = dict()</font></div><div class=""><font face="Menlo" class="">+        machine_obj = ts.query(ts.Machine).filter(ts.Machine.id == id).one()</font></div><div class=""><font face="Menlo" class="">+        json_obj['name'] = machine_obj.name</font></div><div class=""><font face="Menlo" class="">+        json_obj['id'] = machine_obj.id</font></div><div class=""><font face="Menlo" class="">+        runs = {}</font></div><div class=""><font face="Menlo" class="">+        tests = {}</font></div><div class=""><font face="Menlo" class="">+        for sample in ts.query(ts.Sample).filter(ts.Run.machine_id == id).all():</font></div><div class=""><font face="Menlo" class="">+            tests[sample.test.id] = sample.test.name</font></div><div class=""><font face="Menlo" class="">+            runs[sample.run.id] = (sample.run.order.llvm_project_revision,</font></div><div class=""><font face="Menlo" class="">+                                   sample.run.start_time,</font></div><div class=""><font face="Menlo" class="">+                                   sample.run.end_time)</font></div><div class=""><font face="Menlo" class="">+        json_obj['tests'] = []</font></div><div class=""><font face="Menlo" class="">+        for test_id in tests:</font></div><div class=""><font face="Menlo" class="">+            json_obj['tests'].append((test_id, tests[test_id]))</font></div><div class=""><font face="Menlo" class="">+        json_obj['runs'] = []</font></div><div class=""><font face="Menlo" class="">+        for run_id in runs:</font></div><div class=""><font face="Menlo" class="">+            (rev, start, end) = runs[run_id]</font></div><div class=""><font face="Menlo" class="">+            json_obj['runs'].append((run_id, rev, start, end))</font></div><div class=""><font face="Menlo" class="">+        return flask.jsonify(**json_obj)</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">     return render_template("v4_machine.html",</font></div><div class=""><font face="Menlo" class="">                            testsuite_name=g.testsuite_name, id=id,</font></div><div class=""><font face="Menlo" class="">Index: tests/server/ui/V4Pages.py</font></div><div class=""><font face="Menlo" class="">===================================================================</font></div><div class=""><font face="Menlo" class="">--- tests/server/ui/V4Pages.py<span class="Apple-tab-span" style="white-space:pre">   </span>(revision 223085)</font></div><div class=""><font face="Menlo" class="">+++ tests/server/ui/V4Pages.py<span class="Apple-tab-span" style="white-space:pre">        </span>(working copy)</font></div><div class=""><font face="Menlo" class="">@@ -38,6 +38,9 @@</font></div><div class=""><font face="Menlo" class="">     # Get a machine overview page.</font></div><div class=""><font face="Menlo" class="">     check_code(client, '/v4/nts/machine/1')</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">+    # Get a machine overview page in JSON format.</font></div><div class=""><font face="Menlo" class="">+    check_code(client, '/v4/nts/machine/1?json=true')</font></div><div class=""><font face="Menlo" class="">+</font></div><div class=""><font face="Menlo" class="">     # Get the order summary page.</font></div><div class=""><font face="Menlo" class="">     check_code(client, '/v4/nts/all_orders')</font></div></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 9, 2014, at 2:38 PM, Chris Matthews <<a href="mailto:chris.matthews@apple.com" class="">chris.matthews@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I think the query to add runs and tests needs to be joined to get only runs and tests referenced from this machine.  Also append the test and run IDs to the json object.<div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 8, 2014, at 3:25 PM, Michael Zolotukhin <<a href="mailto:mzolotukhin@apple.com" class="">mzolotukhin@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">This patch adds JSON-format for machine-overview page. Does it look good?</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Michael</div><div class=""><br class=""></div><div class=""><div class=""><font face="Menlo" class="">Index: lnt/server/ui/views.py</font></div><div class=""><font face="Menlo" class="">===================================================================</font></div><div class=""><font face="Menlo" class="">--- lnt/server/ui/views.py<span class="Apple-tab-span" style="white-space:pre">      </span>(revision 223085)</font></div><div class=""><font face="Menlo" class="">+++ lnt/server/ui/views.py<span class="Apple-tab-span" style="white-space:pre">    </span>(working copy)</font></div><div class=""><font face="Menlo" class="">@@ -172,6 +172,20 @@</font></div><div class=""><font face="Menlo" class="">             order_by(ts.Run.start_time.desc()))</font></div><div class=""><font face="Menlo" class="">     associated_runs = associated_runs.items()</font></div><div class=""><font face="Menlo" class="">     associated_runs.sort()</font></div><div class=""><font face="Menlo" class="">+    if bool(request.args.get('json')):</font></div><div class=""><font face="Menlo" class="">+        json_obj = dict()</font></div><div class=""><font face="Menlo" class="">+        machine_obj = ts.query(ts.Machine).filter(ts.Machine.id == id).one()</font></div><div class=""><font face="Menlo" class="">+        json_obj['name'] = machine_obj.name</font></div><div class=""><font face="Menlo" class="">+        json_obj['id'] = machine_obj.id</font></div><div class=""><font face="Menlo" class="">+        json_obj['runs'] = []</font></div><div class=""><font face="Menlo" class="">+        for t in ts.query(ts.Run):</font></div><div class=""><font face="Menlo" class="">+            json_obj['runs'].append((t.order.llvm_project_revision,</font></div><div class=""><font face="Menlo" class="">+                                     t.start_time,</font></div><div class=""><font face="Menlo" class="">+                                     t.end_time))</font></div><div class=""><font face="Menlo" class="">+        json_obj['tests'] = []</font></div><div class=""><font face="Menlo" class="">+        for test in ts.query(ts.Test).all():</font></div><div class=""><font face="Menlo" class="">+            json_obj['tests'].append((test.name, test.id))</font></div><div class=""><font face="Menlo" class="">+        return flask.jsonify(**json_obj)</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">     return render_template("v4_machine.html",</font></div><div class=""><font face="Menlo" class="">                            testsuite_name=g.testsuite_name, id=id,</font></div><div class=""><font face="Menlo" class="">Index: tests/server/ui/V4Pages.py</font></div><div class=""><font face="Menlo" class="">===================================================================</font></div><div class=""><font face="Menlo" class="">--- tests/server/ui/V4Pages.py<span class="Apple-tab-span" style="white-space:pre">       </span>(revision 223085)</font></div><div class=""><font face="Menlo" class="">+++ tests/server/ui/V4Pages.py<span class="Apple-tab-span" style="white-space:pre">        </span>(working copy)</font></div><div class=""><font face="Menlo" class="">@@ -38,6 +38,9 @@</font></div><div class=""><font face="Menlo" class="">     # Get a machine overview page.</font></div><div class=""><font face="Menlo" class="">     check_code(client, '/v4/nts/machine/1')</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">+    # Get a machine overview page in JSON format.</font></div><div class=""><font face="Menlo" class="">+    check_code(client, '/v4/nts/machine/1?json=true')</font></div><div class=""><font face="Menlo" class="">+</font></div><div class=""><font face="Menlo" class="">     # Get the order summary page.</font></div><div class=""><font face="Menlo" class="">     check_code(client, '/v4/nts/all_orders')</font></div></div></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></div></blockquote></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></div></body></html>