Wait on runroot tasks with wait-task command
JIRA: COMPOSE-4027 Signed-off-by: Haibo Lin <hlin@redhat.com>
This commit is contained in:
parent
52f82ccc6e
commit
bce57c2e66
@ -73,7 +73,7 @@ class KojiWrapper(object):
|
|||||||
def get_runroot_cmd(self, target, arch, command, quiet=False, use_shell=True,
|
def get_runroot_cmd(self, target, arch, command, quiet=False, use_shell=True,
|
||||||
channel=None, packages=None, mounts=None, weight=None,
|
channel=None, packages=None, mounts=None, weight=None,
|
||||||
task_id=True, new_chroot=False, chown_paths=None):
|
task_id=True, new_chroot=False, chown_paths=None):
|
||||||
cmd = self._get_cmd("runroot")
|
cmd = self._get_cmd("runroot", "--nowait")
|
||||||
|
|
||||||
if quiet:
|
if quiet:
|
||||||
cmd.append("--quiet")
|
cmd.append("--quiet")
|
||||||
@ -152,15 +152,18 @@ class KojiWrapper(object):
|
|||||||
with self.get_koji_cmd_env() as env:
|
with self.get_koji_cmd_env() as env:
|
||||||
retcode, output = run(command, can_fail=True, logfile=log_file,
|
retcode, output = run(command, can_fail=True, logfile=log_file,
|
||||||
show_cmd=True, env=env, universal_newlines=True)
|
show_cmd=True, env=env, universal_newlines=True)
|
||||||
if "--task-id" in command:
|
|
||||||
first_line = output.splitlines()[0]
|
first_line = output.splitlines()[0]
|
||||||
if re.match(r'^\d+$', first_line):
|
match = re.search(r'^(\d+)$', first_line)
|
||||||
task_id = int(first_line)
|
if not match:
|
||||||
# Remove first line from the output, preserving any trailing newlines.
|
raise RuntimeError(
|
||||||
output_ends_with_eol = output.endswith("\n")
|
"Could not find task ID in output. Command '%s' returned '%s'."
|
||||||
output = "\n".join(output.splitlines()[1:])
|
% (" ".join(command), output)
|
||||||
if output_ends_with_eol:
|
)
|
||||||
output += "\n"
|
|
||||||
|
task_id = int(match.groups()[0])
|
||||||
|
|
||||||
|
retcode, output = self._wait_for_task(task_id, logfile=log_file)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"retcode": retcode,
|
"retcode": retcode,
|
||||||
|
@ -425,26 +425,26 @@ class LiveImageKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
||||||
def test_get_cmd_minimal(self):
|
def test_get_cmd_minimal(self):
|
||||||
cmd = self.koji.get_runroot_cmd('tgt', 's390x', 'date', use_shell=False, task_id=False)
|
cmd = self.koji.get_runroot_cmd('tgt', 's390x', 'date', use_shell=False, task_id=False)
|
||||||
self.assertEqual(len(cmd), 7)
|
self.assertEqual(len(cmd), 8)
|
||||||
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
||||||
self.assertEqual(cmd[-3], 'tgt')
|
self.assertEqual(cmd[-3], 'tgt')
|
||||||
self.assertEqual(cmd[-2], 's390x')
|
self.assertEqual(cmd[-2], 's390x')
|
||||||
self.assertEqual(cmd[-1], 'rm -f /var/lib/rpm/__db*; rm -rf /var/cache/yum/*; set -x; date')
|
self.assertEqual(cmd[-1], 'rm -f /var/lib/rpm/__db*; rm -rf /var/cache/yum/*; set -x; date')
|
||||||
six.assertCountEqual(self, cmd[3:-3], ["--channel-override=runroot-local"])
|
six.assertCountEqual(self, cmd[4:-3], ["--channel-override=runroot-local"])
|
||||||
|
|
||||||
def test_get_cmd_full(self):
|
def test_get_cmd_full(self):
|
||||||
cmd = self.koji.get_runroot_cmd('tgt', 's390x', ['/bin/echo', '&'],
|
cmd = self.koji.get_runroot_cmd('tgt', 's390x', ['/bin/echo', '&'],
|
||||||
quiet=True, channel='chan',
|
quiet=True, channel='chan',
|
||||||
packages=['lorax', 'some_other_package'],
|
packages=['lorax', 'some_other_package'],
|
||||||
mounts=['/tmp'], weight=1000)
|
mounts=['/tmp'], weight=1000)
|
||||||
self.assertEqual(len(cmd), 14)
|
self.assertEqual(len(cmd), 15)
|
||||||
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
||||||
self.assertEqual(cmd[-3], 'tgt')
|
self.assertEqual(cmd[-3], 'tgt')
|
||||||
self.assertEqual(cmd[-2], 's390x')
|
self.assertEqual(cmd[-2], 's390x')
|
||||||
self.assertEqual(cmd[-1], 'rm -f /var/lib/rpm/__db*; rm -rf /var/cache/yum/*; set -x; /bin/echo \'&\'')
|
self.assertEqual(cmd[-1], 'rm -f /var/lib/rpm/__db*; rm -rf /var/cache/yum/*; set -x; /bin/echo \'&\'')
|
||||||
six.assertCountEqual(
|
six.assertCountEqual(
|
||||||
self,
|
self,
|
||||||
cmd[3:-3],
|
cmd[4:-3],
|
||||||
["--channel-override=chan", "--quiet", "--use-shell",
|
["--channel-override=chan", "--quiet", "--use-shell",
|
||||||
"--task-id", "--weight=1000", "--package=some_other_package",
|
"--task-id", "--weight=1000", "--package=some_other_package",
|
||||||
"--package=lorax", "--mount=/tmp"],
|
"--package=lorax", "--mount=/tmp"],
|
||||||
@ -456,7 +456,7 @@ class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
quiet=True, channel='chan',
|
quiet=True, channel='chan',
|
||||||
packages=['lorax', 'some_other_package'],
|
packages=['lorax', 'some_other_package'],
|
||||||
mounts=['/tmp'], weight=1000, chown_paths=["/output dir", "/foo"])
|
mounts=['/tmp'], weight=1000, chown_paths=["/output dir", "/foo"])
|
||||||
self.assertEqual(len(cmd), 14)
|
self.assertEqual(len(cmd), 15)
|
||||||
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
self.assertEqual(cmd[:3], ['koji', '--profile=custom-koji', 'runroot'])
|
||||||
self.assertEqual(cmd[-3], 'tgt')
|
self.assertEqual(cmd[-3], 'tgt')
|
||||||
self.assertEqual(cmd[-2], 's390x')
|
self.assertEqual(cmd[-2], 's390x')
|
||||||
@ -466,7 +466,7 @@ class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
)
|
)
|
||||||
six.assertCountEqual(
|
six.assertCountEqual(
|
||||||
self,
|
self,
|
||||||
cmd[3:-3],
|
cmd[4:-3],
|
||||||
["--channel-override=chan", "--quiet", "--use-shell",
|
["--channel-override=chan", "--quiet", "--use-shell",
|
||||||
"--task-id", "--weight=1000", "--package=some_other_package",
|
"--task-id", "--weight=1000", "--package=some_other_package",
|
||||||
"--package=lorax", "--mount=/tmp"],
|
"--package=lorax", "--mount=/tmp"],
|
||||||
@ -476,21 +476,27 @@ class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
def test_run_runroot_cmd_no_task_id(self, run):
|
def test_run_runroot_cmd_no_task_id(self, run):
|
||||||
cmd = ['koji', 'runroot']
|
cmd = ['koji', 'runroot']
|
||||||
output = 'Output ...'
|
output = 'Output ...'
|
||||||
run.return_value = (0, output)
|
run.return_value = (1, output)
|
||||||
|
|
||||||
|
with self.assertRaises(RuntimeError) as ctx:
|
||||||
|
self.koji.run_runroot_cmd(cmd)
|
||||||
|
|
||||||
result = self.koji.run_runroot_cmd(cmd)
|
|
||||||
self.assertDictEqual(result, {'retcode': 0, 'output': output, 'task_id': None})
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
run.call_args_list,
|
run.call_args_list,
|
||||||
[mock.call(cmd, can_fail=True, env=None, logfile=None, show_cmd=True,
|
[mock.call(cmd, can_fail=True, env=None, logfile=None, show_cmd=True,
|
||||||
universal_newlines=True)]
|
universal_newlines=True)]
|
||||||
)
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
"Could not find task ID in output. Command '%s' returned '%s'." % (" ".join(cmd), output),
|
||||||
|
str(ctx.exception)
|
||||||
|
)
|
||||||
|
|
||||||
@mock.patch('pungi.wrappers.kojiwrapper.run')
|
@mock.patch('pungi.wrappers.kojiwrapper.run')
|
||||||
def test_run_runroot_cmd_with_task_id(self, run):
|
def test_run_runroot_cmd_with_task_id(self, run):
|
||||||
cmd = ['koji', 'runroot', '--task-id']
|
cmd = ['koji', 'runroot', '--task-id']
|
||||||
output = 'Output ...\n'
|
run.return_value = (0, '1234\n')
|
||||||
run.return_value = (0, '1234\n' + output)
|
output = "Output ..."
|
||||||
|
self.koji._wait_for_task = mock.Mock(return_value=(0, output))
|
||||||
|
|
||||||
result = self.koji.run_runroot_cmd(cmd)
|
result = self.koji.run_runroot_cmd(cmd)
|
||||||
self.assertDictEqual(result, {'retcode': 0, 'output': output, 'task_id': 1234})
|
self.assertDictEqual(result, {'retcode': 0, 'output': output, 'task_id': 1234})
|
||||||
@ -500,34 +506,6 @@ class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
universal_newlines=True)]
|
universal_newlines=True)]
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch('pungi.wrappers.kojiwrapper.run')
|
|
||||||
def test_run_runroot_cmd_with_task_id_and_fail(self, run):
|
|
||||||
cmd = ['koji', 'runroot', '--task-id']
|
|
||||||
output = 'You are not authorized to run this\n'
|
|
||||||
run.return_value = (1, output)
|
|
||||||
|
|
||||||
result = self.koji.run_runroot_cmd(cmd)
|
|
||||||
self.assertDictEqual(result, {'retcode': 1, 'output': output, 'task_id': None})
|
|
||||||
self.assertEqual(
|
|
||||||
run.call_args_list,
|
|
||||||
[mock.call(cmd, can_fail=True, env=None, logfile=None, show_cmd=True,
|
|
||||||
universal_newlines=True)]
|
|
||||||
)
|
|
||||||
|
|
||||||
@mock.patch('pungi.wrappers.kojiwrapper.run')
|
|
||||||
def test_run_runroot_cmd_with_task_id_and_fail_but_emit_id(self, run):
|
|
||||||
cmd = ['koji', 'runroot', '--task-id']
|
|
||||||
output = 'Nope, does not work.\n'
|
|
||||||
run.return_value = (1, '12345\n' + output)
|
|
||||||
|
|
||||||
result = self.koji.run_runroot_cmd(cmd)
|
|
||||||
self.assertDictEqual(result, {'retcode': 1, 'output': output, 'task_id': 12345})
|
|
||||||
self.assertEqual(
|
|
||||||
run.call_args_list,
|
|
||||||
[mock.call(cmd, can_fail=True, env=None, logfile=None, show_cmd=True,
|
|
||||||
universal_newlines=True)]
|
|
||||||
)
|
|
||||||
|
|
||||||
@mock.patch.dict('os.environ', {'FOO': 'BAR'}, clear=True)
|
@mock.patch.dict('os.environ', {'FOO': 'BAR'}, clear=True)
|
||||||
@mock.patch('shutil.rmtree')
|
@mock.patch('shutil.rmtree')
|
||||||
@mock.patch('tempfile.mkdtemp')
|
@mock.patch('tempfile.mkdtemp')
|
||||||
@ -538,10 +516,11 @@ class RunrootKojiWrapperTest(KojiWrapperBaseTestCase):
|
|||||||
self.koji.koji_module.config.keytab = 'foo'
|
self.koji.koji_module.config.keytab = 'foo'
|
||||||
cmd = ['koji', 'runroot']
|
cmd = ['koji', 'runroot']
|
||||||
output = 'Output ...'
|
output = 'Output ...'
|
||||||
run.return_value = (0, output)
|
run.return_value = (0, '1234\n')
|
||||||
|
self.koji._wait_for_task = mock.Mock(return_value=(0, output))
|
||||||
|
|
||||||
result = self.koji.run_runroot_cmd(cmd)
|
result = self.koji.run_runroot_cmd(cmd)
|
||||||
self.assertDictEqual(result, {'retcode': 0, 'output': output, 'task_id': None})
|
self.assertDictEqual(result, {'retcode': 0, 'output': output, 'task_id': 1234})
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
run.call_args_list,
|
run.call_args_list,
|
||||||
[mock.call(cmd, can_fail=True, env={'KRB5CCNAME': 'DIR:/tmp/foo', 'FOO': 'BAR'},
|
[mock.call(cmd, can_fail=True, env={'KRB5CCNAME': 'DIR:/tmp/foo', 'FOO': 'BAR'},
|
||||||
|
Loading…
Reference in New Issue
Block a user