| # |
| # 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 |