Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5945)

Unified Diff: chrome/common/extensions/docs/server2/admin_servlets.py

Issue 736773002: Docserver: Add commit history and _reset_commit servlet (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup, test for commit reset Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/server2/admin_servlets.py
diff --git a/chrome/common/extensions/docs/server2/admin_servlets.py b/chrome/common/extensions/docs/server2/admin_servlets.py
new file mode 100644
index 0000000000000000000000000000000000000000..7990761e02d1cb9928580904ccd657a0d13b4a44
--- /dev/null
+++ b/chrome/common/extensions/docs/server2/admin_servlets.py
@@ -0,0 +1,111 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from appengine_wrappers import taskqueue
+from commit_tracker import CommitTracker
+from future import All
+from object_store_creator import ObjectStoreCreator
+from refresh_tracker import RefreshTracker
+from servlet import Servlet, Response
+
+
+class EnqueueServlet(Servlet):
+ '''This Servlet can be used to manually enqueue tasks on the default
+ taskqueue. Useful for when an admin wants to manually force a specific
+ DataSource refresh, but the refresh operation takes longer than the 60 sec
+ timeout of a non-taskqueue request. For example, you might query
+
+ /_enqueue/_refresh/content_providers/cr-native-client?commit=123ff65468dcafff0
+
+ which will enqueue a task (/_refresh/content_providers/cr-native-client) to
+ refresh the NaCl documentation cache for commit 123ff65468dcafff0.
+
+ Access to this servlet should always be restricted to administrative users.
+ '''
+ def __init__(self, request):
+ Servlet.__init__(self, request)
+
+ def Get(self):
+ queue = taskqueue.Queue()
+ queue.add(taskqueue.Task(url='/%s' % self._request.path,
+ params=self._request.arguments))
+ return Response.Ok('Task enqueued.')
+
+
+class QueryCommitServlet(Servlet):
+ '''Provides read access to the commit ID cache within the server. For example:
+
+ /_query_commit/master
+
+ will return the commit ID stored under the commit key "master" within the
+ commit cache. Currently "master" is the only named commit we cache, and it
+ corresponds to the commit ID whose data currently populates the data cache
+ used by live instances.
+ '''
+ def __init__(self, request):
+ Servlet.__init__(self, request)
+
+ def Get(self):
+ object_store_creator = ObjectStoreCreator(start_empty=False)
+ commit_tracker = CommitTracker(object_store_creator)
+
+ def generate_response(result):
+ commit_id, history = result
+ history_log = ''.join('%s: %s<br>' % (entry.datetime, entry.commit_id)
+ for entry in reversed(history))
+ response = 'Current commit: %s<br><br>Most recent commits:<br>%s' % (
+ commit_id, history_log)
+ return response
+
+ commit_name = self._request.path
+ id_future = commit_tracker.Get(commit_name)
+ history_future = commit_tracker.GetHistory(commit_name)
+ return Response.Ok(
+ All((id_future, history_future)).Then(generate_response).Get())
+
+
+class DumpRefreshServlet(Servlet):
+ def __init__(self, request):
+ Servlet.__init__(self, request)
+
+ def Get(self):
+ object_store_creator = ObjectStoreCreator(start_empty=False)
+ refresh_tracker = RefreshTracker(object_store_creator)
+ commit_id = self._request.path
+ work_order = refresh_tracker._GetWorkOrder(commit_id).Get()
+ task_names = ['%s@%s' % (commit_id, task) for task in work_order.tasks]
+ completions = refresh_tracker._task_completions.GetMulti(task_names).Get()
+ missing = []
+ for task in task_names:
+ if task not in completions:
+ missing.append(task)
+ response = 'Missing:<br>%s' % ''.join('%s<br>' % task for task in missing)
+ return Response.Ok(response)
+
+class ResetCommitServlet(Servlet):
+ '''Writes a new commit ID to the commit cache. For example:
+
+ /_reset_commit/master/123456
+
+ will reset the 'master' commit ID to '123456'. The provided commit MUST be
+ in the named commit's recent history or it will be ignored.
+ '''
+
+ class Delegate(object):
+ def CreateCommitTracker(self):
+ return CommitTracker(ObjectStoreCreator(start_empty=False))
+
+ def __init__(self, request, delegate=Delegate()):
+ Servlet.__init__(self, request)
+ self._delegate = delegate
+
+ def Get(self):
+ commit_tracker = self._delegate.CreateCommitTracker()
+ commit_name, commit_id = self._request.path.split('/', 1)
+ history = commit_tracker.GetHistory(commit_name).Get()
+ if not any(entry.commit_id == commit_id for entry in history):
+ return Response.BadRequest('Commit %s not cached.' % commit_id)
+ commit_tracker.Set(commit_name, commit_id).Get()
+ return Response.Ok('Commit "%s" updated to %s' % (commit_name, commit_id))
+

Powered by Google App Engine
This is Rietveld 408576698