Index: appengine/swarming/swarming_bot/bot_code/bot_auth.py |
diff --git a/appengine/swarming/swarming_bot/bot_code/bot_auth.py b/appengine/swarming/swarming_bot/bot_code/bot_auth.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6d3853d2a0a11d138f4cf5b705f2e49b708af6b |
--- /dev/null |
+++ b/appengine/swarming/swarming_bot/bot_code/bot_auth.py |
@@ -0,0 +1,63 @@ |
+# Copyright 2016 The LUCI Authors. All rights reserved. |
+# Use of this source code is governed under the Apache License, Version 2.0 |
+# that can be found in the LICENSE file. |
+ |
+import collections |
+ |
+ |
+# Parsed value of JSON at path specified by 'SWARMING_AUTH_PARAMS' env var. |
+AuthParams = collections.namedtuple('AuthParams', [ |
Vadim Sh.
2016/06/07 22:22:59
This is expected to grow in the future to include:
|
+ # Dict with HTTP headers to use when calling Swarming backend (specifically). |
+ # They identify the bot to the Swarming backend. Ultimately generated by |
+ # 'get_authentication_headers' in bot_config.py. |
+ 'swarming_http_headers', |
+]) |
+ |
+ |
+def prepare_auth_params_json(bot): |
+ """Returns a dict to put into JSON file at SWARMING_AUTH_PARAMS. |
+ |
+ This JSON file contains various tokens and configuration parameters that allow |
+ Swarming tasks to make authenticated calls to backends using security context |
+ of whoever posted the task. |
+ |
+ The file is managed by bot_main.py (main Swarming bot process) and consumed by |
+ task_running.py and its subprocesses that are aware of Swarming bot |
+ authentication. |
+ |
+ It lives it the task work directory. |
+ |
+ Args: |
+ bot: instance of bot.Bot. |
+ """ |
+ return { |
+ 'swarming_http_headers': bot.remote.get_authentication_headers(), |
+ } |
+ |
+ |
+def process_auth_params_json(val): |
+ """Takes a dict loaded from SWARMING_AUTH_PARAMS and validates it. |
+ |
+ Args: |
+ val: decoded JSON value read from SWARMING_AUTH_PARAMS file. |
+ |
+ Returns: |
+ AuthParams tuple. |
+ |
+ Raises: |
+ ValueError if val has invalid format. |
+ """ |
+ if not isinstance(val, dict): |
+ raise ValueError('Expecting dict, got %r' % (val,)) |
+ |
+ headers = val.get('swarming_http_headers') or {} |
+ if not isinstance(headers, dict): |
+ raise ValueError( |
+ 'Expecting "swarming_http_headers" to be dict, got %r' % (headers,)) |
+ |
+ # The headers must be ASCII for sure, so don't bother with picking the |
+ # correct unicode encoding, default would work. If not, it'll raise |
+ # UnicodeEncodeError, which is subclass of ValueError. |
+ headers = {str(k): str(v) for k, v in headers.iteritems()} |
+ |
+ return AuthParams(headers) |