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

Unified Diff: Tools/AutoSheriff/main.py

Issue 398823008: WIP: Add auto-sheriff.appspot.com code to Blink Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 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: Tools/AutoSheriff/main.py
diff --git a/Tools/AutoSheriff/main.py b/Tools/AutoSheriff/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d4ecde215602b19a1661976b5a31e8b15b272a2
--- /dev/null
+++ b/Tools/AutoSheriff/main.py
@@ -0,0 +1,95 @@
+import webapp2
ojan 2014/07/22 02:01:25 Copyright
+from google.appengine.ext import ndb
+import json
+import calendar
+import datetime
+
+
+class DateTimeEncoder(json.JSONEncoder):
+ def default(self, obj):
+ # FIXME: This should be UTC.
+ if isinstance(obj, datetime.datetime):
+ return calendar.timegm(obj.timetuple())
+ # Let the base class default method raise the TypeError
+ return json.JSONEncoder.default(self, obj)
+
+
+class AlertBlob(ndb.Model):
+ date = ndb.DateTimeProperty(auto_now_add=True)
+ content = ndb.JsonProperty(indexed=False)
+
+
+class IgnoreRule(ndb.Model):
+ date = ndb.DateTimeProperty(auto_now_add=True)
+ pattern = ndb.StringProperty(indexed=False)
ojan 2014/07/22 02:01:25 Will StringProperty be long enough?
+
+ def dict_with_key(self):
+ failure_dict = self.to_dict()
+ failure_dict['key'] = self.key.id() # Should this be urlsafe?
+ return failure_dict
+
+ def matches(self, failure_dict):
+ pieces = self.pattern.split('=')
+ if len(pieces) != 2:
+ return False
+ key, value = pieces
+ if not key or not value:
+ return False
+ return value in failure_dict.get(key, '')
+
+
+class IgnoreHandler(webapp2.RequestHandler):
+ def get(self):
+ query = IgnoreRule.query()
+ ignore_dicts = map(IgnoreRule.dict_with_key, query.fetch())
+ self.response.headers.add_header("Access-Control-Allow-Origin", "*")
+ self.response.headers['Content-Type'] = 'application/json'
+ self.response.write(json.dumps(ignore_dicts, cls=DateTimeEncoder))
+
+ def post(self):
+ # FIXME: For whatever reason I can't get <form method='delete'> to work.
+ if self.request.get('action') == 'delete':
+ # FIXME: It's lame that this constructor is type-sensitive.
+ key = ndb.Key(IgnoreRule, int(self.request.get('key')))
+ key.delete()
+ else:
+ ignore = IgnoreRule()
+ ignore.pattern = self.request.get('pattern')
+ ignore.put()
+ self.redirect('/')
+
+
+class DataHandler(webapp2.RequestHandler):
+ def get(self):
+ query = AlertBlob.query().order(-AlertBlob.date)
+ entries = query.fetch(1)
+ response_json = {}
+ if entries:
+ response_json = entries[0].content
+ ignores = IgnoreRule.query().fetch()
+
+ def add_ignores(alert):
+ alert['ignored_by'] = [ignore.key.id() for ignore in ignores if ignore.matches(alert)]
+ return alert
+
+ response_json.update({
+ 'date': entries[0].date,
+ # FIXME: We should take an ignores param instead of always applying.
+ 'alerts': map(add_ignores, response_json['alerts']),
+ 'ignores': map(IgnoreRule.dict_with_key, ignores),
+ })
+
+ self.response.headers.add_header("Access-Control-Allow-Origin", "*")
+ self.response.headers['Content-Type'] = 'application/json'
+ self.response.write(json.dumps(response_json, cls=DateTimeEncoder, indent=1))
+
+ def post(self):
+ alert = AlertBlob()
+ alert.content = json.loads(self.request.get('content'))
+ alert.put()
+
+
+app = webapp2.WSGIApplication([
+ ('/data', DataHandler),
+ ('/ignore', IgnoreHandler),
+], debug=True)

Powered by Google App Engine
This is Rietveld 408576698