aboutsummaryrefslogtreecommitdiff
path: root/image_chromeos.py
diff options
context:
space:
mode:
authorcmtice <cmtice@google.com>2015-05-27 16:59:37 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-06-10 06:17:17 +0000
commite5bc63bbed4e001b080c4ce0b18c5c78900d4786 (patch)
treed9b603a7bbe68ece5ffcd5d312d73a34e48f4704 /image_chromeos.py
parent0495c7175f1160877f121872241f44386705f667 (diff)
downloadtoolchain-utils-e5bc63bbed4e001b080c4ce0b18c5c78900d4786.tar.gz
Implement new global locking scheme for machines.
This CL implements a new machine locking mechanism using Autotest Front End servers. When locking/unlocking a lab machine, it uses the ChromeOS HW lab server; when locking/unlocking a local machine, it uses a local AFE server on chrotomation2. BUG=None TEST=Tested the script manually to lock/unlock machines and query status. Also tested with image_chromeos and with crosperf scripts. Change-Id: I2793bc1f7dc056e725694e81ded656d9f49d227b Reviewed-on: https://chrome-internal-review.googlesource.com/217560 Reviewed-by: Luis Lozano <llozano@chromium.org> Reviewed-by: David Sharp <dhsharp@google.com> Tested-by: Caroline Tice <cmtice@google.com> Commit-Queue: Caroline Tice <cmtice@google.com>
Diffstat (limited to 'image_chromeos.py')
-rwxr-xr-ximage_chromeos.py273
1 files changed, 143 insertions, 130 deletions
diff --git a/image_chromeos.py b/image_chromeos.py
index 4873734c..e9c581c1 100755
--- a/image_chromeos.py
+++ b/image_chromeos.py
@@ -20,6 +20,7 @@ import tempfile
import time
from utils import command_executer
+from utils import locks
from utils import logger
from utils import misc
from utils.file_utils import FileUtils
@@ -64,6 +65,12 @@ def DoImage(argv):
action="store_true",
default=False,
help="Force an image even if it is non-test.")
+ parser.add_option("-n", "--no_lock", dest="no_lock",
+ default=False, action="store_true",
+ help="Do not attempt to lock remote before imaging. "
+ "This option should only be used in cases where the "
+ "exclusive lock has already been acquired (e.g. in "
+ "a script that calls this one).")
parser.add_option("-l", "--logging_level", dest="log_level",
default="verbose",
help="Amount of logging to be used. Valid levels are "
@@ -117,146 +124,159 @@ def DoImage(argv):
if not os.path.exists(image) and image.find("xbuddy://") < 0:
Usage(parser, "Image file: " + image + " does not exist!")
- reimage = False
- local_image = False
- if image.find("xbuddy://") < 0:
- local_image = True
- image_checksum = FileUtils().Md5File(image, log_level=log_level)
+ try:
+ should_unlock = False
+ if not options.no_lock:
+ try:
+ status = locks.AcquireLock(list(options.remote.split()),
+ options.chromeos_root)
+ should_unlock = True
+ except Exception as e:
+ raise Exception("Error acquiring machine: %s" % str(e))
+
+ reimage = False
+ local_image = False
+ if image.find("xbuddy://") < 0:
+ local_image = True
+ image_checksum = FileUtils().Md5File(image, log_level=log_level)
- command = "cat " + checksum_file
- retval, device_checksum, _ = cmd_executer.CrosRunCommand(
- command,
- return_output=True,
- chromeos_root=options.chromeos_root,
- machine=options.remote)
+ command = "cat " + checksum_file
+ retval, device_checksum, _ = cmd_executer.CrosRunCommand(
+ command,
+ return_output=True,
+ chromeos_root=options.chromeos_root,
+ machine=options.remote)
- device_checksum = device_checksum.strip()
- image_checksum = str(image_checksum)
+ device_checksum = device_checksum.strip()
+ image_checksum = str(image_checksum)
- l.LogOutput("Image checksum: " + image_checksum)
- l.LogOutput("Device checksum: " + device_checksum)
+ l.LogOutput("Image checksum: " + image_checksum)
+ l.LogOutput("Device checksum: " + device_checksum)
- if image_checksum != device_checksum:
- [found, located_image] = LocateOrCopyImage(options.chromeos_root,
- image,
- board=board)
+ if image_checksum != device_checksum:
+ [found, located_image] = LocateOrCopyImage(options.chromeos_root,
+ image,
+ board=board)
- reimage = True
- l.LogOutput("Checksums do not match. Re-imaging...")
+ reimage = True
+ l.LogOutput("Checksums do not match. Re-imaging...")
- is_test_image = IsImageModdedForTest(options.chromeos_root,
- located_image, log_level)
+ is_test_image = IsImageModdedForTest(options.chromeos_root,
+ located_image, log_level)
- if not is_test_image and not options.force:
- logger.GetLogger().LogFatal("Have to pass --force to image a non-test "
- "image!")
- else:
- reimage = True
- found = True
- l.LogOutput("Using non-local image; Re-imaging...")
-
-
- if reimage:
- # If the device has /tmp mounted as noexec, image_to_live.sh can fail.
- command = "mount -o remount,rw,exec /tmp"
- cmd_executer.CrosRunCommand(command,
- chromeos_root=options.chromeos_root,
- machine=options.remote)
-
- real_src_dir = os.path.join(os.path.realpath(options.chromeos_root),
- "src")
- real_chroot_dir = os.path.join(os.path.realpath(options.chromeos_root),
- "chroot")
- if local_image:
- if located_image.find(real_src_dir) != 0:
- if located_image.find(real_chroot_dir) != 0:
- raise Exception("Located image: %s not in chromeos_root: %s" %
- (located_image, options.chromeos_root))
+ if not is_test_image and not options.force:
+ logger.GetLogger().LogFatal("Have to pass --force to image a non-test"
+ " image!")
+ else:
+ reimage = True
+ found = True
+ l.LogOutput("Using non-local image; Re-imaging...")
+
+
+ if reimage:
+ # If the device has /tmp mounted as noexec, image_to_live.sh can fail.
+ command = "mount -o remount,rw,exec /tmp"
+ cmd_executer.CrosRunCommand(command,
+ chromeos_root=options.chromeos_root,
+ machine=options.remote)
+
+ real_src_dir = os.path.join(os.path.realpath(options.chromeos_root),
+ "src")
+ real_chroot_dir = os.path.join(os.path.realpath(options.chromeos_root),
+ "chroot")
+ if local_image:
+ if located_image.find(real_src_dir) != 0:
+ if located_image.find(real_chroot_dir) != 0:
+ raise Exception("Located image: %s not in chromeos_root: %s" %
+ (located_image, options.chromeos_root))
+ else:
+ chroot_image = located_image[len(real_chroot_dir):]
else:
- chroot_image = located_image[len(real_chroot_dir):]
+ chroot_image = os.path.join(
+ "..",
+ located_image[len(real_src_dir):].lstrip("/"))
+
+ # Check to see if cros flash will work for the remote machine.
+ CheckForCrosFlash(options.chromeos_root, options.remote, log_level)
+
+ if local_image:
+ cros_flash_args = ["--board=%s" % board,
+ "--clobber-stateful",
+ options.remote,
+ chroot_image]
else:
- chroot_image = os.path.join(
- "..",
- located_image[len(real_src_dir):].lstrip("/"))
-
- # Check to see if cros flash will work for the remote machine.
- CheckForCrosFlash(options.chromeos_root, options.remote, log_level)
-
- if local_image:
- cros_flash_args = ["--board=%s" % board,
- "--clobber-stateful",
- options.remote,
- chroot_image]
- else:
- cros_flash_args = ["--board=%s" % board,
- "--clobber-stateful",
- options.remote,
- image]
-
- command = ("cros flash %s" % " ".join(cros_flash_args))
-
- # Workaround for crosbug.com/35684.
- os.chmod(misc.GetChromeOSKeyFile(options.chromeos_root), 0600)
- if log_level == "quiet":
- l.LogOutput("CMD : %s" % command)
- elif log_level == "average":
- cmd_executer.SetLogLevel("verbose");
- retval = cmd_executer.ChrootRunCommand(options.chromeos_root,
- command, command_timeout=1800)
-
- retries = 0
- while retval != 0 and retries < 2:
- retries += 1
+ cros_flash_args = ["--board=%s" % board,
+ "--clobber-stateful",
+ options.remote,
+ image]
+
+ command = ("cros flash %s" % " ".join(cros_flash_args))
+
+ # Workaround for crosbug.com/35684.
+ os.chmod(misc.GetChromeOSKeyFile(options.chromeos_root), 0600)
if log_level == "quiet":
- l.LogOutput("Imaging failed. Retry # %d." % retries)
l.LogOutput("CMD : %s" % command)
+ elif log_level == "average":
+ cmd_executer.SetLogLevel("verbose");
retval = cmd_executer.ChrootRunCommand(options.chromeos_root,
command, command_timeout=1800)
- if log_level == "average":
- cmd_executer.SetLogLevel(log_level)
+ retries = 0
+ while retval != 0 and retries < 2:
+ retries += 1
+ if log_level == "quiet":
+ l.LogOutput("Imaging failed. Retry # %d." % retries)
+ l.LogOutput("CMD : %s" % command)
+ retval = cmd_executer.ChrootRunCommand(options.chromeos_root,
+ command, command_timeout=1800)
+
+ if log_level == "average":
+ cmd_executer.SetLogLevel(log_level)
- if found == False:
- temp_dir = os.path.dirname(located_image)
- l.LogOutput("Deleting temp image dir: %s" % temp_dir)
- shutil.rmtree(temp_dir)
+ if found == False:
+ temp_dir = os.path.dirname(located_image)
+ l.LogOutput("Deleting temp image dir: %s" % temp_dir)
+ shutil.rmtree(temp_dir)
- logger.GetLogger().LogFatalIf(retval, "Image command failed")
+ logger.GetLogger().LogFatalIf(retval, "Image command failed")
- # Unfortunately cros_image_to_target.py sometimes returns early when the
- # machine isn't fully up yet.
- retval = EnsureMachineUp(options.chromeos_root, options.remote,
- log_level)
+ # Unfortunately cros_image_to_target.py sometimes returns early when the
+ # machine isn't fully up yet.
+ retval = EnsureMachineUp(options.chromeos_root, options.remote,
+ log_level)
- # If this is a non-local image, then the retval returned from
- # EnsureMachineUp is the one that will be returned by this function;
- # in that case, make sure the value in 'retval' is appropriate.
- if not local_image and retval == True:
- retval = 0
+ # If this is a non-local image, then the retval returned from
+ # EnsureMachineUp is the one that will be returned by this function;
+ # in that case, make sure the value in 'retval' is appropriate.
+ if not local_image and retval == True:
+ retval = 0
+ else:
+ retval = 1
+
+ if local_image:
+ if log_level == "average":
+ l.LogOutput("Verifying image.")
+ command = "echo %s > %s && chmod -w %s" % (image_checksum,
+ checksum_file,
+ checksum_file)
+ retval = cmd_executer.CrosRunCommand(command,
+ chromeos_root=options.chromeos_root,
+ machine=options.remote)
+ logger.GetLogger().LogFatalIf(retval, "Writing checksum failed.")
+
+ successfully_imaged = VerifyChromeChecksum(options.chromeos_root,
+ image,
+ options.remote, log_level)
+ logger.GetLogger().LogFatalIf(not successfully_imaged,
+ "Image verification failed!")
+ TryRemountPartitionAsRW(options.chromeos_root, options.remote,
+ log_level)
else:
- retval = 1
-
- if local_image:
- if log_level == "average":
- l.LogOutput("Verifying image.")
- command = "echo %s > %s && chmod -w %s" % (image_checksum,
- checksum_file,
- checksum_file)
- retval = cmd_executer.CrosRunCommand(command,
- chromeos_root=options.chromeos_root,
- machine=options.remote)
- logger.GetLogger().LogFatalIf(retval, "Writing checksum failed.")
-
- successfully_imaged = VerifyChromeChecksum(options.chromeos_root,
- image,
- options.remote, log_level)
- logger.GetLogger().LogFatalIf(not successfully_imaged,
- "Image verification failed!")
- TryRemountPartitionAsRW(options.chromeos_root, options.remote,
- log_level)
- else:
- l.LogOutput("Checksums match. Skipping reimage")
- return retval
+ l.LogOutput("Checksums match. Skipping reimage")
+ return retval
+ finally:
+ if should_unlock:
+ locks.ReleaseLock(list(options.remote.split()), options.chromeos_root)
def LocateOrCopyImage(chromeos_root, image, board=None):
@@ -396,13 +416,6 @@ def EnsureMachineUp(chromeos_root, remote, log_level):
return True
-def Main(argv):
- misc.AcquireLock(lock_file)
- try:
- return DoImage(argv)
- finally:
- misc.ReleaseLock(lock_file)
-
-
if __name__ == "__main__":
- sys.exit(Main(sys.argv))
+ retval = DoImage(sys.argv)
+ sys.exit(retval)