[koji-wrapper] Add support for spin-livemedia
This patch adds support for live media creator in Koji. The intended workflow is to create a command , run it and finally collect built artifacts. get_live_media_cmd() run_blocking_cmd() get_image_paths() Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
parent
ae30c07553
commit
a5a0f3d69f
@ -127,6 +127,33 @@ class KojiWrapper(object):
|
|||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|
||||||
|
def get_live_media_cmd(self, options, wait=True):
|
||||||
|
# Usage: koji spin-livemedia [options] <name> <version> <target> <arch> <kickstart-file>
|
||||||
|
cmd = ['koji', 'spin-livemedia']
|
||||||
|
|
||||||
|
for key in ('name', 'version', 'target', 'arch', 'ksfile'):
|
||||||
|
if key not in options:
|
||||||
|
raise ValueError('Expected options to have key "%s"' % key)
|
||||||
|
cmd.append(pipes.quote(options[key]))
|
||||||
|
|
||||||
|
if 'install_tree' not in options:
|
||||||
|
raise ValueError('Expected options to have key "install_tree"')
|
||||||
|
cmd.append('--install-tree=%s' % pipes.quote(options['install_tree']))
|
||||||
|
|
||||||
|
for repo in options.get('repo', []):
|
||||||
|
cmd.append('--repo=%s' % pipes.quote(repo))
|
||||||
|
|
||||||
|
if options.get('scratch'):
|
||||||
|
cmd.append('--scratch')
|
||||||
|
|
||||||
|
if options.get('skip_tag'):
|
||||||
|
cmd.append('--skip-tag')
|
||||||
|
|
||||||
|
if wait:
|
||||||
|
cmd.append('--wait')
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
|
||||||
def get_create_image_cmd(self, name, version, target, arch, ks_file, repos, image_type="live", image_format=None, release=None, wait=True, archive=False, specfile=None):
|
def get_create_image_cmd(self, name, version, target, arch, ks_file, repos, image_type="live", image_format=None, release=None, wait=True, archive=False, specfile=None):
|
||||||
# Usage: koji spin-livecd [options] <name> <version> <target> <arch> <kickstart-file>
|
# Usage: koji spin-livecd [options] <name> <version> <target> <arch> <kickstart-file>
|
||||||
# Usage: koji spin-appliance [options] <name> <version> <target> <arch> <kickstart-file>
|
# Usage: koji spin-appliance [options] <name> <version> <target> <arch> <kickstart-file>
|
||||||
@ -204,7 +231,8 @@ class KojiWrapper(object):
|
|||||||
|
|
||||||
match = re.search(r"Created task: (\d+)", output)
|
match = re.search(r"Created task: (\d+)", output)
|
||||||
if not match:
|
if not match:
|
||||||
raise RuntimeError("Could not find task ID in output. Command '%s' returned '%s'." % (" ".join(command), output))
|
raise RuntimeError("Could not find task ID in output. Command '%s' returned '%s'."
|
||||||
|
% (" ".join(command), output))
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
"retcode": retcode,
|
"retcode": retcode,
|
||||||
@ -224,7 +252,7 @@ class KojiWrapper(object):
|
|||||||
children_tasks = self.koji_proxy.getTaskChildren(task_id, request=True)
|
children_tasks = self.koji_proxy.getTaskChildren(task_id, request=True)
|
||||||
|
|
||||||
for child_task in children_tasks:
|
for child_task in children_tasks:
|
||||||
if child_task['method'] != 'createImage':
|
if child_task['method'] not in ['createImage', 'createLiveMedia']:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
is_scratch = child_task['request'][-1].get('scratch', False)
|
is_scratch = child_task['request'][-1].get('scratch', False)
|
||||||
|
@ -254,5 +254,45 @@ class KojiWrapperTest(unittest.TestCase):
|
|||||||
'/koji/task/12387277/Fedora-Cloud-Base-23-20160103.x86_64.raw.xz'])
|
'/koji/task/12387277/Fedora-Cloud-Base-23-20160103.x86_64.raw.xz'])
|
||||||
|
|
||||||
|
|
||||||
|
class LiveMediaTestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.koji_profile = mock.Mock()
|
||||||
|
with mock.patch('pungi.wrappers.kojiwrapper.koji') as koji:
|
||||||
|
koji.get_profile_module = mock.Mock(
|
||||||
|
return_value=mock.Mock(
|
||||||
|
pathinfo=mock.Mock(
|
||||||
|
work=mock.Mock(return_value='/koji'),
|
||||||
|
taskrelpath=mock.Mock(side_effect=lambda id: 'task/' + str(id)),
|
||||||
|
imagebuild=mock.Mock(side_effect=lambda id: '/koji/imagebuild/' + str(id)),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.koji_profile = koji.get_profile_module.return_value
|
||||||
|
self.koji = KojiWrapper('koji')
|
||||||
|
|
||||||
|
def test_get_live_media_cmd_minimal(self):
|
||||||
|
opts = {
|
||||||
|
'name': 'name', 'version': '1', 'target': 'tgt', 'arch': 'x,y,z',
|
||||||
|
'ksfile': 'kickstart', 'install_tree': '/mnt/os'
|
||||||
|
}
|
||||||
|
cmd = self.koji.get_live_media_cmd(opts)
|
||||||
|
self.assertEqual(cmd,
|
||||||
|
['koji', 'spin-livemedia', 'name', '1', 'tgt', 'x,y,z', 'kickstart',
|
||||||
|
'--install-tree=/mnt/os', '--wait'])
|
||||||
|
|
||||||
|
def test_get_live_media_cmd_full(self):
|
||||||
|
opts = {
|
||||||
|
'name': 'name', 'version': '1', 'target': 'tgt', 'arch': 'x,y,z',
|
||||||
|
'ksfile': 'kickstart', 'install_tree': '/mnt/os', 'scratch': True,
|
||||||
|
'repo': ['repo-1', 'repo-2'], 'skip_tag': True,
|
||||||
|
}
|
||||||
|
cmd = self.koji.get_live_media_cmd(opts)
|
||||||
|
self.assertEqual(cmd[:8],
|
||||||
|
['koji', 'spin-livemedia', 'name', '1', 'tgt', 'x,y,z', 'kickstart',
|
||||||
|
'--install-tree=/mnt/os'])
|
||||||
|
self.assertItemsEqual(cmd[8:],
|
||||||
|
['--repo=repo-1', '--repo=repo-2', '--skip-tag', '--scratch', '--wait'])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user