def test_build_containers_when_dependency_container_is_built(self, set_context, repo_urls, build_image): """ Tests when dependency container is built, rebuild containers depend on it. """ build_image.side_effect = [1, 2, 3] repo_urls.return_value = ["url"] e1 = models.Event.create(db.session, "test_msg_id", "RHSA-2018-001", events.TestingEvent) event = self.get_event_from_msg(get_fedmsg('brew_container_task_closed')) base_build = models.ArtifactBuild.create(db.session, e1, 'test-product-docker', ArtifactType.IMAGE, event.task_id) build_0 = models.ArtifactBuild.create(db.session, e1, 'docker-up-0', ArtifactType.IMAGE, 0, dep_on=base_build, state=ArtifactBuildState.PLANNED) build_1 = models.ArtifactBuild.create(db.session, e1, 'docker-up-1', ArtifactType.IMAGE, 0, dep_on=base_build, state=ArtifactBuildState.PLANNED) build_2 = models.ArtifactBuild.create(db.session, e1, 'docker-up-2', ArtifactType.IMAGE, 0, dep_on=base_build, state=ArtifactBuildState.PLANNED) self.handler.handle(event) self.assertEqual(base_build.state, ArtifactBuildState.DONE.value) build_image.assert_has_calls([ mock.call(build_0, ['url']), mock.call(build_1, ['url']), mock.call(build_2, ['url']), ]) set_context.assert_has_calls([ mock.call(build_0), mock.call(build_1), mock.call(build_2)]) self.assertEqual(build_0.build_id, 1) self.assertEqual(build_1.build_id, 2) self.assertEqual(build_2.build_id, 3)
def test_not_build_containers_when_dependency_container_build_task_failed( self, repo_urls, build_image): """ Tests when dependency container build task failed in brew, only update build state in db. """ build_image.side_effect = [1, 2, 3, 4] repo_urls.return_value = ["url"] e1 = models.Event.create(db.session, "test_msg_id", "RHSA-2018-001", events.TestingEvent) event = self.get_event_from_msg(get_fedmsg('brew_container_task_failed')) base_build = models.ArtifactBuild.create( db.session, e1, 'test-product-docker', ArtifactType.IMAGE, event.task_id, original_nvr='foo-1-1') base_build.build_args = json.dumps({}) models.ArtifactBuild.create(db.session, e1, 'docker-up', ArtifactType.IMAGE, 0, dep_on=base_build, state=ArtifactBuildState.PLANNED) self.handler.handle(event) self.assertEqual(base_build.state, ArtifactBuildState.BUILD.value) self.assertEqual(base_build.build_id, 1) event.task_id = 1 self.handler.handle(event) self.assertEqual(base_build.state, ArtifactBuildState.BUILD.value) self.assertEqual(base_build.build_id, 2) event.task_id = 2 self.handler.handle(event) self.assertEqual(base_build.state, ArtifactBuildState.FAILED.value) self.assertEqual(base_build.build_id, 2) build_image.assert_called()
def test_freshmaker_manage_mismatched_action(self): msg = get_fedmsg('freshmaker_manage_mismatched_action') with self.assertRaises(ValueError) as err: self.get_event_from_msg(msg) self.assertEqual( err.exception.args[0], 'Last part of \'Freshmaker manage\' message' ' topic must match the action defined within the message.')
def test_mark_build_done_when_container_has_latest_rpms_from_advisory(self, get_binary_rpm_nvrs, KojiService): """ Tests when dependency container build task failed in brew, only update build state in db. """ get_binary_rpm_nvrs.return_value = set(['foo-1.2.1-22.el7']) koji_service = KojiService.return_value koji_service.get_build_rpms.return_value = [ {'build_id': 634904, 'nvr': 'foo-debuginfo-1.2.1-22.el7', 'name': 'foo-debuginfo'}, {'build_id': 634904, 'nvr': 'foo-1.2.1-22.el7', 'name': 'foo'}, {'build_id': 634904, 'nvr': 'foo-debuginfo-1.1.1-22.el7', 'name': 'foo-debuginfo'}, {'build_id': 634904, 'nvr': 'foo-1.1.1-22.el7', 'name': 'foo'}, ] koji_service.get_rpms_in_container.return_value = set( ['foo-1.2.1-22.el7', 'bar-1.2.3-1.el7'] ) e1 = models.Event.create(db.session, "test_msg_id", "2018001", events.ErrataAdvisoryRPMsSignedEvent) event = self.get_event_from_msg(get_fedmsg('brew_container_task_closed')) build = models.ArtifactBuild.create(db.session, e1, 'test-product-docker', ArtifactType.IMAGE, event.task_id) self.handler.handle(event) self.assertEqual(build.state, ArtifactBuildState.DONE.value) self.assertEqual(build.state_reason, 'Built successfully.')
def test_more_than_max_tries_on_freshmaker_manage_request(self): msg = get_fedmsg('freshmaker_manage_eventcancel') msg['body']['msg']['try'] = events.FreshmakerManageEvent._max_tries event = self.get_event_from_msg(msg) handler = CancelEventOnFreshmakerManageRequest() self.assertFalse(handler.can_handle(event))
def test_can_handle_brew_container_task_failed_event(self): """ Tests handler can handle brew build container task failed event. """ event = self.get_event_from_msg( get_fedmsg('brew_container_task_failed')) self.assertTrue(self.handler.can_handle(event))
def test_can_not_handle_other_action_than_eventcancel(self): msg = get_fedmsg('freshmaker_manage_eventcancel') msg['body']['topic'] = 'freshmaker.manage.someotheraction' msg['body']['msg']['action'] = 'someotheraction' event = self.get_event_from_msg(msg) handler = CancelEventOnFreshmakerManageRequest() self.assertFalse(handler.can_handle(event))
def test_retry_failed_cancel_event_with_success(self, mocked_cancel_build): msg = get_fedmsg('freshmaker_manage_eventcancel') event = self.get_event_from_msg(msg) handler = CancelEventOnFreshmakerManageRequest() new_event = handler.handle(event) self.assertTrue(isinstance(new_event, list) and len(new_event)) retval = handler.handle(new_event[0]) self.assertEqual(retval, []) self.assertEqual([b.state_reason for b in self.db_event.builds.all() ].count("Build canceled in external build system."), 2)
def test_max_tries_reached_on_cancel_event(self, mocked_cancel_build): msg = get_fedmsg('freshmaker_manage_eventcancel') msg['body']['msg']['try'] = events.FreshmakerManageEvent._max_tries - 1 event = self.get_event_from_msg(msg) handler = CancelEventOnFreshmakerManageRequest() retval = handler.handle(event) self.assertEqual(retval, []) self.assertEqual([ b.state_reason for b in self.db_event.builds.all() ].count( "Build was NOT canceled in external build system. Max number of tries reached!" ), 2)
def test_cancel_event_on_freshmaker_manage_request(self, mocked_cancel_build): msg = get_fedmsg('freshmaker_manage_eventcancel') event = self.get_event_from_msg(msg) handler = CancelEventOnFreshmakerManageRequest() self.assertTrue(handler.can_handle(event)) retval = handler.handle(event) self.assertEqual(retval, []) mocked_cancel_build.assert_any_call(1237) mocked_cancel_build.assert_any_call(1238) self.assertEqual([b.state_reason for b in self.db_event.builds.all() ].count("Build canceled in external build system."), 2)
def test_freshmaker_manage_missing_action(self): msg = get_fedmsg('freshmaker_manage_missing_action') with self.assertRaises(ValueError) as err: self.get_event_from_msg(msg) self.assertEqual(err.exception.args[0], 'Action is not defined within the message.')