Repo info with task id

Fixes: https://pagure.io/koji/issue/888
This commit is contained in:
Jana Cupova 2021-03-30 13:24:34 +02:00 committed by Tomas Kopecek
parent 1066f8f1ad
commit 6a2c6e7586
9 changed files with 76 additions and 22 deletions

View file

@ -5374,7 +5374,7 @@ class NewRepoTask(BaseTaskHandler):
# generate debuginfo repo if requested or if specified in sidetag's extra
if debuginfo or tinfo['extra'].get('with_debuginfo'):
kwargs['with_debuginfo'] = True
repo_id, event_id = self.session.host.repoInit(tinfo['id'], **kwargs)
repo_id, event_id = self.session.host.repoInit(tinfo['id'], task_id=self.id, **kwargs)
path = koji.pathinfo.repo(repo_id, tinfo['name'])
if not os.path.isdir(path):
raise koji.GenericError("Repo directory missing: %s" % path)

View file

@ -0,0 +1,9 @@
-- upgrade script to migrate the Koji database schema
-- from version 1.24 to 1.25
BEGIN;
ALTER TABLE repo ADD COLUMN task_id INTEGER NULL REFERENCES task(id);
COMMIT;

View file

@ -454,7 +454,8 @@ CREATE TABLE repo (
create_event INTEGER NOT NULL REFERENCES events(id) DEFAULT get_event(),
tag_id INTEGER NOT NULL REFERENCES tag(id),
state INTEGER,
dist BOOLEAN DEFAULT 'false'
dist BOOLEAN DEFAULT 'false',
task_id INTEGER NULL REFERENCES task(id)
) WITHOUT OIDS;
-- external yum repos

View file

@ -2521,7 +2521,8 @@ def maven_tag_archives(tag_id, event_id=None, inherit=True):
return _iter_archives()
def repo_init(tag, with_src=False, with_debuginfo=False, event=None, with_separate_src=False):
def repo_init(tag, task_id=None, with_src=False, with_debuginfo=False, event=None,
with_separate_src=False):
"""Create a new repo entry in the INIT state, return full repo data
Returns a dictionary containing
@ -2532,7 +2533,7 @@ def repo_init(tag, with_src=False, with_debuginfo=False, event=None, with_separa
tinfo = get_tag(tag, strict=True, event=event)
koji.plugin.run_callbacks('preRepoInit', tag=tinfo, with_src=with_src,
with_debuginfo=with_debuginfo, event=event, repo_id=None,
with_separate_src=with_separate_src)
with_separate_src=with_separate_src, task_id=task_id)
tag_id = tinfo['id']
repo_arches = {}
if with_separate_src:
@ -2552,7 +2553,7 @@ def repo_init(tag, with_src=False, with_debuginfo=False, event=None, with_separa
event_time = _singleValue(q, locals(), strict=True)
event_id = event
insert = InsertProcessor('repo')
insert.set(id=repo_id, create_event=event_id, tag_id=tag_id, state=state)
insert.set(id=repo_id, create_event=event_id, tag_id=tag_id, state=state, task_id=task_id)
insert.execute()
# Need to pass event_id because even though this is a single transaction,
# it is possible to see the results of other committed transactions
@ -2578,6 +2579,7 @@ def repo_init(tag, with_src=False, with_debuginfo=False, event=None, with_separa
'id': repo_id,
'tag': tinfo['name'],
'tag_id': tinfo['id'],
'task_id': task_id,
'event_id': event_id,
'with_src': with_src,
'with_separate_src': with_separate_src,
@ -2671,7 +2673,7 @@ def repo_init(tag, with_src=False, with_debuginfo=False, event=None, with_separa
koji.plugin.run_callbacks('postRepoInit', tag=tinfo, with_src=with_src,
with_debuginfo=with_debuginfo, event=event, repo_id=repo_id,
with_separate_src=with_separate_src)
with_separate_src=with_separate_src, task_id=task_id)
return [repo_id, event_id]
@ -2785,6 +2787,7 @@ def repo_info(repo_id, strict=False):
fields = (
('repo.id', 'id'),
('repo.state', 'state'),
('repo.task_id', 'task_id'),
('repo.create_event', 'create_event'),
('events.time', 'creation_time'), # for compatibility with getRepo
('EXTRACT(EPOCH FROM events.time)', 'create_ts'),
@ -2874,6 +2877,7 @@ def get_active_repos():
fields = (
('repo.id', 'id'),
('repo.state', 'state'),
('repo.task_id', 'task_id'),
('repo.create_event', 'create_event'),
('EXTRACT(EPOCH FROM events.time)', 'create_ts'),
('repo.tag_id', 'tag_id'),
@ -12119,9 +12123,9 @@ class RootExports(object):
else:
id = get_tag_id(tag, strict=True)
fields = ['repo.id', 'repo.state', 'repo.create_event', 'events.time',
fields = ['repo.id', 'repo.state', 'repo.task_id', 'repo.create_event', 'events.time',
'EXTRACT(EPOCH FROM events.time)', 'repo.dist']
aliases = ['id', 'state', 'create_event', 'creation_time', 'create_ts', 'dist']
aliases = ['id', 'state', 'task_id', 'create_event', 'creation_time', 'create_ts', 'dist']
joins = ['events ON repo.create_event = events.id']
clauses = ['repo.tag_id = %(id)i']
if dist:
@ -14588,13 +14592,13 @@ class HostExports(object):
return br.updateArchiveList(archives, project)
def repoInit(self, tag, with_src=False, with_debuginfo=False, event=None,
def repoInit(self, tag, task_id=None, with_src=False, with_debuginfo=False, event=None,
with_separate_src=False):
"""Initialize a new repo for tag"""
host = Host()
host.verify()
return repo_init(tag, with_src=with_src, with_debuginfo=with_debuginfo, event=event,
with_separate_src=with_separate_src)
return repo_init(tag, task_id=task_id, with_src=with_src, with_debuginfo=with_debuginfo,
event=event, with_separate_src=with_separate_src)
def repoDone(self, repo_id, data, expire=False):
"""Finalize a repo

View file

@ -282,7 +282,8 @@ def prep_repo_init(cbtype, *args, **kws):
address = 'repo.init'
props = {'type': cbtype[4:],
'tag': kws['tag']['name'],
'repo_id': kws['repo_id']}
'repo_id': kws['repo_id'],
'task_id': kws['task_id']}
queue_msg(address, props, kws)
@ -293,6 +294,7 @@ def prep_repo_done(cbtype, *args, **kws):
props = {'type': cbtype[4:],
'tag': kws['repo']['tag_name'],
'repo_id': kws['repo']['id'],
'task_id': kws['repo']['task_id'],
'expire': kws['expire']}
queue_msg(address, props, kws)

View file

@ -32,9 +32,10 @@ class TestGetActiveRepos(unittest.TestCase):
# make sure the following does not error
str(query)
self.assertEqual(query.tables, ['repo'])
columns = ['repo.id', 'repo.state', 'repo.create_event',
'EXTRACT(EPOCH FROM events.time)', 'repo.tag_id',
'repo.dist','tag.name']
columns = ['repo.id', 'repo.state', 'repo.task_id', 'repo.create_event',
'EXTRACT(EPOCH FROM events.time)', 'repo.tag_id', 'repo.dist', 'tag.name']
self.assertEqual(set(query.columns), set(columns))
self.assertEqual(query.clauses, ['repo.state != %(st_deleted)s'])
self.assertEqual(query.joins, ['tag ON repo.tag_id=tag.id',
'events ON repo.create_event = events.id'])
self.assertEqual(query.values['st_deleted'], koji.REPO_DELETED)

View file

@ -1,6 +1,8 @@
import mock
import unittest
import datetime
import psycopg2
import koji
import kojihub
@ -15,15 +17,16 @@ class TestRepoFunctions(unittest.TestCase):
def setUp(self):
self.QueryProcessor = mock.patch('kojihub.QueryProcessor',
side_effect=self.getQuery).start()
side_effect=self.getQuery).start()
self.queries = []
self.InsertProcessor = mock.patch('kojihub.InsertProcessor',
side_effect=self.getInsert).start()
side_effect=self.getInsert).start()
self.inserts = []
self.UpdateProcessor = mock.patch('kojihub.UpdateProcessor',
side_effect=self.getUpdate).start()
side_effect=self.getUpdate).start()
self.updates = []
self._dml = mock.patch('kojihub._dml').start()
self.exports = kojihub.RootExports()
def tearDown(self):
mock.patch.stopall()
@ -74,3 +77,32 @@ class TestRepoFunctions(unittest.TestCase):
self.assertEqual(update.values['dist'], dist)
if 'dist = %(dist)s' not in update.clauses:
raise Exception('Missing dist condition')
@mock.patch('kojihub._singleRow')
def test_repo_info(self, _singleRow):
repo_row = {'id': 10,
'state': 0,
'task_id': 15,
'create_event': 32,
'creation_time': datetime.datetime(2021, 3, 30, 12, 34, 5, 204023, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)),
'create_ts': 1617107645.204023,
'tag_id': 3,
'tag_name': 'test-tag',
'dist': False}
_singleRow.return_value = repo_row
rv = kojihub.repo_info(3)
self.assertEqual(rv, repo_row)
def test_get_repo(self):
rv = self.exports.getRepo(2)
self.assertEqual(len(self.queries), 1)
query = self.queries[0]
# make sure the following does not error
str(query)
self.assertEqual(query.tables, ['repo'])
columns = ['repo.id', 'repo.state', 'repo.task_id', 'repo.create_event',
'EXTRACT(EPOCH FROM events.time)', 'repo.dist', 'events.time']
self.assertEqual(set(query.columns), set(columns))
self.assertEqual(query.joins, ['events ON repo.create_event = events.id'])
self.assertEqual(query.clauses, ['repo.dist is false', 'repo.state = %(state)s',
'repo.tag_id = %(id)i'])

View file

@ -186,13 +186,15 @@ extra_limit = 2048
def test_prep_repo_init(self):
protonmsg.prep_repo_init('postRepoInit', tag={'name': 'test-tag',
'arches': set(['x86_64', 'i386'])}, repo_id=1234)
self.assertMsg('repo.init', type='RepoInit', tag='test-tag', repo_id=1234)
'arches': set(['x86_64', 'i386'])}, repo_id=1234, task_id=25)
self.assertMsg('repo.init', type='RepoInit', tag='test-tag', repo_id=1234, task_id=25)
def test_prep_repo_done(self):
protonmsg.prep_repo_done('postRepoDone', repo={'tag_name': 'test-tag', 'id': 1234},
protonmsg.prep_repo_done('postRepoDone',
repo={'tag_name': 'test-tag', 'id': 1234, 'task_id': 25},
expire=False)
self.assertMsg('repo.done', type='RepoDone', tag='test-tag', repo_id=1234, expire=False)
self.assertMsg('repo.done', type='RepoDone', tag='test-tag', repo_id=1234,
task_id=25, expire=False)
@patch('protonmsg.Container')
def test_send_queued_msgs_none(self, Container):

View file

@ -9,6 +9,9 @@
<table>
<tr><th>ID</th><td>$repo.id</td><th></tr>
<tr><th>Tag</th><td><a href="taginfo?tagID=$repo.tag_id">$repo.tag_name</a></td></tr>
#if $repo.task_id
<tr><th>Task ID</th><td><a href="taskinfo?taskID=$repo.task_id">$repo.task_id</a></td></tr>
#end if
#set $state = $util.repoState($repo.state)
<tr><th>State</th><td class="repo$state">$state</td></tr>
<tr><th>Event</th><td>$repo.create_event ($util.formatTimeLong($repo.create_ts))</td></tr>