from io import StringIO
from teuthology.orchestra import run
+from teuthology.contextutil import safe_while
from teuthology.task.install.util import _get_builder_project, _get_local_dir
log = logging.getLogger(__name__)
+def _retry_if_eagain_in_output(remote, args):
+ # wait at most 5 minutes
+ with safe_while(sleep=10, tries=30) as proceed:
+ while proceed():
+ stderr = StringIO()
+ try:
+ return remote.run(args=args, stderr=stderr)
+ except run.CommandFailedError:
+ if "could not get lock" in stderr.getvalue().lower():
+ stdout = StringIO()
+ args = ['sudo', 'fuser', '-v', '/var/lib/dpkg/lock-frontend']
+ remote.run(args=args, stdout=stdout)
+ log.info("The processes holding 'lock-frontend':\n{}".format(stdout.getvalue()))
+ continue
+ else:
+ raise
+
+def install_dep_packages(remote, args):
+ _retry_if_eagain_in_output(remote, args)
def _update_package_list_and_install(ctx, remote, debs, config):
"""
'Dpkg::Options::="--force-confold"'),
'install',
]
- remote.run(
+ install_dep_packages(remote,
args=install_cmd + ['%s=%s' % (d, version) for d in debs],
)
if system_pkglist:
- remote.run(
+ install_dep_packages(remote,
args=install_cmd + system_pkglist,
)
ldir = _get_local_dir(config, remote)
builder.install_repo()
remote.run(args=['sudo', 'apt-get', 'update'], check_status=False)
- remote.run(
+ install_dep_packages(remote,
args=[
'sudo',
'DEBIAN_FRONTEND=noninteractive', 'apt-get', '-y', '--force-yes',
get_koji_task_result,
get_builder_project,
)
+from teuthology.task.install.deb import install_dep_packages
log = logging.getLogger(__name__)
# Note that a dependency list may have multiple comma-separated entries,
# but also each entry may be an alternative (pkg1 | pkg2)
if 'debian' in ostype:
- remote.run(args=['sudo', 'apt-get', '-y', 'install',
- 'linux-image-amd64'], stdout=output)
+ args=['sudo', 'apt-get', '-y', 'install', 'linux-image-amd64']
+ install_dep_packages(remote, args)
remote.run(args=['dpkg', '-s', 'linux-image-amd64'], stdout=output)
for line in output.getvalue().split('\n'):
if 'Depends:' in line:
# Ubuntu is a depend in a depend.
if 'ubuntu' in ostype:
try:
- remote.run(args=['sudo', 'DEBIAN_FRONTEND=noninteractive',
- 'apt-get', '-y', 'install',
- 'linux-image-current-generic'])
+ args=['sudo', 'DEBIAN_FRONTEND=noninteractive',
+ 'apt-get', '-y', 'install', 'linux-image-current-generic']
+ install_dep_packages(remote, args)
remote.run(args=['dpkg', '-s', 'linux-image-current-generic'],
stdout=output)
for line in output.getvalue().split('\n'):
if 'Depends:' in line:
depends = line.split('Depends: ')[1]
- remote.run(args=['sudo', 'apt-get', '-y', 'install',
- depends])
+ install_dep_packages(remote, args=['sudo', 'apt-get', '-y',
+ 'install', depends])
remote.run(args=['dpkg', '-s', depends], stdout=output)
except run.CommandFailedError:
# Non precise ubuntu machines (like trusty) don't have
# linux-image-current-generic so use linux-image-generic instead.
- remote.run(args=['sudo', 'DEBIAN_FRONTEND=noninteractive',
- 'apt-get', '-y', 'install',
- 'linux-image-generic'], stdout=output)
+ args=['sudo', 'DEBIAN_FRONTEND=noninteractive',
+ 'apt-get', '-y', 'install', 'linux-image-generic']
+ install_dep_packages(remote, args)
remote.run(args=['dpkg', '-s', 'linux-image-generic'],
stdout=output)
for line in output.getvalue().split('\n'):