diff options
author | Ben Murdoch <benm@google.com> | 2011-06-02 12:07:03 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-06-10 10:47:21 +0100 |
commit | 2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch) | |
tree | e4964fbd1cb70599f7718ff03e50ea1dab33890b /Tools/QueueStatusServer | |
parent | 87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff) | |
download | external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2 |
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Tools/QueueStatusServer')
-rw-r--r-- | Tools/QueueStatusServer/handlers/queuestatus.py | 25 | ||||
-rw-r--r-- | Tools/QueueStatusServer/index.yaml | 21 | ||||
-rw-r--r-- | Tools/QueueStatusServer/model/activeworkitems.py | 8 | ||||
-rw-r--r-- | Tools/QueueStatusServer/model/activeworkitems_unittest.py (renamed from Tools/QueueStatusServer/model/activeworkitems_unitest.py) | 24 | ||||
-rw-r--r-- | Tools/QueueStatusServer/model/queues.py | 6 | ||||
-rw-r--r-- | Tools/QueueStatusServer/model/workitems.py | 8 | ||||
-rw-r--r-- | Tools/QueueStatusServer/templates/queuestatus.html | 16 |
7 files changed, 97 insertions, 11 deletions
diff --git a/Tools/QueueStatusServer/handlers/queuestatus.py b/Tools/QueueStatusServer/handlers/queuestatus.py index e5dc95f..9eaef6f 100644 --- a/Tools/QueueStatusServer/handlers/queuestatus.py +++ b/Tools/QueueStatusServer/handlers/queuestatus.py @@ -26,6 +26,7 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import datetime import itertools from google.appengine.ext import webapp @@ -58,11 +59,29 @@ class QueueStatus(webapp.RequestHandler): def _fetch_statuses(self, queue, bot_id): statuses = queuestatus.QueueStatus.all() - statuses = statuses.filter("queue_name =", queue.name()) + statuses.filter("queue_name =", queue.name()) if bot_id: statuses.filter("bot_id =", bot_id) return statuses.order("-date").fetch(15) + def _fetch_last_message_matching(self, queue, bot_id, message): + statuses = queuestatus.QueueStatus.all() + statuses.filter("queue_name =", queue.name()) + if bot_id: + statuses.filter("bot_id =", bot_id) + statuses.filter("message =", message) + return statuses.order("-date").get() + + def _fetch_trailing_days_pass_count(self, queue, bot_id, days): + statuses = queuestatus.QueueStatus.all() + statuses.filter("queue_name =", queue.name()) + days_ago = datetime.datetime.now() - datetime.timedelta(days=days) + statuses.filter("date >", days_ago) + if bot_id: + statuses.filter("bot_id =", bot_id) + statuses.filter("message =", "Pass") + return statuses.count() + def _page_title(self, queue, bot_id): title = "%s Messages" % queue.display_name() if bot_id: @@ -82,5 +101,9 @@ class QueueStatus(webapp.RequestHandler): "work_item_rows": self._rows_for_work_items(queue), "status_groups": self._build_status_groups(statuses), "bot_id": bot_id, + "last_pass": self._fetch_last_message_matching(queue, bot_id, "Pass"), + "last_boot": self._fetch_last_message_matching(queue, bot_id, "Starting Queue"), + "trailing_month_pass_count": self._fetch_trailing_days_pass_count(queue, bot_id, 30), + "trailing_week_pass_count": self._fetch_trailing_days_pass_count(queue, bot_id, 7), } self.response.out.write(template.render("templates/queuestatus.html", template_values)) diff --git a/Tools/QueueStatusServer/index.yaml b/Tools/QueueStatusServer/index.yaml index 9724760..34eb72e 100644 --- a/Tools/QueueStatusServer/index.yaml +++ b/Tools/QueueStatusServer/index.yaml @@ -26,6 +26,27 @@ indexes: - kind: QueueStatus properties: - name: bot_id + - name: message + - name: queue_name + - name: date + direction: desc + +- kind: QueueStatus + properties: + - name: bot_id + - name: queue_name + - name: date + direction: desc + +- kind: QueueStatus + properties: + - name: message + - name: queue_name + - name: date + +- kind: QueueStatus + properties: + - name: message - name: queue_name - name: date direction: desc diff --git a/Tools/QueueStatusServer/model/activeworkitems.py b/Tools/QueueStatusServer/model/activeworkitems.py index ab5d7a6..023258a 100644 --- a/Tools/QueueStatusServer/model/activeworkitems.py +++ b/Tools/QueueStatusServer/model/activeworkitems.py @@ -61,6 +61,14 @@ class ActiveWorkItems(db.Model, QueuePropertyMixin): nonexpired_pairs = [pair for pair in self._item_time_pairs() if pair[0] != item_id] self._set_item_time_pairs(nonexpired_pairs) + @classmethod + def key_for_queue(cls, queue_name): + return "active-work-items-%s" % (queue_name) + + @classmethod + def lookup_by_queue(cls, queue_name): + return cls.get_or_insert(key_name=cls.key_for_queue(queue_name), queue_name=queue_name) + @staticmethod def _expire_item(key, item_id): active_work_items = db.get(key) diff --git a/Tools/QueueStatusServer/model/activeworkitems_unitest.py b/Tools/QueueStatusServer/model/activeworkitems_unittest.py index 6d915a1..b8c620a 100644 --- a/Tools/QueueStatusServer/model/activeworkitems_unitest.py +++ b/Tools/QueueStatusServer/model/activeworkitems_unittest.py @@ -28,15 +28,27 @@ import unittest from datetime import datetime +from google.appengine.ext import testbed from model.activeworkitems import ActiveWorkItems class ActiveWorkItemsTest(unittest.TestCase): + + def setUp(self): + self.testbed = testbed.Testbed() + self.testbed.activate() + self.testbed.init_datastore_v3_stub() + self.testbed.init_memcache_stub() + + def tearDown(self): + self.testbed.deactivate() + def test_basic(self): - items = ActiveWorkItems() + items = ActiveWorkItems.lookup_by_queue("test-queue") queued_items = [1, 2] - time = datetime.now() + # db.Model only stores dates to second resolution, so we use an explicit datetime without milliseconds. + time = datetime(2011, 4, 18, 18, 50, 44) self.assertEqual(items.next_item(queued_items, time), 1) self.assertEqual(items.next_item([1], time), None) self.assertEqual(items.next_item([], time), None) @@ -45,8 +57,8 @@ class ActiveWorkItemsTest(unittest.TestCase): self.assertEqual(items.time_for_item(2), None) items.expire_item(1) + # expire_item uses a transaction so it doesn't take effect on the current object. + self.assertEqual(items.time_for_item(1), time) + # If we look up the saved object, we see it's been updated. + items = ActiveWorkItems.lookup_by_queue("test-queue") self.assertEqual(items.time_for_item(1), None) - - -if __name__ == '__main__': - unittest.main() diff --git a/Tools/QueueStatusServer/model/queues.py b/Tools/QueueStatusServer/model/queues.py index 1d46f89..bd5e7ed 100644 --- a/Tools/QueueStatusServer/model/queues.py +++ b/Tools/QueueStatusServer/model/queues.py @@ -70,13 +70,11 @@ class Queue(object): return self._name def work_items(self): - key_name = "work-items-%s" % (self._name) - return WorkItems.get_or_insert(key_name=key_name, queue_name=self._name) + return WorkItems.lookup_by_queue(self._name) # FIXME: active_work_items is a bad name for this lock-table. def active_work_items(self): - key_name = "active-work-items-%s" % (self._name) - return ActiveWorkItems.get_or_insert(key_name=key_name, queue_name=self._name) + return ActiveWorkItems.lookup_by_queue(self._name) def _caplitalize_after_dash(self, string): return "-".join([word[0].upper() + word[1:] for word in string.split("-")]) diff --git a/Tools/QueueStatusServer/model/workitems.py b/Tools/QueueStatusServer/model/workitems.py index 772fc39..b74f5f5 100644 --- a/Tools/QueueStatusServer/model/workitems.py +++ b/Tools/QueueStatusServer/model/workitems.py @@ -36,6 +36,14 @@ class WorkItems(db.Model, QueuePropertyMixin): item_ids = db.ListProperty(int) date = db.DateTimeProperty(auto_now_add=True) + @classmethod + def key_for_queue(cls, queue_name): + return "work-items-%s" % (queue_name) + + @classmethod + def lookup_by_queue(cls, queue_name): + return cls.get_or_insert(key_name=cls.key_for_queue(queue_name), queue_name=queue_name) + def display_position_for_attachment(self, attachment_id): """Returns a 1-based index corresponding to the position of the attachment_id in the queue. If the attachment is diff --git a/Tools/QueueStatusServer/templates/queuestatus.html b/Tools/QueueStatusServer/templates/queuestatus.html index c68abf1..f5b4523 100644 --- a/Tools/QueueStatusServer/templates/queuestatus.html +++ b/Tools/QueueStatusServer/templates/queuestatus.html @@ -7,6 +7,22 @@ <body> <h1>{{ page_title }}</h1> +<h3>Summary</h3> +<div> +Last Pass: {{ last_pass.date|timesince }} ago +{% if not bot_id and last_pass.bot_id %} +by <a href="/queue-status/{{last_pass.queue_name}}/bots/{{last_pass.bot_id}}">{{ last_pass.bot_id }}</a> +{% endif %} +</div> +<div> +Last Boot: {{ last_boot.date|timesince }} ago +{% if not bot_id and last_boot.bot_id %} +by <a href="/queue-status/{{last_boot.queue_name}}/bots/{{last_boot.bot_id}}">{{ last_boot.bot_id }}</a> +{% endif %} +</div> +<div>7-day "Pass" count: {{ trailing_week_pass_count }}</div> +<div>30-day "Pass" count: {{ trailing_month_pass_count }}</div> + <h3>Recent Status</h3> <div class="status-details"> |