| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from libs.list_of_basestring import ListOfBasestring |
| from libs.structured_object import StructuredObject |
| from libs.structured_object import TypedList |
| |
| |
| class CIPDPackage(StructuredObject): |
| path = basestring |
| version = basestring |
| package_name = basestring |
| |
| |
| class CIPDPackages(TypedList): |
| _element_type = CIPDPackage |
| |
| @classmethod |
| def FromSerializable(cls, packages): |
| serialized_data = cls() |
| for package in packages or []: |
| serialized_data.append( |
| CIPDPackage( |
| path=package.get('path'), |
| version=package.get('version'), |
| package_name=package.get('package_name'), |
| )) |
| return serialized_data |
| |
| |
| class CIPDClientPackage(StructuredObject): |
| version = basestring |
| package_name = basestring |
| |
| |
| class CIPDInput(StructuredObject): |
| packages = CIPDPackages |
| client_package = CIPDClientPackage |
| server = basestring |
| |
| |
| class SwarmingTaskInputsRef(StructuredObject): |
| """Contains information on the locations of the binaries to run against.""" |
| # A hash represented the ioslated input pointing to the binaries to test. |
| isolated = basestring |
| |
| # The url to the server the isolated inputs reside on. |
| isolatedserver = basestring |
| |
| namespace = basestring |
| |
| |
| class CASInputRootDigest(StructuredObject): |
| size_bytes = basestring |
| hash = basestring |
| |
| |
| class CASInputRoot(StructuredObject): |
| """RBE-CAS input""" |
| cas_instance = basestring |
| digest = CASInputRootDigest |
| |
| |
| class SwarmingTaskProperties(StructuredObject): |
| """Fields populated in swarming task requests.""" |
| caches = list |
| command = ListOfBasestring |
| relative_cwd = basestring |
| env_prefixes = list |
| dimensions = list |
| env = list |
| cas_input_root = CASInputRoot |
| |
| # The maximum amount of time the swarming task is allowed to run before being |
| # terminated returned as a string representation of an int. |
| execution_timeout_secs = basestring |
| |
| extra_args = ListOfBasestring |
| |
| # String representation of int. |
| grace_period_secs = basestring |
| |
| idempotent = bool |
| |
| # Information pointing to the location of the test binaries. |
| inputs_ref = SwarmingTaskInputsRef |
| |
| # String representaiton of int. |
| io_timeout_secs = basestring |
| |
| cipd_input = CIPDInput |
| |
| |
| class SwarmingResultDBCfg(StructuredObject): |
| """Swarming/ResultDB integration configuration for a task.""" |
| enable = bool |
| |
| |
| class SwarmingTaskRequest(StructuredObject): |
| """Represents a task request on Swarming server.""" |
| |
| # The created timestamp according to Swarming, returned as a string |
| # representation of a timestamp. |
| created_ts = basestring |
| |
| # String representation of int. |
| expiration_secs = basestring |
| |
| # The name of the swarming task. |
| name = basestring |
| |
| parent_task_id = basestring |
| |
| # The priority of the swarming task. The lower the number, the higher the |
| # priority, represented as a string. |
| priority = basestring |
| |
| service_account = basestring |
| tags = ListOfBasestring |
| user = basestring |
| properties = SwarmingTaskProperties |
| |
| # Pub/Sub parameters |
| pubsub_topic = basestring |
| pubsub_auth_token = basestring |
| pubsub_userdata = basestring |
| |
| # Realm |
| realm = basestring |
| |
| # ResultDB |
| resultdb = SwarmingResultDBCfg |
| |
| @staticmethod |
| def GetSwarmingTaskRequestTemplate(): |
| """Returns a template SwarmingTaskRequest object with default values.""" |
| return SwarmingTaskRequest( |
| created_ts=None, |
| expiration_secs='3600', |
| name='', |
| parent_task_id='', |
| priority='150', |
| properties=SwarmingTaskProperties( |
| caches=[], |
| command=ListOfBasestring(), |
| relative_cwd=None, |
| dimensions=[], |
| env=[], |
| env_prefixes=[], |
| execution_timeout_secs='3600', |
| extra_args=ListOfBasestring(), |
| grace_period_secs='30', |
| io_timeout_secs='1200', |
| idempotent=True, |
| inputs_ref=SwarmingTaskInputsRef( |
| isolated=None, isolatedserver=None, namespace=None), |
| cipd_input=CIPDInput( |
| packages=CIPDPackages(), |
| client_package=CIPDClientPackage( |
| version=None, |
| package_name=None, |
| ), |
| server=None), |
| cas_input_root=CASInputRoot( |
| cas_instance=None, |
| digest=CASInputRootDigest( |
| size_bytes=None, |
| hash=None, |
| ), |
| ), |
| ), |
| pubsub_auth_token=None, |
| pubsub_topic=None, |
| pubsub_userdata=None, |
| service_account=None, |
| tags=ListOfBasestring(), |
| user='', |
| realm=None, |
| resultdb=SwarmingResultDBCfg(enable=False)) |
| |
| @classmethod |
| def FromSerializable(cls, data): |
| """Deserializes the given data into a SwarmingTaskRequest. |
| |
| Because Swarming frequently adds new fields to task requests, maintaining |
| a strict 1:1 mapping between Findit and Swarming is not feasible. Instead |
| when deserializing a swarming task request, only consider the fields that |
| are necessary. |
| |
| Args: |
| data (dict): The dict mapping from defined attributes to their values. |
| |
| Returns: |
| An instance of the given class with attributes set to the given data. |
| """ |
| properties = data.get('properties', {}) |
| cipd_input = properties.get('cipd_input', {}) |
| |
| inputs_ref = properties.get('inputs_ref', {}) |
| inputs_ref_deserialized = SwarmingTaskInputsRef( |
| isolated=inputs_ref.get('isolated'), |
| isolatedserver=inputs_ref.get('isolatedserver'), |
| namespace=inputs_ref.get('namespace')) if inputs_ref else None |
| |
| cas_input_root = properties.get('cas_input_root', {}) |
| cas_input_deserialized = CASInputRoot( |
| cas_instance=cas_input_root.get('cas_instance'), |
| digest=CASInputRootDigest( |
| size_bytes=cas_input_root.get('digest', {}).get('size_bytes'), |
| hash=cas_input_root.get('digest', {}).get('hash'), |
| )) if cas_input_root else None |
| |
| return SwarmingTaskRequest( |
| created_ts=data.get('created_ts'), |
| expiration_secs=str(data.get('expiration_secs')), |
| name=data.get('name'), |
| parent_task_id=data.get('parent_task_id'), |
| priority=str(data.get('priority')), |
| properties=SwarmingTaskProperties( |
| caches=properties.get('caches') or [], |
| command=ListOfBasestring.FromSerializable( |
| properties.get('command') or []), |
| relative_cwd=properties.get('relative_cwd'), |
| dimensions=properties.get('dimensions') or [], |
| env=properties.get('env') or [], |
| env_prefixes=properties.get('env_prefixes') or [], |
| execution_timeout_secs=str( |
| properties.get('execution_timeout_secs')), |
| extra_args=ListOfBasestring.FromSerializable( |
| properties.get('extra_args') or []), |
| grace_period_secs=str(properties.get('grace_period_secs')), |
| io_timeout_secs=str(properties.get('io_timeout_secs')), |
| idempotent=properties.get('idempotent'), |
| inputs_ref=inputs_ref_deserialized, |
| cipd_input=CIPDInput( |
| packages=CIPDPackages.FromSerializable( |
| cipd_input.get('packages')), |
| client_package=CIPDClientPackage( |
| version=cipd_input.get('client_package', {}).get('version'), |
| package_name=cipd_input.get('client_package', |
| {}).get('package_name'), |
| ), |
| server=cipd_input.get('server'), |
| ), |
| cas_input_root=cas_input_deserialized, |
| ), |
| pubsub_auth_token=data.get('pubsub_auth_token'), |
| pubsub_topic=data.get('pubsub_topic'), |
| pubsub_userdata=data.get('pubsub_userdata'), |
| service_account=data.get('service_account'), |
| tags=ListOfBasestring.FromSerializable(data.get('tags') or []), |
| user=data.get('user'), |
| realm=data.get('realm'), |
| resultdb=SwarmingResultDBCfg( |
| enable=data.get('resultdb', {}).get('enable', False))) |