parent
1066f8f1ad
commit
6a2c6e7586
9 changed files with 76 additions and 22 deletions
|
|
@ -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)
|
||||
|
|
|
|||
9
docs/schema-upgrade-1.24-1.25.sql
Normal file
9
docs/schema-upgrade-1.24-1.25.sql
Normal 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;
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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'])
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue