| Index: appengine/swarming/message_conversion.py
|
| diff --git a/appengine/swarming/message_conversion.py b/appengine/swarming/message_conversion.py
|
| index 1c299d1bda1bfece36a4262f95658f89a57248df..bee7ad3b4fc898aa746ee041200b14ef08ec4619 100644
|
| --- a/appengine/swarming/message_conversion.py
|
| +++ b/appengine/swarming/message_conversion.py
|
| @@ -25,13 +25,17 @@ from server import task_result
|
| ### Private API.
|
|
|
|
|
| -def _string_pairs_from_dict(dictionary):
|
| +def _string_pairs_from_list_of_tuples(dictionary):
|
| return [
|
| swarming_rpcs.StringPair(key=k, value=v)
|
| - for k, v in sorted((dictionary or {}).iteritems())
|
| + for k, v in sorted((dictionary or []))
|
| ]
|
|
|
|
|
| +def _string_pairs_from_dict(dictionary):
|
| + return _string_pairs_from_list_of_tuples((dictionary or {}).iteritems())
|
| +
|
| +
|
| def _string_list_pairs_from_dict(dictionary):
|
| return [
|
| swarming_rpcs.StringListPair(key=k, value=v)
|
| @@ -125,7 +129,7 @@ def task_request_to_rpc(entity):
|
| caches=[_ndb_to_rpc(swarming_rpcs.CacheEntry, c) for c in props.caches],
|
| cipd_input=cipd_input,
|
| secret_bytes='<REDACTED>' if props.has_secret_bytes else None,
|
| - dimensions=_string_pairs_from_dict(props.dimensions),
|
| + dimensions=_string_pairs_from_list_of_tuples(props.dimensions),
|
| env=_string_pairs_from_dict(props.env),
|
| inputs_ref=inputs_ref)
|
|
|
| @@ -171,8 +175,11 @@ def new_task_request_from_rpc(msg, now):
|
| if props.secret_bytes:
|
| secret_bytes = task_request.SecretBytes(secret_bytes=props.secret_bytes)
|
|
|
| - if len(set(i.key for i in props.dimensions)) != len(props.dimensions):
|
| - raise ValueError('same dimension key cannot be specified twice')
|
| + # keys with ':' would corrupt the data. Rest of validation is done in
|
| + # TaskProperties.
|
| + if any(':' in i.key for i in props.dimensions):
|
| + raise ValueError('dimension key cannot contain ":"')
|
| + # Repeated keys would be lost. Rest of validation is done in TaskProperties.
|
| if len(set(i.key for i in props.env)) != len(props.env):
|
| raise ValueError('same environment variable key cannot be specified twice')
|
|
|
| @@ -186,8 +193,8 @@ def new_task_request_from_rpc(msg, now):
|
| has_secret_bytes=secret_bytes is not None,
|
| secret_bytes=None, # ignore this, it's handled out of band
|
| dimensions=None,
|
| - dimensions_dict={i.key: i.value for i in props.dimensions},
|
| - dimensions_flat=[],
|
| + dimensions_flat=sorted(
|
| + u'%s:%s' % (i.key, i.value) for i in props.dimensions),
|
| env={i.key: i.value for i in props.env},
|
| inputs_ref=inputs_ref)
|
|
|
|
|