EWS should provide better information to Dashboard via JSON
authorap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Jan 2014 18:37:49 +0000 (18:37 +0000)
committerap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Jan 2014 18:37:49 +0000 (18:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=127265

Reviewed by Ryosuke Niwa.

* QueueStatusServer/app.yaml: Updated version.

* QueueStatusServer/main.py:
* QueueStatusServer/handlers/queuelengthjson.py:
Added a way to cheaply get only the queue length, which is all the dashboard
needs unless a popover is opened.

* QueueStatusServer/handlers/queuestatusjson.py: Updated to return more information
that we will need. Changed some field names to be more meaningful. Fixed bot listing
to understand that a bot can be reprurposed and used in a different queue.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@162358 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/QueueStatusServer/app.yaml
Tools/QueueStatusServer/handlers/queuelengthjson.py [new file with mode: 0644]
Tools/QueueStatusServer/handlers/queuestatusjson.py
Tools/QueueStatusServer/main.py

index 90e7918..3c9e978 100644 (file)
@@ -1,5 +1,23 @@
 2014-01-20  Alexey Proskuryakov  <ap@apple.com>
 
+        EWS should provide better information to Dashboard via JSON
+        https://bugs.webkit.org/show_bug.cgi?id=127265
+
+        Reviewed by Ryosuke Niwa.
+
+        * QueueStatusServer/app.yaml: Updated version.
+
+        * QueueStatusServer/main.py:
+        * QueueStatusServer/handlers/queuelengthjson.py:
+        Added a way to cheaply get only the queue length, which is all the dashboard
+        needs unless a popover is opened.
+
+        * QueueStatusServer/handlers/queuestatusjson.py: Updated to return more information
+        that we will need. Changed some field names to be more meaningful. Fixed bot listing
+        to understand that a bot can be reprurposed and used in a different queue.
+
+2014-01-20  Alexey Proskuryakov  <ap@apple.com>
+
         Make uploading results to EWS work despite robots.txt
         https://bugs.webkit.org/show_bug.cgi?id=127296
 
index ae368ee..3a0f48f 100644 (file)
@@ -1,5 +1,5 @@
 application: webkit-queues
-version: 162287 # Bugzilla bug ID of last major change
+version: 162358 # Bugzilla bug ID of last major change
 runtime: python
 api_version: 1
 
diff --git a/Tools/QueueStatusServer/handlers/queuelengthjson.py b/Tools/QueueStatusServer/handlers/queuelengthjson.py
new file mode 100644 (file)
index 0000000..8a74a7e
--- /dev/null
@@ -0,0 +1,49 @@
+# Copyright (C) 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from google.appengine.ext import webapp
+
+from model.queues import Queue
+
+# Fall back to simplejson, because we are still on Python 2.5.
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
+
+class QueueLengthJSON(webapp.RequestHandler):
+    def get(self, queue_name):
+        self.response.headers["Access-Control-Allow-Origin"] = "*"
+
+        queue_name = queue_name.lower()
+        queue = Queue.queue_with_name(queue_name)
+        if not queue:
+            self.error(404)
+            return
+
+        self.response.headers['Content-Type'] = 'application/json'
+
+        status = {
+            "queue_length": len(queue.work_items().item_ids)
+        }
+        self.response.out.write(json.dumps(status))
index f78e8f5..723c276 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2013 Apple. All rights reserved.
+# Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -45,30 +45,51 @@ class QueueStatusJSON(webapp.RequestHandler):
 
         rows = []
         for item_id in queued_items.item_ids:
-            statuses = QueueStatus.all().filter('queue_name =', queue.name()).filter('active_patch_id =', item_id).order('-date').fetch(1)
-            status = statuses[0].message if statuses else ""
+            patchStatusQuery = QueueStatus.all().filter('queue_name =', queue.name()).filter('active_patch_id =', item_id).order('-date')
+            statuses = patchStatusQuery.fetch(1)
+            message = None
+            message_time = None
+            bug_id = None
+            results_url = None
+            if statuses:
+                message = statuses[0].message
+                message_time = statuses[0].date
+                bug_id = statuses[0].active_bug_id
+                results_url = self.request.host_url + "/results/" + str(statuses[0].key().id()) if statuses[0].results_file else None
+
             rows.append({
                 "attachment_id": item_id,
+                "bug_id": bug_id,
                 "active": active_items and active_items.time_for_item(item_id) != None,
-                "status": status,
+                "active_since": active_items and active_items.time_for_item(item_id),
+                "latest_message": message,
+                "latest_message_time": message_time,
+                "message_count": patchStatusQuery.count(),
                 "status_page": self.request.host_url + "/patch/" + str(item_id),
+                "latest_results": results_url,
             })
         return rows
 
     def _bots(self, queue):
+        # First, collect all bots that ever served this queue.
         bot_id_statuses = QueueStatus.all(projection=['bot_id'], distinct=True).filter('queue_name =', queue.name()).fetch(500)
         bot_ids = list(entry.bot_id for entry in bot_id_statuses)
         result = []
         for bot_id in bot_ids:
             status = QueueStatus.all().filter('bot_id =', bot_id).order('-date').get()
+
+            if status.queue_name != queue.name():
+                # The bot got re-purposed, and is serving a different queue now.
+                continue
+
             result.append({
                 "bot_id": bot_id,
                 "status_page": self.request.host_url + "/queue-status/" + queue.name() + "/bots/" + bot_id,
                 "latest_message": status.message,
                 "latest_message_time": status.date,
+                "latest_message_bug_id": status.active_bug_id,
+                "latest_message_patch_id": status.active_patch_id,
                 "latest_output": self.request.host_url + "/results/" + str(status.key().id()) if status.results_file else None,
-                "active_bug_id": status.active_bug_id,
-                "active_patch_id": status.active_patch_id,
             })
         return result
 
@@ -85,6 +106,7 @@ class QueueStatusJSON(webapp.RequestHandler):
 
         status = {
             "status_page": self.request.host_url + "/queue-status/" + queue_name,
+            "charts_page": self.request.host_url + "/queue-charts/" + queue_name,
             "queue": self._rows_for_work_items(queue),
             "bots": self._bots(queue),
         }
index 45ca986..385b7ab 100644 (file)
@@ -40,6 +40,7 @@ from handlers.nextpatch import NextPatch
 from handlers.patch import Patch
 from handlers.patchstatus import PatchStatus
 from handlers.queuecharts import QueueCharts
+from handlers.queuelengthjson import QueueLengthJSON
 from handlers.queuestatus import QueueStatus
 from handlers.queuestatusjson import QueueStatusJSON
 from handlers.recentstatus import QueuesOverview
@@ -68,6 +69,7 @@ routes = [
     (r'/status-bubble/(.*)', StatusBubble),
     (r'/svn-revision/(.*)', SVNRevision),
     (r'/queue-charts/(.*)', QueueCharts),
+    (r'/queue-length-json/(.*)', QueueLengthJSON),
     (r'/queue-status/(.*)/bots/(.*)', QueueStatus),
     (r'/queue-status/(.*)', QueueStatus),
     (r'/queue-status-json/(.*)', QueueStatusJSON),