# # Copyright (C) 2017 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import time from host_controller.tfc import api_message class EventType(object): """The types of command events.""" ALLOCATION_FAILED = "AllocationFailed" CONFIGURATION_ERROR = "ConfigurationError" EXECUTE_FAILED = "ExecuteFailed" FETCH_FAILED = "FetchFailed" INVOCATION_COMPLETED = "InvocationCompleted" INVOCATION_STARTED = "InvocationStarted" TEST_RUN_IN_PROGRESS = "TestRunInProgress" class CommandAttempt(api_message.ApiMessage): """The command attempt defined by TFC API. Attributes: _COMMAND_EVENT: The parameters of command_events.submit. _COMMAND_EVENT_DATA: The fields in "data" parameter of command_events. _LIST_ATTEMPT: The fields returned by commandAttempts.list. """ _COMMAND_EVENT = { "attempt_id", "data", "device_serial", "hostname", "task_id", "time", "type"} _COMMAND_EVENT_DATA = { "error", "failed_test_count", "summary", "test_run_name", "total_test_count"} _LIST_ATTEMPT = { "attempt_id", "command_id", "create_time", "end_time", "error", "device_serial", "failed_test_count", "hostname", "request_id", "start_time", "state", "status", "summary", "task_id", "total_test_count", "update_time"} def __init__(self, task_id, attempt_id, hostname, device_serial, **kwargs): """Initializes the attributes. Args: task_id: A string, the task id assigned by the server. attempt_id: A string or UUID, the attempt id generated by the host. hostname: The name of the TradeFed host. device_serial: The serial number of the device. **kwargs: The optional attributes. """ super(CommandAttempt, self).__init__(self._LIST_ATTEMPT, task_id=task_id, attempt_id=str(attempt_id), hostname=hostname, device_serial=device_serial, **kwargs) def CreateCommandEvent(self, event_type, error=None, event_time=None): """Creates an event defined by command_events.submit. Args: event_type: A string in EventType. error: A string, the error message for *Failed, *Error, and *Completed events. event_time: A float, Unix timestamp of the event in seconds. Returns: A JSON object. """ obj = self.ToJson(self._COMMAND_EVENT) obj["type"] = event_type obj["time"] = int(event_time if event_time is not None else time.time()) data_obj = self.ToJson(self._COMMAND_EVENT_DATA) if error is not None: data_obj["error"] = error if data_obj: obj["data"] = data_obj return obj def CreateInvocationCompletedEvent(self, summary, total_test_count, failed_test_count, error=None, event_time=None): """Creates an InvocationCompleted event. Args: summary: A string, the result of the command. total_test_count: Number of test cases. failed_test_count: Number of failed test cases. error: A string, the error message. event_time: A float, Unix timestamp of the event in seconds. Returns: A JSON object. """ obj = self.CreateCommandEvent(EventType.INVOCATION_COMPLETED, error, event_time) if "data" not in obj: obj["data"] = dict() obj["data"].update({"summary": summary, "total_test_count": total_test_count, "failed_test_count": failed_test_count}) return obj