cli: multicalls for write-signed-rpm

Fixes: https://pagure.io/koji/issue/2807
This commit is contained in:
Tomas Kopecek 2021-04-08 12:53:56 +02:00
parent b206d9e77e
commit 855bc89ca3
2 changed files with 59 additions and 31 deletions

View file

@ -1538,30 +1538,44 @@ def handle_write_signed_rpm(goptions, session, args):
activate_session(session, goptions)
if options.all:
rpms = session.queryRPMSigs(sigkey=key)
rpms = [session.getRPM(r['rpm_id']) for r in rpms]
with session.multicall() as m:
results = [m.getRPM(r['rpm_id']) for r in rpms]
rpms = [x.result for x in results]
elif options.buildid:
rpms = session.listRPMs(int(options.buildid))
else:
nvrs = []
rpms = []
bad = []
for nvra in args:
try:
koji.parse_NVRA(nvra)
rinfo = session.getRPM(nvra, strict=True)
if rinfo:
rpms.append(rinfo)
except koji.GenericError:
bad.append(nvra)
with session.multicall() as m:
result = [m.getRPM(nvra, strict=False) for nvra in args]
for rpm, nvra in zip(result, args):
rpm = rpm.result
if rpm:
rpms.append(rpm)
else:
nvrs.append(nvra)
# for historical reasons, we also accept nvrs
for nvr in bad:
build = session.getBuild(nvr)
if not build:
with session.multicall() as m:
result = [m.getBuild(nvr, strict=True) for nvr in nvrs]
builds = []
for nvr, build in zip(nvrs, result):
try:
builds.append(build.result['id'])
except koji.GenericError as ex:
raise koji.GenericError("No such rpm or build: %s" % nvr)
rpms.extend(session.listRPMs(buildID=build['id']))
for i, rpminfo in enumerate(rpms):
nvra = "%(name)s-%(version)s-%(release)s.%(arch)s" % rpminfo
print("[%d/%d] %s" % (i + 1, len(rpms), nvra))
session.writeSignedRPM(rpminfo['id'], key)
with session.multicall() as m:
rpm_lists = [m.listRPMs(buildID=build_id) for build_id in builds]
for rpm_list in rpm_lists:
rpms.extend(rpm_list.result)
with session.multicall() as m:
for i, rpminfo in enumerate(rpms):
nvra = "%(name)s-%(version)s-%(release)s.%(arch)s" % rpminfo
print("[%d/%d] %s" % (i + 1, len(rpms), nvra))
m.writeSignedRPM(rpminfo['id'], key)
def handle_prune_signed_copies(goptions, session, args):

View file

@ -121,6 +121,15 @@ class TestWriteSignedRPM(utils.CliTestCase):
arguments = [fake_sigkey]
options = mock.MagicMock()
session = mock.MagicMock()
mcall = session.multicall.return_value.__enter__.return_value
def vm(result):
m = koji.VirtualCall('mcall_method', [], {})
if isinstance(result, dict) and result.get('faultCode'):
m._result = result
else:
m._result = (result,)
return m
def get_expect_data(rpm_data):
expected = ''
@ -135,36 +144,38 @@ class TestWriteSignedRPM(utils.CliTestCase):
# result: write sigkey to specified RPMs
rpm_data = [GET_RPM_RESULTS[0], GET_RPM_RESULTS[3]]
session.getRPM.side_effect = [
rpm_data[0], # bash-4.4.12-5.fc26.src
koji.GenericError # bash-4.4.12-5.fc26
mcall.getRPM.side_effect = [
vm(rpm_data[0]), # bash-4.4.12-5.fc26.src
vm(None), # bash-4.4.12-5.fc26
]
session.getBuild.return_value = {
mcall.getBuild.return_value = vm({
'package_name': 'bash',
'id': 1,
'version': '4.4.12',
'nvr': 'bash-4.4.12-5.fc26',
'name': 'bash',
'release': '5.fc26'
}
session.listRPMs.return_value = [rpm_data[1]] # bash-4.4.12-5.fc26
})
mcall.listRPMs.return_value = vm([rpm_data[1]]) # bash-4.4.12-5.fc26
args = arguments + ['bash-4.4.12-5.fc26.src', 'bash-4.4.12-5.fc26']
expect_msg, expect_calls = get_expect_data(rpm_data)
handle_write_signed_rpm(options, session, args)
self.assert_console_message(stdout, expect_msg)
session.writeSignedRPM.assert_has_calls(expect_calls)
mcall.writeSignedRPM.assert_has_calls(expect_calls)
session.queryRPMSigs.assert_not_called()
# Case 2, with --all option
# result: write sigkey to all RPMS
session.queryRPMSigs.return_value = QUERY_RPM_RESULTS
session.getRPM.side_effect = GET_RPM_RESULTS
#session.getRPM.side_effect = GET_RPM_RESULTS
mcall.getRPM.side_effect = [vm(x) for x in GET_RPM_RESULTS]
mcall.writeSignedRPM.reset_mock()
expect_msg, expect_calls = get_expect_data(GET_RPM_RESULTS)
handle_write_signed_rpm(options, session, arguments + ['--all'])
self.assert_console_message(stdout, expect_msg)
session.writeSignedRPM.assert_has_calls(expect_calls)
mcall.writeSignedRPM.assert_has_calls(expect_calls)
session.queryRPMSigs.assert_called_with(sigkey=fake_sigkey)
session.queryRPMSigs.reset_mock()
@ -176,20 +187,23 @@ class TestWriteSignedRPM(utils.CliTestCase):
GET_RPM_RESULTS[3]] # build_id = 1
session.listRPMs.return_value = rpm_data
expect_msg, expect_calls = get_expect_data(rpm_data)
session.writeSignedRPM.reset_mock()
handle_write_signed_rpm(options, session, arguments + ['--buildid', '1'])
self.assert_console_message(stdout, expect_msg)
session.listRPMs.assert_called_with(1)
session.queryRPMSigs.assert_not_called()
session.writeSignedRPM.assert_has_calls(expect_calls)
mcall.writeSignedRPM.assert_has_calls(expect_calls)
session.listRPM.reset_mock()
session.writeSignedRPM.reset_mock()
# Case 4, RPM not exist
# result: raise koji.GenericError
session.getRPM.side_effect = koji.GenericError('fake-get-rpm-error')
session.getBuild.return_value = None
mcall.writeSignedRPM.reset_mock()
mcall.getRPM.side_effect = None
mcall.getRPM.return_value = vm(None)
mcall.getBuild.return_value = vm({'faultCode': 1000, 'faultString': 'x'})
args = arguments + ['gawk-4.1.4-3.fc26.x86_64']
with self.assertRaises(koji.GenericError) as cm:
@ -200,7 +214,7 @@ class TestWriteSignedRPM(utils.CliTestCase):
session.listRPM.assert_not_called()
session.queryRPMSigs.assert_not_called()
session.writeSignedRPM.assert_not_called()
mcall.writeSignedRPM.assert_not_called()
def test_handle_write_signed_rpm_argument_test(self):
"""Test handle_write_signed_rpm function without arguments"""