CLI mock-config: when topdir option, remove topurl value

Fixes: https://pagure.io/koji/issue/2675
This commit is contained in:
Jana Cupova 2021-11-23 22:25:08 +01:00 committed by Tomas Kopecek
parent 0b911ed0c4
commit f528fd9ca4
2 changed files with 185 additions and 164 deletions

View file

@ -1043,9 +1043,11 @@ def anon_handle_mock_config(goptions, session, args):
parser.add_option("--buildroot",
help="Duplicate the mock config for the specified buildroot id")
parser.add_option("--mockdir", default="/var/lib/mock", metavar="DIR", help="Specify mockdir")
parser.add_option("--topdir", metavar="DIR", help="Specify topdir")
parser.add_option("--topurl", metavar="URL", default=goptions.topurl,
help="URL under which Koji files are accessible")
parser.add_option("--topdir", metavar="DIR",
help="Specify topdir, topdir tops the topurl")
parser.add_option("--topurl", metavar="URL",
help="URL under which Koji files are accessible, "
"when topdir is specified, topdir tops the topurl")
parser.add_option("--distribution", default="Koji Testing",
help="Change the distribution macro")
parser.add_option("--yum-proxy", help="Specify a yum proxy")
@ -1062,7 +1064,12 @@ def anon_handle_mock_config(goptions, session, args):
opts = {}
for k in ('topdir', 'topurl', 'distribution', 'mockdir', 'yum_proxy'):
if hasattr(options, k):
opts[k] = getattr(options, k)
if getattr(options, k) is not None:
opts[k] = getattr(options, k)
if opts.get('topdir') and opts.get('topurl'):
del opts['topurl']
if not opts.get('topdir') and not opts.get('topurl'):
opts['topurl'] = goptions.topurl
if options.buildroot:
try:
br_id = int(options.buildroot)

View file

@ -4,6 +4,7 @@ import unittest
import mock
import six
import koji
from koji_cli.commands import anon_handle_mock_config
from . import utils
@ -15,6 +16,12 @@ class TestMockConfig(utils.CliTestCase):
maxDiff = None
def setUp(self):
self.options = mock.MagicMock()
self.options.debug = False
self.session = mock.MagicMock()
self.session.getAPIVersion.return_value = koji.API_VERSION
self.gen_config_mock = mock.patch('koji.genMockConfig').start()
self.ensure_connection_mock = mock.patch('koji_cli.commands.ensure_connection').start()
self.maxDiff = None
self.common_args = [
'--distribution', 'fedora',
@ -58,16 +65,9 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
%s: error: {message}
""" % (self.progname, self.progname)
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
@mock.patch('koji.genMockConfig')
@mock.patch('koji_cli.commands.ensure_connection')
def test_handle_mock_config_buildroot_option(
self, ensure_connection_mock, gen_config_mock, stdout, stderr):
def test_handle_mock_config_buildroot_option(self, stdout):
"""Test anon_handle_mock_config buildroot options"""
arguments = []
options = mock.MagicMock()
buildroot_info = {
'repo_id': 101,
'tag_name': 'tag_name',
@ -75,100 +75,103 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
}
# Mock out the xmlrpc server
session = mock.MagicMock()
session.getBuildroot.return_value = buildroot_info
self.session.getBuildroot.return_value = buildroot_info
# Mock config
gen_config_mock.return_value = self.mock_output
self.gen_config_mock.return_value = self.mock_output
# buildroot check
arguments = ['--buildroot', 'root', self.progname]
expected = self.format_error_message("Buildroot id must be an integer")
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
exit_code=2,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = self.common_args + ['--buildroot', '1',
'--name', self.progname]
arguments = self.common_args + ['--buildroot', '1', '--name', self.progname]
opts = self.common_opts.copy()
opts.update({
'repoid': buildroot_info['repo_id'],
'tag_name': buildroot_info['tag_name'],
'tag_macros': {},
})
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
gen_config_mock.assert_called_with(
self.progname, buildroot_info['arch'], **opts)
del opts['topurl']
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.gen_config_mock.assert_called_with(self.progname, buildroot_info['arch'], **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = self.common_args + ['--buildroot', '1',
'--name', self.progname,
'--latest']
opts['repoid'] = 'latest'
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
gen_config_mock.assert_called_with(
self.progname, buildroot_info['arch'], **opts)
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.gen_config_mock.assert_called_with(self.progname, buildroot_info['arch'], **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# if buildroot is not existing
buildroot_id = '999999'
arguments = ['--buildroot', buildroot_id]
self.session.getBuildroot.return_value = None
expected = "No such buildroot: %s" % buildroot_id + "\n"
session.getBuildroot.return_value = None
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
@mock.patch('koji.genMockConfig')
@mock.patch('koji_cli.commands.ensure_connection')
def test_handle_mock_config_task_option(
self, ensure_connection_mock, gen_config_mock, stdout, stderr):
def test_handle_mock_config_task_option(self, stdout):
"""Test anon_handle_mock_config task options"""
arguments = []
task_id = 1001
options = mock.MagicMock()
session = mock.MagicMock()
session.listBuildroots.return_value = ''
self.session.listBuildroots.return_value = ''
# Mock config
gen_config_mock.return_value = ''
self.gen_config_mock.return_value = ''
arguments = ['--task', 'task']
expected = self.format_error_message("Task id must be an integer")
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
exit_code=2,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = ['--task', str(task_id)]
expected = "No buildroots for task %s (or no such task)\n" % str(task_id)
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
multi_broots = [
{'id': 1101, 'repo_id': 101, 'tag_name': 'tag_101', 'arch': 'x86_64'},
{'id': 1111, 'repo_id': 111, 'tag_name': 'tag_111', 'arch': 'x86_64'},
{'id': 1121, 'repo_id': 121, 'tag_name': 'tag_121', 'arch': 'x86_64'}
]
session.listBuildroots.return_value = multi_broots
anon_handle_mock_config(options, session, arguments)
self.session.listBuildroots.return_value = multi_broots
anon_handle_mock_config(self.options, self.session, arguments)
expected = "Multiple buildroots found: %s" % [br['id'] for br in multi_broots]
self.assert_console_message(stdout, "%s\n\n" % expected)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
opts = self.common_opts.copy()
opts.update({
@ -176,62 +179,63 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
'tag_name': multi_broots[0]['tag_name'],
'tag_macros': {},
})
del opts['topurl']
arguments = self.common_args + ['--task', str(task_id),
'--name', self.progname,
'--latest']
session.listBuildroots.return_value = [multi_broots[0]]
gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
gen_config_mock.assert_called_with(
self.progname, multi_broots[0]['arch'], **opts)
self.session.listBuildroots.return_value = [multi_broots[0]]
self.gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.gen_config_mock.assert_called_with(self.progname, multi_broots[0]['arch'], **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
@mock.patch('koji.genMockConfig')
@mock.patch('koji_cli.commands.ensure_connection')
def test_handle_mock_config_tag_option(
self, ensure_connection_mock, gen_config_mock, stdout, stderr):
def test_handle_mock_config_tag_option(self, stdout, stderr):
"""Test anon_handle_mock_config with tag option"""
arguments = []
tag = 'tag'
tag = {'id': 201, 'name': 'tag', 'arch': 'x86_64'}
options = mock.MagicMock()
# Mock out the xmlrpc server
session = mock.MagicMock()
session.getTag.return_value = None
session.getBuildConfig.return_value = None
session.getRepo.return_value = None
self.session.getTag.return_value = None
self.session.getBuildConfig.return_value = None
self.session.getRepo.return_value = None
arguments = ['--tag', tag['name']]
expected = "Please specify an arch\n"
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = ['--tag', tag['name'], '--arch', tag['arch']]
expected = self.format_error_message("No such tag: %s" % tag['name'])
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
exit_code=2,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return tag info
session.getTag.return_value = tag
self.session.getTag.return_value = tag
expected = "Could not get config info for tag: %(name)s\n" % tag
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return build config
session.getBuildConfig.return_value = {
self.session.getBuildConfig.return_value = {
'id': 301,
'extra': {
'rpm.macro.random_macro1': 'random_macro_content1',
@ -242,17 +246,22 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
'arches': 'x86_64',
}
expected = "Could not get a repo for tag: %(name)s\n" % tag
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return repo
session.getRepo.return_value = {'id': 101}
gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
self.session.getRepo.return_value = {'id': 101}
self.gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = self.common_args + ['--tag', tag['name'],
'--arch', tag['arch'],
@ -269,24 +278,27 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
'package_manager': 'yum',
'module_hotfixes': 1,
})
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
gen_config_mock.assert_called_with(
self.progname, tag['arch'], **opts)
del opts['topurl']
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.gen_config_mock.assert_called_with(self.progname, tag['arch'], **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return arch warning and config
arch = 'test'
warn_msg = '%s is not in the list of tag arches' % arch
gen_config_mock.return_value = self.mock_output
self.gen_config_mock.return_value = self.mock_output
arguments = self.common_args + ['--tag', tag['name'], '--arch', arch,
'--name', self.progname, '--latest']
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(stdout, "%s\n" % gen_config_mock.return_value)
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.assert_console_message(stderr, "%s\n" % warn_msg)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return warning that tag arch is empty
session.getBuildConfig.return_value = {
self.session.getBuildConfig.return_value = {
'id': 301,
'extra': {
'rpm.macro.random_macro1': 'random_macro_content1',
@ -298,22 +310,20 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
}
arch = 'test'
warn_msg = 'Tag %s has an empty arch list' % tag['name']
gen_config_mock.return_value = self.mock_output
self.gen_config_mock.return_value = self.mock_output
arguments = self.common_args + ['--tag', tag['name'], '--arch', arch,
'--name', self.progname, '--latest']
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(stdout, "%s\n" % gen_config_mock.return_value)
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.assert_console_message(stderr, "%s\n" % warn_msg)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('sys.stdout', new_callable=six.StringIO)
@mock.patch('koji.genMockConfig')
@mock.patch('koji_cli.commands.ensure_connection')
@mock.patch('koji_cli.commands.open')
def test_handle_mock_config_target_option(
self, openf, ensure_connection_mock, gen_config_mock, stdout, stderr):
def test_handle_mock_config_target_option(self, openf, stdout, stderr):
"""Test anon_handle_mock_config with target option"""
arguments = []
arch = "x86_64"
target = {'id': 1,
'name': 'target',
@ -321,66 +331,73 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
'build_tag': 2,
'build_tag_name': 'target-build',
'dest_tag_name': 'target'}
options = mock.MagicMock()
# Mock out the xmlrpc server
session = mock.MagicMock()
session.getBuildTarget.return_value = None
session.getRepo.return_value = None
self.session.getBuildTarget.return_value = None
self.session.getRepo.return_value = None
arguments = ['--target', target['name']]
expected = "Please specify an arch\n"
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = ['--target', target['name'],
'--arch', arch]
expected = self.format_error_message("No such build target: %s" % target['name'])
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
exit_code=2,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
session.getBuildTarget.return_value = target
session.getBuildConfig.return_value = {'arches': 'x86_64', 'extra': {}}
self.session.getBuildTarget.return_value = target
self.session.getBuildConfig.return_value = {'arches': 'x86_64', 'extra': {}}
expected = "Could not get a repo for tag: %s\n" % target['build_tag_name']
with self.assertRaises(SystemExit) as ex:
anon_handle_mock_config(options, session, arguments)
self.assertExitCode(ex, 1)
self.assert_console_message(stderr, expected)
self.assert_system_exit(
anon_handle_mock_config,
self.options, self.session, arguments,
stderr=expected,
exit_code=1,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
arguments = self.common_args + ['--target', target['name'],
'--arch', arch,
'--name', self.progname]
arguments = ['--distribution', 'fedora', '--topurl', '/top-url',
'--yum-proxy', '/yum-proxy', '--target', target['name'], '--arch', arch,
'--name', self.progname]
opts = self.common_opts.copy()
opts.update({
'repoid': 101,
'tag_name': target['build_tag_name'],
'tag_macros': {},
})
session.getRepo.return_value = {'id': 101}
gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(
stdout, "%s\n" % gen_config_mock.return_value)
gen_config_mock.assert_called_with(
self.progname, arch, **opts)
del opts['topdir']
self.session.getRepo.return_value = {'id': 101}
self.gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.gen_config_mock.assert_called_with(self.progname, arch, **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# --latest and -o (output) test
opts['repoid'] = 'latest'
arguments.extend(['--latest', '-o', '/tmp/mock.out'])
fobj = mock.MagicMock()
openf.return_value.__enter__.return_value = fobj
anon_handle_mock_config(options, session, arguments)
anon_handle_mock_config(self.options, self.session, arguments)
openf.assert_called_once()
fobj.write.assert_called_once_with(self.mock_output)
gen_config_mock.assert_called_with(
self.progname, arch, **opts)
self.gen_config_mock.assert_called_with(self.progname, arch, **opts)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# return arch warning and config
arch = 'test'
@ -388,20 +405,16 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
'--arch', arch,
'--name', self.progname]
warn_msg = '%s is not in the list of tag arches' % arch
gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(options, session, arguments)
self.assert_console_message(stdout, "%s\n" % gen_config_mock.return_value)
self.gen_config_mock.return_value = self.mock_output
anon_handle_mock_config(self.options, self.session, arguments)
self.assert_console_message(stdout, "%s\n" % self.gen_config_mock.return_value)
self.assert_console_message(stderr, "%s\n" % warn_msg)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
@mock.patch('sys.stderr', new_callable=six.StringIO)
@mock.patch('koji_cli.commands.ensure_connection')
def test_handle_mock_config_errors(self, ensure_connection_mock, stderr):
def test_handle_mock_config_errors(self):
"""Test anon_handle_mock_config general error messages"""
arguments = []
options = mock.MagicMock()
# Mock out the xmlrpc server
session = mock.MagicMock()
# Run it and check immediate output
# argument is empty
@ -409,22 +422,22 @@ config_opts['macros']['%distribution'] = 'Koji Testing'
"Please specify one of: --tag, --target, --task, --buildroot")
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
# name is specified twice case
arguments = [self.progname, '--name', 'name']
expected = self.format_error_message("Name already specified via option")
self.assert_system_exit(
anon_handle_mock_config,
options,
session,
arguments,
self.options, self.session, arguments,
stderr=expected,
activate_session=None)
self.ensure_connection_mock.assert_called_once_with(self.session, self.options)
self.ensure_connection_mock.reset_mock()
def test_handle_mock_config_help(self):
"""Test anon_handle_mock_config help message full output"""
@ -445,8 +458,9 @@ Options:
Duplicate the mock config for the specified buildroot
id
--mockdir=DIR Specify mockdir
--topdir=DIR Specify topdir
--topurl=URL URL under which Koji files are accessible
--topdir=DIR Specify topdir, topdir tops the topurl
--topurl=URL URL under which Koji files are accessible, when topdir
is specified, topdir tops the topurl
--distribution=DISTRIBUTION
Change the distribution macro
--yum-proxy=YUM_PROXY