Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(654)

Unified Diff: client/common_lib/chromiumos_updater.py

Issue 3175034: call update_engine_client and wait on exit code. (Closed) Base URL: http://src.chromium.org/git/autotest.git
Patch Set: Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/common_lib/chromiumos_updater.py
diff --git a/client/common_lib/chromiumos_updater.py b/client/common_lib/chromiumos_updater.py
index f566ea35b2f581973e3b04e6b757ddd18452389f..7b1ead833cf367e0e58d30a96c612f28bf050344 100644
--- a/client/common_lib/chromiumos_updater.py
+++ b/client/common_lib/chromiumos_updater.py
@@ -8,14 +8,12 @@ import re
import socket
import urlparse
-from autotest_lib.client.bin import site_utils
from autotest_lib.client.common_lib import error
-
STATEFULDEV_UPDATER = '/usr/local/bin/stateful_update'
UPDATER_BIN = '/usr/bin/update_engine_client'
UPDATER_IDLE = 'UPDATE_STATUS_IDLE'
-UPDATER_NEED_REBOOT = 'UPDATED_NEED_REBOOT'
+UPDATER_NEED_REBOOT = 'UPDATE_STATUS_UPDATED_NEED_REBOOT'
class ChromiumOSError(error.InstallError):
@@ -35,15 +33,28 @@ class ChromiumOSUpdater():
self.update_url = update_url
self.update_version = url_to_version(update_url)
+
def check_update_status(self):
update_status_cmd = ' '.join([UPDATER_BIN, '-status', '2>&1',
'| grep CURRENT_OP'])
update_status = self._run(update_status_cmd)
return update_status.stdout.strip().split('=')[-1]
+
+ def reset_update_engine(self):
+ self._run('initctl stop update-engine')
petkov 2010/08/23 19:20:31 Does this throw an exception if update-engine is n
+ self._run('rm -f /tmp/update_engine_autoupdate_completed')
+ self._run('initctl start update-engine')
+ # May need to wait if service becomes slow to restart.
+ if self.check_update_status() != UPDATER_IDLE:
+ raise ChromiumOSError('%s is not in an installable state' %
+ self.host.hostname)
+
+
def _run(self, cmd, *args, **kwargs):
return self.host.run(cmd, *args, **kwargs)
+
def run_update(self):
# TODO(seano): Retrieve update_engine.log from target host.
if not self.update_url:
@@ -65,53 +76,49 @@ class ChromiumOSUpdater():
# update left the machine in a good state. Reset update_engine's
# state & ensure that update_engine is idle.
if self.check_update_status() != UPDATER_IDLE:
petkov 2010/08/23 19:20:31 This may throw an exception if update-engine is no
- self._run('initctl stop update-engine')
- self._run('rm -f /tmp/update_engine_autoupdate_completed')
- self._run('initctl start update-engine')
- # May need to wait if service becomes slow to restart.
- if self.check_update_status() != UPDATER_IDLE:
- raise ChromiumOSError('%s is not in an installable state' %
- self.host.hostname)
-
- # First, attempt dev & test tools update (which don't live on
- # the rootfs). This must succeed so that the newly installed
- # host is testable after we run the autoupdater.
- statefuldev_url = self.update_url.replace('update', 'static/archive')
-
- statefuldev_cmd = ' '.join([STATEFULDEV_UPDATER, statefuldev_url,
- '2>&1'])
- logging.info(statefuldev_cmd)
- try:
- self._run(statefuldev_cmd, timeout=1200)
- except error.AutoservRunError, e:
- raise ChromiumOSError('stateful_update failed on %s' %
- self.host.hostname)
+ self.reset_update_engine()
# Run autoupdate command. This tells the autoupdate process on
# the host to look for an update at a specific URL and version
# string.
autoupdate_cmd = ' '.join([UPDATER_BIN,
+ '--update',
'--omaha_url=%s' % self.update_url,
- '--app_version ForcedUpdate'])
+ '--app_version ForcedUpdate',
petkov 2010/08/23 19:20:31 FYI, currently --update implies --app_version=Forc
+ ' 2>&1'])
logging.info(autoupdate_cmd)
try:
- self._run(autoupdate_cmd, timeout=60)
+ self._run(autoupdate_cmd, timeout=900)
except error.AutoservRunError, e:
- raise ChromiumOSError('unable to run updater on %s' %
+ # Either a runtime error occurred on the host, or
+ # update_engine_client exited with > 0.
+ raise ChromiumOSError('update_engine failed on %s' %
self.host.hostname)
# Check that the installer completed as expected.
- def update_successful():
- status = self.check_update_status()
- if status == UPDATER_IDLE:
- raise ChromiumOSError('update-engine error on %s' %
- self.host.hostname)
- else:
- return 'UPDATED_NEED_REBOOT' in status
-
- site_utils.poll_for_condition(update_successful,
- ChromiumOSError('Updater failed'),
- 900, 10)
+ status = self.check_update_status()
+ if status != UPDATER_NEED_REBOOT:
+ # TODO(seano): should we aggressively reset update-engine here?
petkov 2010/08/23 19:20:31 It might be good to somehow log /var/log/update_en
+ raise ChromiumOSError('update-engine error on %s: '
+ '"%s" from update-engine' %
+ (self.host.hostname, status))
+
+ # Attempt dev & test tools update (which don't live on the
+ # rootfs). This must succeed so that the newly installed host
+ # is testable after we run the autoupdater.
+ statefuldev_url = self.update_url.replace('update', 'static/archive')
+
+ statefuldev_cmd = ' '.join([STATEFULDEV_UPDATER, statefuldev_url,
+ '2>&1'])
+ logging.info(statefuldev_cmd)
+ try:
+ self._run(statefuldev_cmd, timeout=600)
+ except error.AutoservRunError, e:
+ # TODO(seano): If statefuldev update failed, we must mark
+ # the update as failed, and keep the same rootfs after
+ # reboot.
+ raise ChromiumOSError('stateful_update failed on %s' %
+ self.host.hostname)
return True
@@ -126,6 +133,7 @@ class ChromiumOSUpdater():
else:
return True
+
def get_build_id(self):
"""Turns the CHROMEOS_RELEASE_DESCRIPTION into a string that
matches the build ID."""
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698