#!/usr/bin/env python
"""mock_config/koji.py - Pull Mock configuration from Koji
"""
from subprocess import check_output
from .composition import ConfigurationObject
__all__ = ['from_koji']
[docs]class from_koji(ConfigurationObject):
"""Mock configration object to pull configuration from Koji
"""
def __init__(
self, tag=None, target=None, arch='x86_64', koji_profile='brew'
):
"""Create a koji-based mock(1) configuration object
:param str tag: The Koji tag to pull configuration from
:param str target: The Koji build target tag to pull configuration from
:param str arch: The Koji build architecture
:param str koji_profile: The koji configuration profile to use
One and only one of 'tag' or 'target' must be specified
"""
config = self.koji_mock_config(
tag=tag,
target=target,
arch=arch,
koji_profile=koji_profile
)
super(from_koji, self).__init__(body=config)
@classmethod
def koji_mock_config(
cls, tag=None, target=None, arch='x86_64', koji_profile='brew'
):
"""Get the Mock configuration for the given koji tag/target and arch
:param str tag: The Koji tag to pull configuration from
:param str target: The Koji build target to pull configuration from
:param str arch: The Koji build architecture
:param str koji_profile: The koji configuration profile to use
One and only one of 'tag' or 'target' must be specified
:rtype: str
:returns: The Mock configuration as string
"""
koji_cmd = [
cls.koji_exe(),
'--profile', koji_profile,
'mock_config',
'--arch', arch,
]
if tag and target:
raise RuntimeError(
"'tag' and 'target' arguments are mutually exclusive"
)
elif tag:
koji_cmd.extend(('--tag', tag))
elif target:
# Work-around for a BZ#1287185 in koji cli
tag = cls.koji_tag_for_target(
target=target,
koji_profile=koji_profile
)
koji_cmd.extend(('--tag', tag))
else:
raise RuntimeError(
"one of 'tag' and 'target' arguments must be specified"
)
output = check_output(koji_cmd)
return output
@classmethod
def koji_tag_for_target(cls, target, koji_profile='brew'):
"""Get the build tag for the given Koji target
:param str target: The Koji build target to get tag for
:rtype: str
:returns: The Koji tag as string
"""
koji_cmd = [
cls.koji_exe(),
'--profile', koji_profile,
'list-targets',
'--quiet',
'--name', target,
]
output = check_output(koji_cmd)
# If the terget is found the output is a single line with 3 whitespace
# delimited strings in it. The 2nd of which is the build tag name.
output = output.split()
if len(output) < 3:
# Of the output conatins less then 3 strings, we assume the taget
# was not found
raise RuntimeError(
"Could not find target '{}'".format(target)
)
# We do leave the possiblity we got more then 3 words in the output
# unhandled, we just assume the 2nd word is the build tag we need
return output[1]
@staticmethod
def koji_exe():
# We use the koji executable rather then the koji Python library because
# the library doesn't contain the configuration file parsing
# functionality
return '/usr/bin/koji'