PR#4123: download-logs: prefer getBuildLogs for builds
Merges #4123 https://pagure.io/koji/pull-request/4123 Fixes: #4122 https://pagure.io/koji/issue/4122 download-logs --nvr fails to get logs in many cases
This commit is contained in:
commit
9ba4398211
2 changed files with 48 additions and 12 deletions
|
|
@ -7107,25 +7107,31 @@ def anon_handle_download_logs(options, session, args):
|
||||||
save_logs(child_task['id'], match, task_log_dir, recurse)
|
save_logs(child_task['id'], match, task_log_dir, recurse)
|
||||||
|
|
||||||
ensure_connection(session, options)
|
ensure_connection(session, options)
|
||||||
task_id = None
|
|
||||||
build_id = None
|
|
||||||
for arg in args:
|
for arg in args:
|
||||||
|
task_id = None
|
||||||
|
build_id = None
|
||||||
if suboptions.nvr:
|
if suboptions.nvr:
|
||||||
suboptions.recurse = True
|
suboptions.recurse = True
|
||||||
binfo = session.getBuild(arg)
|
binfo = session.getBuild(arg)
|
||||||
if binfo is None:
|
if binfo is None:
|
||||||
error("There is no build with n-v-r: %s" % arg)
|
error("There is no build with n-v-r: %s" % arg)
|
||||||
if binfo.get('task_id'):
|
b_state = koji.BUILD_STATES[binfo['state']]
|
||||||
task_id = binfo['task_id']
|
# getBuildLogs will only work for complete builds
|
||||||
sys.stdout.write("Using task ID: %s\n" % task_id)
|
if b_state == 'COMPLETE':
|
||||||
elif binfo.get('build_id'):
|
|
||||||
build_id = binfo['build_id']
|
build_id = binfo['build_id']
|
||||||
sys.stdout.write("Using build ID: %s\n" % build_id)
|
sys.stdout.write("Using build ID: %s\n" % build_id)
|
||||||
|
elif binfo.get('task_id'):
|
||||||
|
# try falling back to the task logs
|
||||||
|
task_id = binfo['task_id']
|
||||||
|
sys.stdout.write("Build %s is %s\n" % (arg, b_state))
|
||||||
|
sys.stdout.write("Using task ID: %s\n" % task_id)
|
||||||
|
else:
|
||||||
|
sys.stdout.write("Unable to download build %s (state=%s)\n" % (arg, b_state))
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
task_id = int(arg)
|
task_id = int(arg)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
error("Task id must be number: %r" % arg)
|
error("Task id must be a number: %r" % arg)
|
||||||
if task_id:
|
if task_id:
|
||||||
save_logs(task_id, suboptions.match, suboptions.dir, suboptions.recurse)
|
save_logs(task_id, suboptions.match, suboptions.dir, suboptions.recurse)
|
||||||
elif build_id:
|
elif build_id:
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ except ImportError:
|
||||||
import mock
|
import mock
|
||||||
import six
|
import six
|
||||||
|
|
||||||
|
import koji
|
||||||
|
|
||||||
from koji_cli.commands import anon_handle_download_logs
|
from koji_cli.commands import anon_handle_download_logs
|
||||||
from . import utils
|
from . import utils
|
||||||
|
|
||||||
|
|
@ -41,6 +43,7 @@ Note this command only downloads task logs, not build logs.
|
||||||
""" % (self.progname, self.progname, self.progname)
|
""" % (self.progname, self.progname, self.progname)
|
||||||
self.nvr = 'bash-1.2.3-f26'
|
self.nvr = 'bash-1.2.3-f26'
|
||||||
self.task_id = 123456
|
self.task_id = 123456
|
||||||
|
self.build_id = 232323
|
||||||
|
|
||||||
self.builtin_open = None
|
self.builtin_open = None
|
||||||
if six.PY2:
|
if six.PY2:
|
||||||
|
|
@ -59,7 +62,7 @@ Note this command only downloads task logs, not build logs.
|
||||||
anon_handle_download_logs,
|
anon_handle_download_logs,
|
||||||
self.options, self.session, [task_id],
|
self.options, self.session, [task_id],
|
||||||
stdout='',
|
stdout='',
|
||||||
stderr='Task id must be number: %r\n' % task_id,
|
stderr='Task id must be a number: %r\n' % task_id,
|
||||||
activate_session=None,
|
activate_session=None,
|
||||||
exit_code=1
|
exit_code=1
|
||||||
)
|
)
|
||||||
|
|
@ -102,7 +105,31 @@ Note this command only downloads task logs, not build logs.
|
||||||
self.session.getTaskChildren.assert_not_called()
|
self.session.getTaskChildren.assert_not_called()
|
||||||
|
|
||||||
def test_anon_handle_download_logs_nvr(self):
|
def test_anon_handle_download_logs_nvr(self):
|
||||||
self.session.getBuild.return_value = {'task_id': self.task_id}
|
self.session.getBuild.return_value = {'task_id': self.task_id,
|
||||||
|
'build_id': self.build_id,
|
||||||
|
'state': koji.BUILD_STATES['COMPLETE']}
|
||||||
|
self.session.getBuildLogs.return_value = [
|
||||||
|
{'dir': 'noarch', 'name': 'test.log', 'path': 'path/to/test.log'},
|
||||||
|
]
|
||||||
|
rv = anon_handle_download_logs(self.options, self.session, ['--nvr', self.nvr])
|
||||||
|
actual = self.stdout.getvalue()
|
||||||
|
expected = 'Using build ID: %s\n' % self.build_id
|
||||||
|
self.assertMultiLineEqual(actual, expected)
|
||||||
|
self.assertIsNone(rv)
|
||||||
|
|
||||||
|
self.session.getBuild.assert_called_once_with(self.nvr)
|
||||||
|
self.session.getBuildLogs.assert_called_once_with(self.build_id)
|
||||||
|
self.session.getTaskInfo.assert_not_called()
|
||||||
|
self.session.downloadTaskOutput.assert_not_called()
|
||||||
|
self.session.getTaskChildren.assert_not_called()
|
||||||
|
self.download_file.assert_called_once()
|
||||||
|
|
||||||
|
def test_anon_handle_download_logs_nvr_with_task_id(self):
|
||||||
|
# for a failed build with a task id we should fall back to fetching task logs
|
||||||
|
self.session.getBuild.return_value = {'build_id': self.build_id,
|
||||||
|
'task_id': self.task_id,
|
||||||
|
'nvr': self.nvr,
|
||||||
|
'state': koji.BUILD_STATES['FAILED']}
|
||||||
self.session.getTaskInfo.return_value = {
|
self.session.getTaskInfo.return_value = {
|
||||||
'arch': 'x86_64',
|
'arch': 'x86_64',
|
||||||
'state': 'CLOSED',
|
'state': 'CLOSED',
|
||||||
|
|
@ -112,7 +139,7 @@ Note this command only downloads task logs, not build logs.
|
||||||
|
|
||||||
rv = anon_handle_download_logs(self.options, self.session, ['--nvr', self.nvr])
|
rv = anon_handle_download_logs(self.options, self.session, ['--nvr', self.nvr])
|
||||||
actual = self.stdout.getvalue()
|
actual = self.stdout.getvalue()
|
||||||
expected = 'Using task ID: %s\n' % self.task_id
|
expected = 'Build %s is FAILED\nUsing task ID: %s\n' % (self.nvr, self.task_id)
|
||||||
self.assertMultiLineEqual(actual, expected)
|
self.assertMultiLineEqual(actual, expected)
|
||||||
self.assertIsNone(rv)
|
self.assertIsNone(rv)
|
||||||
|
|
||||||
|
|
@ -121,11 +148,14 @@ Note this command only downloads task logs, not build logs.
|
||||||
self.session.downloadTaskOutput.assert_not_called()
|
self.session.downloadTaskOutput.assert_not_called()
|
||||||
self.session.getTaskChildren.assert_has_calls([mock.call(self.task_id), mock.call(23), ])
|
self.session.getTaskChildren.assert_has_calls([mock.call(self.task_id), mock.call(23), ])
|
||||||
|
|
||||||
|
|
||||||
def test_anon_handle_download_logs_nvr_without_task_id(self):
|
def test_anon_handle_download_logs_nvr_without_task_id(self):
|
||||||
self.session.getBuild.return_value = {'build_id': 1, 'nvr': self.nvr}
|
self.session.getBuild.return_value = {'build_id': self.build_id,
|
||||||
|
'nvr': self.nvr,
|
||||||
|
'state': koji.BUILD_STATES['FAILED']}
|
||||||
rv = anon_handle_download_logs(self.options, self.session, ['--nvr', self.nvr])
|
rv = anon_handle_download_logs(self.options, self.session, ['--nvr', self.nvr])
|
||||||
actual = self.stdout.getvalue()
|
actual = self.stdout.getvalue()
|
||||||
expected = 'Using build ID: 1\n'
|
expected = 'Unable to download build %s (state=FAILED)\n' % self.nvr
|
||||||
self.assertMultiLineEqual(actual, expected)
|
self.assertMultiLineEqual(actual, expected)
|
||||||
self.assertIsNone(rv)
|
self.assertIsNone(rv)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue