summaryrefslogtreecommitdiff
path: root/harnesses/host_controller/command_processor/command_build.py
diff options
context:
space:
mode:
Diffstat (limited to 'harnesses/host_controller/command_processor/command_build.py')
-rw-r--r--harnesses/host_controller/command_processor/command_build.py249
1 files changed, 0 insertions, 249 deletions
diff --git a/harnesses/host_controller/command_processor/command_build.py b/harnesses/host_controller/command_processor/command_build.py
deleted file mode 100644
index b1479d8..0000000
--- a/harnesses/host_controller/command_processor/command_build.py
+++ /dev/null
@@ -1,249 +0,0 @@
-#
-# Copyright (C) 2018 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 socket
-import threading
-import time
-
-from googleapiclient import errors
-
-from host_controller import common
-from host_controller.command_processor import base_command_processor
-from host_controller.console_argument_parser import ConsoleArgumentError
-from host_controller.tradefed import remote_operation
-
-
-class CommandBuild(base_command_processor.BaseCommandProcessor):
- """Command processor for build command.
-
- Attributes:
- arg_parser: ConsoleArgumentParser object, argument parser.
- build_thread: dict containing threading.Thread instances(s) that
- update build info regularly.
- console: cmd.Cmd console object.
- command: string, command name which this processor will handle.
- command_detail: string, detailed explanation for the command.
- """
-
- command = "build"
- command_detail = "Specifies branches and targets to monitor."
-
- def UpdateBuild(self, account_id, branch, targets, artifact_type, method,
- userinfo_file, noauth_local_webserver, verify_signed):
- """Updates the build state.
-
- Args:
- account_id: string, Partner Android Build account_id to use.
- branch: string, branch to grab the artifact from.
- targets: string, a comma-separate list of build target product(s).
- artifact_type: string, artifact type (`device`, 'gsi' or `test').
- method: string, method for getting build information.
- userinfo_file: string, the path of a file containing email and
- password (if method == POST).
- noauth_local_webserver: boolean, True to not use a local websever.
- verify_signed: A Boolean indicating whether to verify signed build.
- """
- builds = []
-
- self.console._build_provider["pab"].Authenticate(
- userinfo_file=userinfo_file,
- noauth_local_webserver=noauth_local_webserver)
- for target in targets.split(","):
- try:
- listed_builds = self.console._build_provider["pab"].GetBuildList(
- account_id=account_id,
- branch=branch,
- target=target,
- page_token="",
- max_results=100,
- method=method,
- verify_signed=verify_signed)
- except ValueError as e:
- logging.exception(e)
- continue
-
- for listed_build in listed_builds:
- if method == "GET":
- if "successful" in listed_build:
- if listed_build["successful"]:
- build = {}
- build["manifest_branch"] = branch
- build["build_id"] = listed_build["build_id"]
- if "-" in target:
- build["build_target"], build[
- "build_type"] = target.split("-")
- else:
- build["build_target"] = target
- build["build_type"] = ""
- build["artifact_type"] = artifact_type
- build["artifacts"] = []
- if "signed" in listed_build:
- build["signed"] = listed_build["signed"]
- else:
- build["signed"] = False
- builds.append(build)
- else:
- logging.error("Error: listed_build %s", listed_build)
- else: # POST
- build = {}
- build["manifest_branch"] = branch
- build["build_id"] = listed_build[u"1"]
- if "-" in target:
- (build["build_target"],
- build["build_type"]) = target.split("-")
- else:
- build["build_target"] = target
- build["build_type"] = ""
- build["artifact_type"] = artifact_type
- build["artifacts"] = []
- build["signed"] = False
- builds.append(build)
- self.console._vti_endpoint_client.UploadBuildInfo(builds)
-
- def UpdateBuildLoop(self, account_id, branch, target, artifact_type,
- method, userinfo_file, noauth_local_webserver,
- update_interval, verify_signed):
- """Regularly updates the build information.
-
- Args:
- account_id: string, Partner Android Build account_id to use.
- branch: string, branch to grab the artifact from.
- targets: string, a comma-separate list of build target product(s).
- artifact_type: string, artifcat type (`device`, 'gsi' or `test).
- method: string, method for getting build information.
- userinfo_file: string, the path of a file containing email and
- password (if method == POST).
- noauth_local_webserver: boolean, True to not use a local websever.
- update_interval: int, number of seconds before repeating
- """
- thread = threading.currentThread()
- while getattr(thread, 'keep_running', True):
- try:
- self.UpdateBuild(account_id, branch, target, artifact_type,
- method, userinfo_file, noauth_local_webserver,
- verify_signed)
- except (socket.error, remote_operation.RemoteOperationException,
- httplib2.HttpLib2Error, errors.HttpError) as e:
- logging.exception(e)
- time.sleep(update_interval)
-
- # @Override
- def SetUp(self):
- """Initializes the parser for build command."""
- self.build_thread = {}
- self.arg_parser.add_argument(
- "--update",
- choices=("single", "start", "stop", "list"),
- default="start",
- help="Update build info")
- self.arg_parser.add_argument(
- "--id",
- default=None,
- help="session ID only required for 'stop' update command")
- self.arg_parser.add_argument(
- "--interval",
- type=int,
- default=30,
- help="Interval (seconds) to repeat build update.")
- self.arg_parser.add_argument(
- "--artifact-type",
- choices=("device", "gsi", "test"),
- default="device",
- help="The type of an artifact to update")
- self.arg_parser.add_argument(
- "--branch",
- required=True,
- help="Branch to grab the artifact from.")
- self.arg_parser.add_argument(
- "--target",
- required=True,
- help="a comma-separate list of build target product(s).")
- self.arg_parser.add_argument(
- "--account_id",
- default=common._DEFAULT_ACCOUNT_ID,
- help="Partner Android Build account_id to use.")
- self.arg_parser.add_argument(
- "--method",
- default="GET",
- choices=("GET", "POST"),
- help="Method for getting build information")
- self.arg_parser.add_argument(
- "--userinfo-file",
- help=
- "Location of file containing email and password, if using POST.")
- self.arg_parser.add_argument(
- "--noauth_local_webserver",
- default=False,
- type=bool,
- help="True to not use a local webserver for authentication.")
- self.arg_parser.add_argument(
- "--verify-signed-build",
- default=False,
- type=bool,
- help="True to verify whether the build is signed.")
- # @Override
- def Run(self, arg_line):
- """Updates build info."""
- args = self.arg_parser.ParseLine(arg_line)
- if args.update == "single":
- self.UpdateBuild(args.account_id, args.branch, args.target,
- args.artifact_type, args.method,
- args.userinfo_file, args.noauth_local_webserver,
- args.verify_signed_build)
- elif args.update == "list":
- logging.info("Running build update sessions:")
- for id in self.build_thread:
- logging.info(" ID %d", id)
- elif args.update == "start":
- if args.interval <= 0:
- raise ConsoleArgumentError("update interval must be positive")
- # do not allow user to create new
- # thread if one is currently running
- if args.id is None:
- if not self.build_thread:
- args.id = 1
- else:
- args.id = max(self.build_thread) + 1
- else:
- args.id = int(args.id)
- if args.id in self.build_thread and not hasattr(
- self.build_thread[args.id], 'keep_running'):
- logging.warning(
- 'build update (session ID: %s) already running. '
- 'run build --update stop first.', args.id)
- return
- self.build_thread[args.id] = threading.Thread(
- target=self.UpdateBuildLoop,
- args=(
- args.account_id,
- args.branch,
- args.target,
- args.artifact_type,
- args.method,
- args.userinfo_file,
- args.noauth_local_webserver,
- args.interval,
- args.verify_signed_build,
- ))
- self.build_thread[args.id].daemon = True
- self.build_thread[args.id].start()
- elif args.update == "stop":
- if args.id is None:
- logging.error("--id must be set for stop")
- else:
- self.build_thread[int(args.id)].keep_running = False