| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import time | 5 import time |
| 6 | 6 |
| 7 from appengine_wrappers import taskqueue | 7 from appengine_wrappers import taskqueue |
| 8 from commit_tracker import CommitTracker |
| 8 from cron_servlet import CronServlet | 9 from cron_servlet import CronServlet |
| 9 from instance_servlet import InstanceServlet | 10 from instance_servlet import InstanceServlet |
| 11 from object_store_creator import ObjectStoreCreator |
| 10 from patch_servlet import PatchServlet | 12 from patch_servlet import PatchServlet |
| 11 from refresh_servlet import RefreshServlet | 13 from refresh_servlet import RefreshServlet |
| 12 from servlet import Servlet, Request, Response | 14 from servlet import Servlet, Request, Response |
| 13 from test_servlet import TestServlet | 15 from test_servlet import TestServlet |
| 14 | 16 |
| 15 | 17 |
| 16 _DEFAULT_SERVLET = InstanceServlet.GetConstructor() | 18 _DEFAULT_SERVLET = InstanceServlet.GetConstructor() |
| 17 | 19 |
| 18 | 20 |
| 19 _FORCE_CRON_TARGET = 'force_cron' | 21 class _EnqueueServlet(Servlet): |
| 22 '''This Servlet can be used to manually enqueue tasks on the default |
| 23 taskqueue. Useful for when an admin wants to manually force a specific |
| 24 DataSource refresh, but the refresh operation takes longer than the 60 sec |
| 25 timeout of a non-taskqueue request. For example, you might query |
| 26 |
| 27 /_enqueue/_refresh/content_providers/cr-native-client?commit=123ff65468dcafff0 |
| 28 |
| 29 which will enqueue a task (/_refresh/content_providers/cr-native-client) to |
| 30 refresh the NaCl documentation cache for commit 123ff65468dcafff0. |
| 31 |
| 32 Access to this servlet should always be restricted to administrative users. |
| 33 ''' |
| 34 def __init__(self, request): |
| 35 Servlet.__init__(self, request) |
| 36 |
| 37 def Get(self): |
| 38 queue = taskqueue.Queue() |
| 39 queue.add(taskqueue.Task(url='/%s' % self._request.path, |
| 40 params=self._request.arguments)) |
| 41 return Response.Ok('Task enqueued.') |
| 42 |
| 43 |
| 44 class _QueryCommitServlet(Servlet): |
| 45 '''Provides read access to the commit ID cache within the server. For example: |
| 46 |
| 47 /_query_commit/master |
| 48 |
| 49 will return the commit ID stored under the commit key "master" within the |
| 50 commit cache. Currently "master" is the only named commit we cache, and it |
| 51 corresponds to the commit ID whose data currently populates the data cache |
| 52 used by live instances. |
| 53 ''' |
| 54 def __init__(self, request): |
| 55 Servlet.__init__(self, request) |
| 56 |
| 57 def Get(self): |
| 58 object_store_creator = ObjectStoreCreator(start_empty=False) |
| 59 commit_tracker = CommitTracker(object_store_creator) |
| 60 return Response.Ok(commit_tracker.Get(self._request.path).Get()) |
| 20 | 61 |
| 21 | 62 |
| 22 _SERVLETS = { | 63 _SERVLETS = { |
| 23 'cron': CronServlet, | 64 'cron': CronServlet, |
| 65 'enqueue': _EnqueueServlet, |
| 24 'patch': PatchServlet, | 66 'patch': PatchServlet, |
| 67 'query_commit': _QueryCommitServlet, |
| 25 'refresh': RefreshServlet, | 68 'refresh': RefreshServlet, |
| 26 'test': TestServlet, | 69 'test': TestServlet, |
| 27 } | 70 } |
| 28 | 71 |
| 29 | 72 |
| 30 class Handler(Servlet): | 73 class Handler(Servlet): |
| 31 def Get(self): | 74 def Get(self): |
| 32 path = self._request.path | 75 path = self._request.path |
| 33 | 76 |
| 34 if path.startswith('_'): | 77 if path.startswith('_'): |
| 35 servlet_path = path[1:] | 78 servlet_path = path[1:] |
| 36 if not '/' in servlet_path: | 79 if not '/' in servlet_path: |
| 37 servlet_path += '/' | 80 servlet_path += '/' |
| 38 servlet_name, servlet_path = servlet_path.split('/', 1) | 81 servlet_name, servlet_path = servlet_path.split('/', 1) |
| 39 if servlet_name == _FORCE_CRON_TARGET: | |
| 40 queue = taskqueue.Queue() | |
| 41 queue.purge() | |
| 42 time.sleep(2) | |
| 43 queue.add(taskqueue.Task(url='/_cron')) | |
| 44 return Response.Ok('Cron job started.') | |
| 45 if servlet_name == 'enqueue': | |
| 46 queue = taskqueue.Queue() | |
| 47 queue.add(taskqueue.Task(url='/%s'%servlet_path)) | |
| 48 return Response.Ok('Task enqueued.') | |
| 49 servlet = _SERVLETS.get(servlet_name) | 82 servlet = _SERVLETS.get(servlet_name) |
| 50 if servlet is None: | 83 if servlet is None: |
| 51 return Response.NotFound('"%s" servlet not found' % servlet_path) | 84 return Response.NotFound('"%s" servlet not found' % servlet_path) |
| 52 else: | 85 else: |
| 53 servlet_path = path | 86 servlet_path = path |
| 54 servlet = _DEFAULT_SERVLET | 87 servlet = _DEFAULT_SERVLET |
| 55 | 88 |
| 56 return servlet(Request(servlet_path, | 89 return servlet(Request(servlet_path, |
| 57 self._request.host, | 90 self._request.host, |
| 58 self._request.headers, | 91 self._request.headers, |
| 59 self._request.arguments)).Get() | 92 self._request.arguments)).Get() |
| OLD | NEW |