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

Side by Side Diff: appengine/chrome_infra_mon_proxy/admin_handler.py

Issue 928043005: Monitoring proxy for time series data (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: More fine-tuning Created 5 years, 8 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
OLDNEW
(Empty)
1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import json
6 import sys
7 import webapp2
8
9 from google.appengine.api import users
10
11 import common
12
13 class AdminCommand(object):
14 """Base class for administrative commands."""
15
16 def __init__(self, handler):
17 self._handler = handler
18
19 @property
20 def request(self):
21 return self._handler.request
22
23 @property
24 def response(self):
25 return self._handler.response
26
27
28 class AdminPage(AdminCommand):
29 """Display the admin page."""
30
31 def get(self):
32 self.response.write(open('templates/admin.html').read())
33
34 def post(self):
35 self.response.set_status(403)
36 return
37
38
39 def serialize(value):
ghost stip (do not use) 2015/04/14 00:36:42 I'm not entirely sure what these are used for. thi
Sergey Berezin (google) 2015/04/15 01:38:09 Function removed.
40 if type(value) is str:
41 return value
42 if type(value) is list:
43 return '\n'.join(value)
44 if type(value) is dict:
45 return json.dumps(value)
46 return 'Unsupported type'
47
48
49 def deserialize(value, tp):
50 if tp is str:
51 return value
52 if tp is list:
53 return [l for l in value.splitlines() if l]
54 if tp is dict:
55 return json.loads(value)
56 raise ValueError('Unsuppored type')
57
58
59 class SetCredentials(AdminCommand):
60 """Save new credentials for the Monacq endpoint."""
61
62 # TODO(sergeyberezin): move this and (de)serialize funcs to common.py.
63 fields = {
64 'message': str,
65 'url': str,
66 'credentials': dict,
67 'scopes': list,
68 'headers': dict,
69 }
70
71 def get(self):
72 params = {f: serialize(tp()) for f, tp in self.fields.iteritems()}
73 data = common.MonAcqData.get_by_id(common.CREDENTIALS_KEY)
74 if data:
75 params.update({
76 f: serialize(self.fields[f](v)) for f, v in data.to_dict().items()})
77 self.response.headers["Content-Type"] = 'text/html'
78 self.response.write(open('templates/set_credentials.html').read() % params)
ghost stip (do not use) 2015/04/14 00:36:41 you should use jinja
Sergey Berezin (google) 2015/04/15 01:38:09 Done.
79
80 def post(self):
81 params = {f: serialize(tp()) for f, tp in self.fields.iteritems()}
82 data = common.MonAcqData.get_or_insert(common.CREDENTIALS_KEY)
83 params.update({f: serialize(v) for f, v in data.to_dict().iteritems()})
84
85 updated_fields = []
86 failed_fields = []
87 for field, tp in self.fields.iteritems():
88 if not self.request.get(field):
89 continue
90 try:
91 setattr(data, field, deserialize(self.request.get(field), tp))
92 updated_fields.append(field)
93 except ValueError:
94 failed_fields.append(field)
95 params[field] = self.request.get(field)
96
97 if failed_fields:
98 self.response.headers["Content-Type"] = 'text/html'
ghost stip (do not use) 2015/04/14 00:36:42 I think this is set by default?
Sergey Berezin (google) 2015/04/15 01:38:09 True. And now irrelevant (jinja!)
99 params['message'] = 'Failed to update %s. Please try again.' % (
100 ', '.join(failed_fields))
101 self.response.out.write(
102 open('templates/set_credentials.html').read() % params)
103 return
104 if updated_fields:
105 data.put()
106 params['message'] = 'Updated %s.' % ', '.join(updated_fields)
107 self.response.headers["Content-Type"] = 'text/html'
108 self.response.out.write(
109 open('templates/set_credentials.html').read() % params)
ghost stip (do not use) 2015/04/14 00:36:42 again, jinja. from what I'm reading, you can repla
Sergey Berezin (google) 2015/04/15 01:38:09 Done. Thanks for the pointers!
110
111
112 commands = {
113 '': AdminPage,
114 'set-credentials': SetCredentials,
115 }
116
117 class AdminDispatch(webapp2.RequestHandler):
ghost stip (do not use) 2015/04/14 00:36:41 I think you can remove lines 112 - 128 if you just
Sergey Berezin (google) 2015/04/15 01:38:09 First, I'd really like to switch to auth groups he
118 def get(self, command):
119 if not users.is_current_user_admin():
120 self.redirect(users.create_login_url(self.request.url))
121 return
122 commands[command](self).get()
123
124 def post(self, command):
125 if not users.is_current_user_admin():
126 self.response.set_status(403)
127 return
128 commands[command](self).post()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698