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

Side by Side Diff: appengine/swarming/handlers_backend.py

Issue 2249803003: Create Tasks.Tags endpoint and Cron job (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-py@master
Patch Set: Docs Created 4 years, 4 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 unified diff | Download patch
« no previous file with comments | « appengine/swarming/cron.yaml ('k') | appengine/swarming/handlers_endpoints.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The LUCI Authors. All rights reserved. 1 # Copyright 2014 The LUCI Authors. All rights reserved.
2 # Use of this source code is governed under the Apache License, Version 2.0 2 # Use of this source code is governed under the Apache License, Version 2.0
3 # that can be found in the LICENSE file. 3 # that can be found in the LICENSE file.
4 4
5 """Main entry point for Swarming backend handlers.""" 5 """Main entry point for Swarming backend handlers."""
6 6
7 import datetime
7 import json 8 import json
8 import logging 9 import logging
9 10
10 import webapp2 11 import webapp2
11 from google.appengine.api import app_identity 12 from google.appengine.api import app_identity
12 from google.appengine.api import datastore_errors 13 from google.appengine.api import datastore_errors
13 from google.appengine.api import taskqueue 14 from google.appengine.api import taskqueue
14 15
15 from components import utils 16 from components import utils
16 17
17 import mapreduce_jobs 18 import mapreduce_jobs
18 from components import decorators 19 from components import decorators
20 from components import datastore_utils
19 from components import machine_provider 21 from components import machine_provider
20 from server import bot_management 22 from server import bot_management
21 from server import config 23 from server import config
22 from server import lease_management 24 from server import lease_management
23 from server import stats 25 from server import stats
26 from server import task_result
24 from server import task_scheduler 27 from server import task_scheduler
25 28
26 29
27 class CronBotDiedHandler(webapp2.RequestHandler): 30 class CronBotDiedHandler(webapp2.RequestHandler):
28 @decorators.require_cronjob 31 @decorators.require_cronjob
29 def get(self): 32 def get(self):
30 try: 33 try:
31 task_scheduler.cron_handle_bot_died(self.request.host_url) 34 task_scheduler.cron_handle_bot_died(self.request.host_url)
32 except datastore_errors.NeedIndexError as e: 35 except datastore_errors.NeedIndexError as e:
33 # When a fresh new instance is deployed, it takes a few minutes for the 36 # When a fresh new instance is deployed, it takes a few minutes for the
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 for k, values in sorted(seen.iteritems()) 120 for k, values in sorted(seen.iteritems())
118 ] 121 ]
119 122
120 logging.info('Saw dimensions %s', dims) 123 logging.info('Saw dimensions %s', dims)
121 bot_management.DimensionAggregation( 124 bot_management.DimensionAggregation(
122 key=bot_management.DimensionAggregation.KEY, 125 key=bot_management.DimensionAggregation.KEY,
123 dimensions=dims, 126 dimensions=dims,
124 ts=now).put() 127 ts=now).put()
125 128
126 129
130 class CronTasksTagsAggregationHandler(webapp2.RequestHandler):
131 """Aggregates all task tags from the last 12 hours."""
132
133 @decorators.require_cronjob
134 def get(self):
135 seen = {}
136 now = utils.utcnow()
137 count = 0
138 q = task_result.get_result_summaries_query(
139 now - datetime.timedelta(hours=12), None, 'created_ts', 'all', None)
140 cursor = None
141 while True:
142 tasks, cursor = datastore_utils.fetch_page(q, 1000, cursor)
143 count += len(tasks)
144 for t in tasks:
145 for i in t.tags:
146 k, v = i.split(':', 1)
147 if k != 'cron_invocation_id':
148 seen.setdefault(k, set()).add(v)
149 if not cursor or len(tasks) == 0:
150 break
151
152 tags = [
153 task_result.TagValues(tag=k, values=sorted(values))
154 for k, values in sorted(seen.iteritems())
155 ]
156
157 logging.info('From %d tasks, saw tags %s', count, tags)
158 task_result.TagAggregation(
159 key=task_result.TagAggregation.KEY,
160 tags=tags,
161 ts=now).put()
162
163
127 class CronMachineProviderPubSubHandler(webapp2.RequestHandler): 164 class CronMachineProviderPubSubHandler(webapp2.RequestHandler):
128 """Listens for Pub/Sub communication from Machine Provider.""" 165 """Listens for Pub/Sub communication from Machine Provider."""
129 166
130 @decorators.require_cronjob 167 @decorators.require_cronjob
131 def get(self): 168 def get(self):
132 if not config.settings().mp.enabled: 169 if not config.settings().mp.enabled:
133 logging.info('MP support is disabled') 170 logging.info('MP support is disabled')
134 return 171 return
135 172
136 taskqueue.add( 173 taskqueue.add(
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 # the app version has to be running an already compatible version already. 229 # the app version has to be running an already compatible version already.
193 ('/internal/cron/abort_bot_died', CronBotDiedHandler), 230 ('/internal/cron/abort_bot_died', CronBotDiedHandler),
194 ('/internal/cron/handle_bot_died', CronBotDiedHandler), 231 ('/internal/cron/handle_bot_died', CronBotDiedHandler),
195 ('/internal/cron/abort_expired_task_to_run', 232 ('/internal/cron/abort_expired_task_to_run',
196 CronAbortExpiredShardToRunHandler), 233 CronAbortExpiredShardToRunHandler),
197 234
198 ('/internal/cron/stats/update', stats.InternalStatsUpdateHandler), 235 ('/internal/cron/stats/update', stats.InternalStatsUpdateHandler),
199 ('/internal/cron/trigger_cleanup_data', CronTriggerCleanupDataHandler), 236 ('/internal/cron/trigger_cleanup_data', CronTriggerCleanupDataHandler),
200 ('/internal/cron/aggregate_bots_dimensions', 237 ('/internal/cron/aggregate_bots_dimensions',
201 CronBotsDimensionAggregationHandler), 238 CronBotsDimensionAggregationHandler),
239 ('/internal/cron/aggregate_tasks_tags',
240 CronTasksTagsAggregationHandler),
202 ('/internal/cron/machine_provider', CronMachineProviderBotHandler), 241 ('/internal/cron/machine_provider', CronMachineProviderBotHandler),
203 ('/internal/cron/machine_provider_cleanup', 242 ('/internal/cron/machine_provider_cleanup',
204 CronMachineProviderCleanUpHandler), 243 CronMachineProviderCleanUpHandler),
205 ('/internal/cron/machine_provider_pubsub', 244 ('/internal/cron/machine_provider_pubsub',
206 CronMachineProviderPubSubHandler), 245 CronMachineProviderPubSubHandler),
207 246
208 # Task queues. 247 # Task queues.
209 ('/internal/taskqueue/cleanup_data', TaskCleanupDataHandler), 248 ('/internal/taskqueue/cleanup_data', TaskCleanupDataHandler),
210 (r'/internal/taskqueue/pubsub/<task_id:[0-9a-f]+>', TaskSendPubSubMessage), 249 (r'/internal/taskqueue/pubsub/<task_id:[0-9a-f]+>', TaskSendPubSubMessage),
211 ('/internal/taskqueue/pubsub/machine_provider', 250 ('/internal/taskqueue/pubsub/machine_provider',
212 TaskMachineProviderPubSubHandler), 251 TaskMachineProviderPubSubHandler),
213 252
214 # Mapreduce related urls. 253 # Mapreduce related urls.
215 (r'/internal/taskqueue/mapreduce/launch/<job_id:[^\/]+>', 254 (r'/internal/taskqueue/mapreduce/launch/<job_id:[^\/]+>',
216 InternalLaunchMapReduceJobWorkerHandler), 255 InternalLaunchMapReduceJobWorkerHandler),
217 ] 256 ]
218 return [webapp2.Route(*a) for a in routes] 257 return [webapp2.Route(*a) for a in routes]
OLDNEW
« no previous file with comments | « appengine/swarming/cron.yaml ('k') | appengine/swarming/handlers_endpoints.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698