def get(self, queue_name): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return status_groups = [] last_patch_id = None synthetic_patch_id_counter = 0 statuses = queuestatus.QueueStatus.all().filter("queue_name =", queue.name()).order("-date").fetch(15) for status in statuses: patch_id = status.active_patch_id if not patch_id or last_patch_id != patch_id: status_group = [] status_groups.append(status_group) else: status_group = status_groups[-1] status_group.append(status) last_patch_id = patch_id template_values = { "display_queue_name": queue.display_name(), "work_item_rows": self._rows_for_work_items(queue), "status_groups": status_groups, } self.response.out.write(template.render("templates/queuestatus.html", template_values))
def get(self, queue_name): queue_name = queue_name.lower() if not Queue.queue_with_name(queue_name): self.error(404) return timestamp = self._get_timestamp() view_range = self._get_view_range() time_unit, time_unit_name = charts.get_time_unit(view_range) all_queue_names = map(Queue.name, Queue.all()) template_values = { "all_queue_names": all_queue_names, "patch_data": self._get_patch_data(queue_name, timestamp, view_range), "queue_data": self._get_queue_data(queue_name, timestamp, view_range), "queue_name": queue_name, "seconds_ago_min": 0, "seconds_ago_max": view_range, "time_unit_name": time_unit_name, "time_unit": time_unit, "timestamp": timestamp, "view_range": view_range, "view_range_choices": charts.view_range_choices, } self.response.out.write(template.render("templates/queuecharts.html", template_values))
def post(self): queue_name = self.request.get("queue_name") # FIXME: This queue lookup should be shared between handlers. queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return attachment_id = self._int_from_request("attachment_id") attachment = Attachment(attachment_id) last_status = attachment.status_for_queue(queue) # Ideally we should use a transaction for the calls to # WorkItems and ActiveWorkItems. # Only remove it from the queue if the last message is not a retry request. # Allow removing it from the queue even if there is no last_status for easier testing. if not last_status or not last_status.is_retry_request(): queue.work_items().remove_work_item(attachment_id) RecordPatchEvent.stopped(attachment_id, queue_name) else: RecordPatchEvent.retrying(attachment_id, queue_name) # Always release the lock on the item. queue.active_work_items().expire_item(attachment_id)
def get(self, queue_name, bot_id=None): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return statuses = self._fetch_statuses(queue, bot_id) template_values = { "page_title": self._page_title(queue, bot_id), "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_string(queue, bot_id, 30), "trailing_week_pass_count": self._fetch_trailing_days_pass_count_string(queue, bot_id, 7), } self.response.out.write( template.render("templates/queuestatus.html", template_values))
def get(self, queue_name): queue_name = queue_name.lower() if not Queue.queue_with_name(queue_name): self.error(404) return timestamp = self._get_timestamp() view_range = self._get_view_range() time_unit, time_unit_name = charts.get_time_unit(view_range) all_queue_names = map(Queue.name, Queue.all()) template_values = { "all_queue_names": all_queue_names, "patch_data": self._get_patch_data(queue_name, timestamp, view_range), "queue_data": self._get_queue_data(queue_name, timestamp, view_range), "queue_name": queue_name, "seconds_ago_min": 0, "seconds_ago_max": view_range, "time_unit_name": time_unit_name, "time_unit": time_unit, "timestamp": timestamp, "view_range": view_range, "view_range_choices": charts.view_range_choices, } self.response.out.write( template.render("templates/queuecharts.html", template_values))
def _queue_from_request(self): queue_name = self.request.get("queue_name") queue = Queue.queue_with_name(queue_name) if not queue: self.response.out.write("\"%s\" is not in queues %s" % (queue_name, Queue.all())) return None return queue
def get(self, queue_name): queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return # FIXME: Patch assignment should probably move into Queue. patch_id = db.run_in_transaction(self._assign_patch, queue.active_work_items().key(), queue.work_items().item_ids) if not patch_id: self.error(404) return self.response.out.write(patch_id)
def _work_items_from_request(self): queue_name = self.request.get("queue_name") queue = Queue.queue_with_name(queue_name) if not queue: self.response.out.write("\"%s\" is not in queues %s" % (queue_name, Queue.all())) return None items_string = self.request.get("work_items") work_items = queue.work_items() work_items.item_ids = self._parse_work_items_string(items_string) work_items.date = datetime.now() return work_items
def get(self, queue_name): queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return # FIXME: Patch assignment should probably move into Queue. patch_id = db.run_in_transaction(self._assign_patch, queue.active_work_items().key(), queue.work_items().item_ids) if not patch_id: self.error(404) return RecordPatchEvent.started(patch_id, queue_name) self.response.out.write(patch_id)
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))
def get(self, queue_name): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return statuses = queuestatus.QueueStatus.all().filter("queue_name =", queue.name()).order("-date").fetch(15) template_values = { "display_queue_name": queue.display_name(), "work_item_rows": self._rows_for_work_items(queue), "status_groups": self._build_status_groups(statuses), } self.response.out.write(template.render("templates/queuestatus.html", template_values))
def post(self): queue_name = self.request.get("queue_name") # FIXME: This queue lookup should be shared between handlers. queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return attachment_id = self._int_from_request("attachment_id") queue.active_work_items().expire_item(attachment_id) # ReleaseLock is used when a queue neither succeeded nor failed, so it silently releases the patch. # Let's try other patches before retrying this one, in the interest of fairness, and also because # another patch could be posted to address queue problems. queue.work_items().move_to_end(attachment_id)
def get(self, queue_name, bot_id=None): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return statuses = self._fetch_statuses(queue, bot_id) template_values = { "page_title": self._page_title(queue, bot_id), "work_item_rows": self._rows_for_work_items(queue), "status_groups": self._build_status_groups(statuses), "bot_id": bot_id, } self.response.out.write(template.render("templates/queuestatus.html", template_values))
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))
def get(self, queue_name): 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 = { "status_page": self.request.host_url + "/queue-status/" + queue_name, "queue": self._rows_for_work_items(queue), "bots": self._bots(queue), } dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) else None self.response.out.write(json.dumps(status, default=dthandler))
def get(self, queue_name, bot_id=None): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return statuses = self._fetch_statuses(queue, bot_id) template_values = { "page_title": self._page_title(queue, bot_id), "work_item_rows": self._rows_for_work_items(queue), "status_groups": self._build_status_groups(statuses), "bot_id": bot_id, } self.response.out.write( template.render("templates/queuestatus.html", template_values))
def post(self): queue_name = self.request.get("queue_name") # FIXME: This queue lookup should be shared between handlers. queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return attachment_id = self._int_from_request("attachment_id") attachment = Attachment(attachment_id) last_status = attachment.status_for_queue(queue) # Ideally we should use a transaction for the calls to # WorkItems and ActiveWorkItems. queue.work_items().remove_work_item(attachment_id) RecordPatchEvent.stopped(attachment_id, queue_name) queue.active_work_items().expire_item(attachment_id)
def get(self, queue_name, bot_id=None): queue_name = queue_name.lower() queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return statuses = self._fetch_statuses(queue, bot_id) template_values = { "page_title": self._page_title(queue, bot_id), "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_string(queue, bot_id, 30), "trailing_week_pass_count": self._fetch_trailing_days_pass_count_string(queue, bot_id, 7), } self.response.out.write(template.render("templates/queuestatus.html", template_values))
def post(self): queue_name = self.request.get("queue_name") # FIXME: This queue lookup should be shared between handlers. queue = Queue.queue_with_name(queue_name) if not queue: self.error(404) return attachment_id = self._int_from_request("attachment_id") attachment = Attachment(attachment_id) last_status = attachment.status_for_queue(queue) # Ideally we should use a transaction for the calls to # WorkItems and ActiveWorkItems. queue.work_items().remove_work_item(attachment_id) RecordPatchEvent.stopped(attachment_id, queue_name, last_status.message) queue.active_work_items().expire_item(attachment_id)
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 = { "status_page": self.request.host_url + "/queue-status/" + queue_name, "queue": self._rows_for_work_items(queue), "bots": self._bots(queue), } dthandler = lambda obj: obj.isoformat() if isinstance( obj, datetime.datetime) or isinstance(obj, datetime.date) else None self.response.out.write(json.dumps(status, default=dthandler))
def test_queue_with_name(self): self.assertEqual(Queue.queue_with_name("bogus"), None) self.assertEqual(Queue.queue_with_name("mac-ews").name(), "mac-ews") self.assertRaises(AssertionError, Queue, ("bogus"))
def _queue_getter(self): # Import at runtime to avoid circular imports from model.queues import Queue return Queue.queue_with_name(self.queue_name)