Add the database resolver plugin

This commit is contained in:
mprahl
2018-03-02 13:16:04 -05:00
parent d338a390b9
commit eb0b2e1c38
21 changed files with 652 additions and 254 deletions

View File

@@ -56,21 +56,21 @@ class TestModuleInit:
pass
@patch('module_build_service.scm.SCM')
def test_init_basic(self, mocked_scm, pdc):
def test_init_basic(self, mocked_scm):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=1, module_build_state='init')
msg_id=None, module_build_id=2, module_build_state='init')
with make_session(conf) as session:
self.fn(config=conf, session=session, msg=msg)
build = ModuleBuild.query.filter_by(id=1).one()
build = ModuleBuild.query.filter_by(id=2).one()
# Make sure the module entered the wait state
assert build.state == 1, build.state
# Make sure format_mmd was run properly
assert type(build.mmd().get_xmd()['mbs']) is GLib.Variant
@patch('module_build_service.scm.SCM')
def test_init_scm_not_available(self, mocked_scm, pdc):
def test_init_scm_not_available(self, mocked_scm):
def mocked_scm_get_latest():
raise RuntimeError("Failed in mocked_scm_get_latest")
@@ -78,10 +78,10 @@ class TestModuleInit:
'620ec77321b2ea7b0d67d82992dda3e1d67055b4')
mocked_scm.return_value.get_latest = mocked_scm_get_latest
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=1, module_build_state='init')
msg_id=None, module_build_id=2, module_build_state='init')
with make_session(conf) as session:
self.fn(config=conf, session=session, msg=msg)
build = ModuleBuild.query.filter_by(id=1).one()
build = ModuleBuild.query.filter_by(id=2).one()
# Make sure the module entered the failed state
# since the git server is not available
assert build.state == 4, build.state
@@ -89,7 +89,7 @@ class TestModuleInit:
@patch("module_build_service.config.Config.modules_allow_repository",
new_callable=PropertyMock, return_value=True)
@patch('module_build_service.scm.SCM')
def test_init_includedmodule(self, mocked_scm, mocked_mod_allow_repo, pdc):
def test_init_includedmodule(self, mocked_scm, mocked_mod_allow_repo):
FakeSCM(mocked_scm, "includedmodules", ['testmodule.yaml'])
includedmodules_yml_path = os.path.join(
self.staged_data_dir, 'includedmodules.yaml')
@@ -100,13 +100,13 @@ class TestModuleInit:
ModuleBuild.create(
session, conf, 'includemodule', '1', 3, yaml, scmurl, 'mprahl')
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state='init')
msg_id=None, module_build_id=3, module_build_state='init')
self.fn(config=conf, session=session, msg=msg)
build = ModuleBuild.query.filter_by(id=2).one()
build = ModuleBuild.query.filter_by(id=3).one()
assert build.state == 1
assert build.name == 'includemodule'
batches = {}
for comp_build in ComponentBuild.query.filter_by(module_id=2).all():
for comp_build in ComponentBuild.query.filter_by(module_id=3).all():
batches[comp_build.package] = comp_build.batch
assert batches['perl-List-Compare'] == 2
assert batches['perl-Tangerine'] == 2
@@ -125,14 +125,14 @@ class TestModuleInit:
@patch('module_build_service.models.ModuleBuild.from_module_event')
@patch('module_build_service.scm.SCM')
def test_init_when_get_latest_raises(self, mocked_scm, mocked_from_module_event, pdc):
def test_init_when_get_latest_raises(self, mocked_scm, mocked_from_module_event):
FakeSCM(mocked_scm, 'testmodule', 'testmodule.yaml',
'7035bd33614972ac66559ac1fdd019ff6027ad22',
get_latest_raise=True)
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=1, module_build_state='init')
msg_id=None, module_build_id=2, module_build_state='init')
with make_session(conf) as session:
build = session.query(ModuleBuild).filter_by(id=1).one()
build = session.query(ModuleBuild).filter_by(id=2).one()
mocked_from_module_event.return_value = build
self.fn(config=conf, session=session, msg=msg)
# Query the database again to make sure the build object is updated

View File

@@ -116,7 +116,7 @@ class TestModuleWait:
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
generic_resolver.create.return_value = resolver
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1,
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=2,
module_build_state='some state')
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
@@ -125,7 +125,7 @@ class TestModuleWait:
# When module-build-macros is reused, it still has to appear only
# once in database.
builds_count = db.session.query(ComponentBuild).filter_by(
package="module-build-macros", module_id=1).count()
package="module-build-macros", module_id=2).count()
assert builds_count == 1
@patch("module_build_service.builder.GenericBuilder.default_buildroot_groups",
@@ -158,7 +158,7 @@ class TestModuleWait:
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
generic_resolver.create.return_value = resolver
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1,
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=2,
module_build_state='some state')
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
@@ -200,11 +200,11 @@ class TestModuleWait:
"module-bootstrap-tag": base_mmd}
generic_resolver.create.return_value = resolver
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1,
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=2,
module_build_state='some state')
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
module_build = ModuleBuild.query.filter_by(id=1).one()
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == "modular-updates-candidate"
@patch("module_build_service.builder.GenericBuilder.default_buildroot_groups",
@@ -245,9 +245,9 @@ class TestModuleWait:
"module-bootstrap-tag": base_mmd}
generic_resolver.create.return_value = resolver
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=1,
msg = module_build_service.messaging.MBSModule(msg_id=None, module_build_id=2,
module_build_state='some state')
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
module_build = ModuleBuild.query.filter_by(id=1).one()
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == "f27-modular-updates-candidate"

View File

@@ -62,7 +62,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
# If fresh is set, then we simulate that activity just occurred 2 minutes ago on the build
if fresh:
@@ -77,7 +77,7 @@ class TestPoller:
poller.poll()
# Refresh our module_build object.
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
db.session.refresh(module_build)
# If fresh is set, we expect the poller to not touch the module build since it's been less
@@ -117,7 +117,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
module_build.new_repo_task_id = 123456
db.session.commit()
@@ -151,7 +151,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
module_build.new_repo_task_id = 123456
db.session.commit()
@@ -161,7 +161,7 @@ class TestPoller:
poller.poll()
# Refresh our module_build object.
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
db.session.refresh(module_build)
assert not koji_session.newRepo.called
@@ -185,7 +185,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
module_build.new_repo_task_id = 123456
db.session.commit()
@@ -196,7 +196,7 @@ class TestPoller:
poller.poll()
# Refresh our module_build object.
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
db.session.refresh(module_build)
# Components should not be in building state
@@ -227,7 +227,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.state = state
module_build.koji_tag = "module-tag"
module_build.time_completed = datetime.utcnow()
@@ -239,7 +239,7 @@ class TestPoller:
poller = MBSProducer(hub)
poller.delete_old_koji_targets(conf, db.session)
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
db.session.refresh(module_build)
module_build.time_completed = datetime.utcnow() - timedelta(hours=23)
db.session.commit()
@@ -281,7 +281,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.state = 1
original = datetime.utcnow() - timedelta(minutes=11)
module_build.time_modified = original
@@ -295,7 +295,7 @@ class TestPoller:
poller.process_waiting_module_builds(db.session)
assert consumer.incoming.qsize() == 1
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
# ensure the time_modified was changed.
assert module_build.time_modified > original
@@ -312,7 +312,7 @@ class TestPoller:
# Change the batch to 2, so the module build is in state where
# it is not building anything, but the state is "build".
module_build = models.ModuleBuild.query.filter_by(id=2).one()
module_build = models.ModuleBuild.query.filter_by(id=3).one()
module_build.state = 1
original = datetime.utcnow() - timedelta(minutes=9)
module_build.time_modified = original
@@ -355,15 +355,15 @@ class TestPoller:
"""
builder = mock.MagicMock()
create_builder.return_value = builder
module_build_one = models.ModuleBuild.query.get(1)
module_build_two = models.ModuleBuild.query.get(2)
module_build_one = models.ModuleBuild.query.get(2)
module_build_two = models.ModuleBuild.query.get(3)
module_build_one.state = models.BUILD_STATES['failed']
module_build_one.time_modified = datetime.utcnow() - timedelta(
days=conf.cleanup_failed_builds_time + 1)
module_build_two.time_modified = datetime.utcnow()
module_build_two.state = models.BUILD_STATES['failed']
failed_component = models.ComponentBuild.query.filter_by(
package='tangerine', module_id=2).one()
package='tangerine', module_id=3).one()
failed_component.state = koji.BUILD_STATES['FAILED']
failed_component.tagged = False
failed_component.tagged_in_final = False

View File

@@ -59,7 +59,7 @@ class TestRepoDone:
@mock.patch('module_build_service.builder.KojiModuleBuilder.'
'KojiModuleBuilder.buildroot_connect')
def test_a_single_match(self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt,
mock_uea, pdc):
mock_uea):
""" Test that when a repo msg hits us and we have a single match.
"""
scheduler_init_data()
@@ -92,7 +92,7 @@ class TestRepoDone:
@mock.patch('module_build_service.builder.KojiModuleBuilder.'
'KojiModuleBuilder.buildroot_connect')
def test_a_single_match_build_fail(self, connect, build_fn, config, ready, list_tasks_fn,
mock_gabt, mock_uea, pdc):
mock_gabt, mock_uea):
""" Test that when a KojiModuleBuilder.build fails, the build is
marked as failed with proper state_reason.
"""
@@ -129,7 +129,7 @@ class TestRepoDone:
config=conf, session=db.session, msg=msg)
mock_log_info.assert_called_once_with(
'Ignoring repo regen, because not all components are tagged.')
module_build = module_build_service.models.ModuleBuild.query.get(1)
module_build = module_build_service.models.ModuleBuild.query.get(2)
# Make sure the module build didn't transition since all the components weren't tagged
assert module_build.state == module_build_service.models.BUILD_STATES['build']
@@ -153,12 +153,12 @@ class TestRepoDone:
with app.app_context():
scheduler_init_data(3)
config.return_value = mock.Mock(), 'development'
build_fn.return_value = None, 4, 'Failed to submit artifact communicator to Koji', None
build_fn.return_value = None, 4, 'Failed to submit artifact x to Koji', None
msg = module_build_service.messaging.KojiRepoChange(
'some_msg_id', 'module-95b214a704c984be-build')
module_build_service.scheduler.handlers.repos.done(
config=conf, session=db.session, msg=msg)
module_build = module_build_service.models.ModuleBuild.query.first()
module_build = module_build_service.models.ModuleBuild.query.get(2)
assert module_build.state == module_build_service.models.BUILD_STATES["failed"]

View File

@@ -78,7 +78,7 @@ class TestTagTagged:
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# Set previous components as COMPLETE and tagged.
module_build.batch = 1
@@ -128,7 +128,7 @@ class TestTagTagged:
# Refresh our module_build object.
db.session.expunge(module_build)
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# newRepo task_id should be stored in database, so we can check its
# status later in poller.
@@ -154,7 +154,7 @@ class TestTagTagged:
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
component = module_build_service.models.ComponentBuild.query\
.filter_by(package='perl-Tangerine', module_id=module_build.id).one()
@@ -196,7 +196,7 @@ class TestTagTagged:
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# Set previous components as COMPLETE and tagged.
module_build.batch = 1
@@ -231,7 +231,7 @@ class TestTagTagged:
# Refresh our module_build object.
db.session.expunge(module_build)
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# newRepo task_id should be stored in database, so we can check its
# status later in poller.
@@ -260,10 +260,10 @@ class TestTagTagged:
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
module_build.batch = 2
mbm = module_build_service.models.ComponentBuild.query.filter_by(
module_id=2, package='module-build-macros').one()
module_id=3, package='module-build-macros').one()
mbm.tagged = False
db.session.add(mbm)
for c in module_build.current_batch():
@@ -316,7 +316,7 @@ class TestTagTagged:
# Refresh our module_build object.
db.session.expunge(module_build)
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# newRepo task_id should be stored in database, so we can check its
# status later in poller.
@@ -343,7 +343,7 @@ class TestTagTagged:
builder.module_build_tag = {"name": "module-fe3adf73caf3e1b7-build"}
create_builder.return_value = builder
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# Set previous components as COMPLETE and tagged.
module_build.batch = 1
@@ -387,7 +387,7 @@ class TestTagTagged:
# Refresh our module_build object.
db.session.expunge(module_build)
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=2).one()
module_build = module_build_service.models.ModuleBuild.query.filter_by(id=3).one()
# newRepo task_id should be stored in database, so we can check its
# status later in poller.