diff options
Diffstat (limited to 'harnesses/host_controller/tfc/tfc_client.py')
-rw-r--r-- | harnesses/host_controller/tfc/tfc_client.py | 176 |
1 files changed, 0 insertions, 176 deletions
diff --git a/harnesses/host_controller/tfc/tfc_client.py b/harnesses/host_controller/tfc/tfc_client.py deleted file mode 100644 index 8380573..0000000 --- a/harnesses/host_controller/tfc/tfc_client.py +++ /dev/null @@ -1,176 +0,0 @@ -# -# 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 httplib2 -import logging -import threading -import time - -from googleapiclient import discovery -from googleapiclient import http -from oauth2client.service_account import ServiceAccountCredentials - -from host_controller.tfc import command_task - -API_NAME = "tradefed_cluster" -API_VERSION = "v1" -SCOPES = ['https://www.googleapis.com/auth/userinfo.email'] - - -class TfcClient(object): - """The class for accessing TFC API. - - Attributes: - _service: The TFC service. - """ - - def __init__(self, service): - self._service = service - - def LeaseHostTasks(self, cluster_id, next_cluster_ids, hostname, device_infos): - """Calls leasehosttasks. - - Args: - cluster_id: A string, the primary cluster to lease tasks from. - next_cluster_ids: A list of Strings, the secondary clusters to lease - tasks from. - hostname: A string, the name of the TradeFed host. - device_infos: A list of DeviceInfo, the information about the - devices connected to the host. - - Returns: - A list of command_task.CommandTask, the leased tasks. - """ - lease = {"hostname": hostname, - "cluster": cluster_id, - "next_cluster_ids": next_cluster_ids, - "device_infos": [x.ToLeaseHostTasksJson() - for x in device_infos]} - logging.info("tasks.leasehosttasks body=%s", lease) - tasks = self._service.tasks().leasehosttasks(body=lease).execute() - logging.info("tasks.leasehosttasks response=%s", tasks) - if "tasks" not in tasks: - return [] - return [command_task.CommandTask(**task) for task in tasks["tasks"]] - - def TestResourceList(self, request_id): - """Calls testResource.list. - - Args: - request_id: int, id of request to grab resources for - - Returns: - A list of TestResources - """ - logging.info("request.testResource.list request_id=%s", request_id) - test_resources = self._service.requests().testResource().list(request_id=request_id).execute() - logging.info("request.testResource.list response=%s", test_resources) - if 'test_resources' not in test_resources: - return {} - return test_resources['test_resources'] - - @staticmethod - def CreateDeviceSnapshot(cluster_id, hostname, dev_infos): - """Creates a DeviceSnapshot which can be uploaded as host event. - - Args: - cluster_id: A string, the cluster to upload snapshot to. - hostname: A string, the name of the TradeFed host. - dev_infos: A list of DeviceInfo. - - Returns: - A JSON object. - """ - obj = {"time": int(time.time()), - "data": {}, - "cluster": cluster_id, - "hostname": hostname, - "tf_version": "(unknown)", - "type": "DeviceSnapshot", - "device_infos": [x.ToDeviceSnapshotJson() for x in dev_infos]} - return obj - - def SubmitHostEvents(self, host_events): - """Calls host_events.submit. - - Args: - host_events: A list of JSON objects. Currently DeviceSnapshot is - the only type of host events. - """ - json_obj = {"host_events": host_events} - logging.info("host_events.submit body=%s", json_obj) - self._service.host_events().submit(body=json_obj).execute() - - def SubmitCommandEvents(self, command_events): - """Calls command_events.submit. - - Args: - command_events: A list of JSON objects converted from CommandAttempt. - """ - json_obj = {"command_events": command_events} - logging.info("command_events.submit body=%s", json_obj) - self._service.command_events().submit(body=json_obj).execute() - - def NewRequest(self, request): - """Calls requests.new. - - Args: - request: An instance of Request. - - Returns: - A JSON object, the new request queued in the cluster. - - Sample - {'state': 'UNKNOWN', - 'command_line': 'vts-codelab --run-target sailfish', - 'id': '2', - 'user': 'testuser'} - """ - body = request.GetBody() - params = request.GetParameters() - logging.info("requests.new parameters=%s body=%s", params, body) - return self._service.requests().new(body=body, **params).execute() - - -def CreateTfcClient(api_root, oauth2_service_json, - api_name=API_NAME, api_version=API_VERSION, scopes=SCOPES): - """Builds an object of TFC service from a given URL. - - Args: - api_root: The URL to the service. - oauth2_service_json: The path to service account key file. - - Returns: - A TfcClient object. - """ - discovery_url = "%s/discovery/v1/apis/%s/%s/rest" % ( - api_root, api_name, api_version) - logging.info("Build service from: %s", discovery_url) - credentials = ServiceAccountCredentials.from_json_keyfile_name( - oauth2_service_json, scopes=scopes) - # httplib2.Http is not thread-safe. Use thread local object. - thread_local = threading.local() - thread_local.http = credentials.authorize(httplib2.Http()) - def BuildHttpRequest(unused_http, *args, **kwargs): - if not hasattr(thread_local, "http"): - thread_local.http = credentials.authorize(httplib2.Http()) - return http.HttpRequest(thread_local.http, *args, **kwargs) - - service = discovery.build( - api_name, api_version, http=thread_local.http, - discoveryServiceUrl=discovery_url, - requestBuilder=BuildHttpRequest) - return TfcClient(service) |