def test_list_comments_with_multiple_ignore_user(self): another_user = User(name=u'aUser') self.db.add(another_user) update = Update(user=another_user, request=UpdateRequest.testing, type=UpdateType.enhancement, notes=u'Just another update.', date_submitted=datetime(1981, 10, 11), requirements=u'rpmlint', stable_karma=3, unstable_karma=-3, release=Release.query.one()) self.db.add(update) comment = Comment(karma=1, text=u'Cool! 😃') comment.user = another_user self.db.add(comment) update.comments.append(comment) self.db.flush() res = self.app.get('/comments/', {"ignore_user": "******"}) body = res.json_body self.assertEqual(len(body['comments']), 1) self.assertNotIn('errors', body) self.assertEqual(body['comments'][0]['text'], u'Cool! 😃')
def test_list_comments_by_multiple_usernames(self): update = Update(request=UpdateRequest.testing, type=UpdateType.enhancement, notes='Just another update.', date_submitted=datetime(1981, 10, 11), requirements='rpmlint', stable_karma=3, unstable_karma=-3, release=Release.query.one()) self.db.add(update) another_user = User(name='aUser') self.db.add(another_user) comment = Comment(karma=1, text='Cool! 😃') comment.user = another_user self.db.add(comment) update.comments.append(comment) self.db.flush() res = self.app.get('/comments/', {"user": "******"}) body = res.json_body assert len(body['comments']) == 2 assert body['comments'][0]['text'] == 'Cool! 😃' assert body['comments'][1]['text'] == 'wow. amaze.'
def setup_method(self, method): super(TestCommentsService, self).setup_method(method) # Add a second update owned by somebody else so we can test karma # policy stuff user2 = User(name='lmacken') self.db.flush() self.db.add(user2) release = self.db.query(Release).filter_by(name='F17').one() update = Update( user=user2, request=UpdateRequest.testing, type=UpdateType.enhancement, notes='Useful details!', release=release, date_submitted=datetime(1984, 11, 2), requirements='rpmlint', stable_karma=3, unstable_karma=-3, ) self.db.add(update) build = RpmBuild( nvr=up2, update=update, package=RpmPackage.query.filter_by(name='bodhi').one()) self.db.add(build) self.db.flush()
def test_list_comments_by_multiple_update_owners(self): another_user = User(name=u'aUser') self.db.add(another_user) update = Update(user=another_user, request=UpdateRequest.testing, type=UpdateType.enhancement, notes=u'Just another update.', date_submitted=datetime(1981, 10, 11), requirements=u'rpmlint', stable_karma=3, unstable_karma=-3, release=Release.query.one()) self.db.add(update) comment = Comment(karma=1, text=u'Cool! 😃') comment.user = another_user self.db.add(comment) update.comments.append(comment) self.db.flush() res = self.app.get('/comments/', {"update_owner": "guest,aUser"}) body = res.json_body self.assertEqual(len(body['comments']), 3) comment = body['comments'][0] self.assertEqual(comment['text'], u'Cool! 😃') comment = body['comments'][1] self.assertEqual(comment['text'], u'srsly. pretty good.')
def test_list_comments_by_multiple_usernames(self): nvr = u'just-testing-1.0-2.fc17' update = Update( title=nvr, request=UpdateRequest.testing, type=UpdateType.enhancement, notes=u'Just another update.', date_submitted=datetime(1981, 10, 11), requirements=u'rpmlint', stable_karma=3, unstable_karma=-3, ) update.release = Release.query.one() self.db.add(update) another_user = User(name=u'aUser') self.db.add(another_user) comment = Comment(karma=1, text=u'Cool! 😃') comment.user = another_user self.db.add(comment) update.comments.append(comment) self.db.flush() res = self.app.get('/comments/', {"user": "******"}) body = res.json_body self.assertEqual(len(body['comments']), 2) self.assertEqual(body['comments'][0]['text'], u'Cool! 😃') self.assertEqual(body['comments'][1]['text'], u'wow. amaze.')
def create_update(session, build_nvrs, release_name='F17'): """ Use the given session to create and return an Update with the given iterable of build_nvrs. Each build_nvr should be a string describing the name, version, and release for the build separated by dashes. For example, build_nvrs might look like this: ('bodhi-2.3.3-1.fc24', 'python-fedora-atomic-composer-2016.3-1.fc24') You can optionally pass a release_name to select a different release than the default F17, but the release must already exist in the database. Args: build_nvrs (iterable): An iterable of strings of NVRs to put into the update. release_name (str): The name of the release to associate with the update. Returns: bodhi.server.models.Update: The generated update. """ release = session.query(Release).filter_by(name=release_name).one() user = session.query(User).filter_by(name='guest').one() builds = [] for nvr in build_nvrs: name, version, rel = nvr.rsplit('-', 2) try: package = session.query(RpmPackage).filter_by(name=name).one() except sqlalchemy.orm.exc.NoResultFound: package = RpmPackage(name=name) session.add(package) testcase = TestCase(name='Wat') session.add(testcase) package.test_cases.append(testcase) builds.append( RpmBuild(nvr=nvr, release=release, package=package, signed=True)) session.add(builds[-1]) # Add a buildroot override for this build expiration_date = datetime.utcnow() expiration_date = expiration_date + timedelta(days=1) override = BuildrootOverride(build=builds[-1], submitter=user, notes='blah blah blah', expiration_date=expiration_date) session.add(override) update = Update(builds=builds, user=user, request=UpdateRequest.testing, notes='Useful details!', type=UpdateType.bugfix, date_submitted=datetime(1984, 11, 2), requirements='rpmlint', stable_karma=3, unstable_karma=-3, release=release) session.add(update) return update
def test_list_comments_by_update_no_comments(self): update = Update(request=UpdateRequest.testing, type=UpdateType.enhancement, notes='Useful details!', date_submitted=datetime(1984, 11, 2), requirements='rpmlint', stable_karma=3, unstable_karma=-3, release=Release.query.one()) self.db.add(update) self.db.flush() res = self.app.get('/comments/', {"updates": update.alias}) body = res.json_body assert len(body['comments']) == 0
def setup_method(self, method): """Set up environment for each test.""" super().setup_method(method) release = self.db.query(Release).filter_by(name='F17').first() package = self.db.query(Package).first() user = self.db.query(User).first() self.update = Update( release=release, stable_karma=0, unstable_karma=0, notes='', type=UpdateType.bugfix, user=user, ) self.build = Build(nvr='colord-1.3.4-1.fc26', update=self.update, type=package.type, package=package) self.db.add(self.update) self.db.add(self.build) self.db.commit() body = { 'contact': '*****@*****.**', 'run': { 'url': 'https://example.url', }, 'artifact': { 'nvr': 'colord-1.3.4-1.fc26' }, 'pipeline': { 'id': 442562, }, 'test': 'test', 'generated_at': 'somedate', 'version': '1.3.4', } self.sample_message = Message(topic='', body=body) self.db_factory = base.TransactionalSessionMaker(self.Session) self.handler = CIHandler(self.db_factory)
def test_list_comments_by_update_no_comments(self): nvr = u'bodhi-2.0-201.fc17' update = Update( title=nvr, request=UpdateRequest.testing, type=UpdateType.enhancement, notes=u'Useful details!', date_submitted=datetime(1984, 11, 2), requirements=u'rpmlint', stable_karma=3, unstable_karma=-3, ) self.db.add(update) self.db.flush() res = self.app.get('/comments/', {"updates": nvr}) body = res.json_body self.assertEquals(len(body['comments']), 0)
def _add_updates(updateslist, user, release, packagesuffix): """Private method that adds updates to the database for testing """ count = 0 for i in updateslist: for j in i[1]: for k in range(0, j[1]): update = Update( user=user, status=i[0], type=j[0], notes='Useful details!', release=release, date_submitted=datetime(1984, 11, 2), requirements='rpmlint', stable_karma=3, unstable_karma=-3, ) self.db.add(update) self.db.commit() count = count + 1
def setUp(self, *args, **kwargs): super(TestCommentsService, self).setUp(*args, **kwargs) # Add a second update owned by somebody else so we can test karma # policy stuff user2 = User(name=u'lmacken') self.db.flush() self.db.add(user2) release = self.db.query(Release).filter_by(name=u'F17').one() update = Update( title=someone_elses_update, user=user2, request=UpdateRequest.testing, type=UpdateType.enhancement, notes=u'Useful details!', release=release, date_submitted=datetime(1984, 11, 2), requirements=u'rpmlint', stable_karma=3, unstable_karma=-3, ) self.db.add(update) self.db.flush()
def __call__(self, message: fedora_messaging.api.Message) -> None: """Create updates from appropriately tagged builds. Args: message: The message we are processing. """ body = message.body missing = [] for mandatory in ('tag', 'build_id', 'name', 'version', 'release'): if mandatory not in body: missing.append(mandatory) if missing: log.debug( f"Received incomplete tag message. Missing: {', '.join(missing)}" ) return btag = body['tag'] bnvr = '{name}-{version}-{release}'.format(**body) koji = buildsys.get_session() kbuildinfo = koji.getBuild(bnvr) if not kbuildinfo: log.debug(f"Can't find Koji build for {bnvr}.") return if 'nvr' not in kbuildinfo: log.debug(f"Koji build info for {bnvr} doesn't contain 'nvr'.") return if 'owner_name' not in kbuildinfo: log.debug( f"Koji build info for {bnvr} doesn't contain 'owner_name'.") return if kbuildinfo['owner_name'] in config.get( 'automatic_updates_blacklist'): log.debug( f"{bnvr} owned by {kbuildinfo['owner_name']} who is listed in " "automatic_updates_blacklist, skipping.") return # some APIs want the Koji build info, some others want the same # wrapped in a larger (request?) structure rbuildinfo = { 'info': kbuildinfo, 'nvr': kbuildinfo['nvr'].rsplit('-', 2), } with self.db_factory() as dbsession: rel = dbsession.query(Release).filter_by( create_automatic_updates=True, candidate_tag=btag).first() if not rel: log.debug( f"Ignoring build being tagged into {btag!r}, no release configured for " "automatic updates for it found.") return bcls = ContentType.infer_content_class(Build, kbuildinfo) build = bcls.get(bnvr) if build and build.update: log.info( f"Build, active update for {bnvr} exists already, skipping." ) return if not build: log.debug(f"Build for {bnvr} doesn't exist yet, creating.") # Package.get_or_create() infers content type already log.debug("Getting/creating related package object.") pkg = Package.get_or_create(dbsession, rbuildinfo) log.debug("Creating build object, adding it to the DB.") build = bcls(nvr=bnvr, package=pkg, release=rel) dbsession.add(build) owner_name = kbuildinfo['owner_name'] user = User.get(owner_name) if not user: log.debug(f"Creating bodhi user for '{owner_name}'.") # Leave email, groups blank, these will be filled # in or updated when they log into Bodhi next time, see # bodhi.server.security:remember_me(). user = User(name=owner_name) dbsession.add(user) log.debug(f"Creating new update for {bnvr}.") try: changelog = build.get_changelog(lastupdate=True) except ValueError: # Often due to bot-generated builds # https://github.com/fedora-infra/bodhi/issues/4146 changelog = None except Exception: # Re-raise exception, so that the message can be re-queued raise closing_bugs = [] if changelog: log.debug("Adding changelog to update notes.") notes = f"""Automatic update for {bnvr}. ##### **Changelog** ``` {changelog} ```""" if rel.name not in config.get('bz_exclude_rels'): for b in re.finditer(config.get('bz_regex'), changelog, re.IGNORECASE): idx = int(b.group(1)) log.debug(f'Adding bug #{idx} to the update.') bug = Bug.get(idx) if bug is None: bug = Bug(bug_id=idx) dbsession.add(bug) dbsession.flush() if bug not in closing_bugs: closing_bugs.append(bug) else: notes = f"Automatic update for {bnvr}." update = Update( release=rel, builds=[build], bugs=closing_bugs, notes=notes, type=UpdateType.unspecified, stable_karma=3, unstable_karma=-3, autokarma=False, user=user, status=UpdateStatus.pending, critpath=Update.contains_critpath_component([build], rel.branch), ) # Comment on the update that it was automatically created. update.comment( dbsession, str("This update was automatically created"), author="bodhi", ) update.add_tag(update.release.pending_signing_tag) log.debug("Adding new update to the database.") dbsession.add(update) log.debug("Flushing changes to the database.") dbsession.flush() # Obsolete older updates which may be stuck in testing due to failed gating try: update.obsolete_older_updates(dbsession) except Exception as e: log.error(f'Problem obsoleting older updates: {e}') alias = update.alias buglist = [b.bug_id for b in update.bugs] # This must be run after dbsession is closed so changes are committed to db work_on_bugs_task.delay(alias, buglist)
def __call__(self, message: fedora_messaging.api.Message) -> None: """Create updates from appropriately tagged builds. Args: message: The message we are processing. """ body = message.body missing = [] for mandatory in ('tag', 'build_id', 'name', 'version', 'release'): if mandatory not in body: missing.append(mandatory) if missing: log.debug( f"Received incomplete tag message. Missing: {', '.join(missing)}" ) return btag = body['tag'] bnvr = '{name}-{version}-{release}'.format(**body) koji = buildsys.get_session() kbuildinfo = koji.getBuild(bnvr) if not kbuildinfo: log.debug(f"Can't find Koji build for {bnvr}.") return if 'nvr' not in kbuildinfo: log.debug(f"Koji build info for {bnvr} doesn't contain 'nvr'.") return if 'owner_name' not in kbuildinfo: log.debug( f"Koji build info for {bnvr} doesn't contain 'owner_name'.") return if kbuildinfo['owner_name'] in config.get( 'automatic_updates_blacklist'): log.debug( f"{bnvr} owned by {kbuildinfo['owner_name']} who is listed in " "automatic_updates_blacklist, skipping.") return # some APIs want the Koji build info, some others want the same # wrapped in a larger (request?) structure rbuildinfo = { 'info': kbuildinfo, 'nvr': kbuildinfo['nvr'].rsplit('-', 2), } with self.db_factory() as dbsession: rel = dbsession.query(Release).filter_by( create_automatic_updates=True, candidate_tag=btag).first() if not rel: log.debug( f"Ignoring build being tagged into {btag!r}, no release configured for " "automatic updates for it found.") return bcls = ContentType.infer_content_class(Build, kbuildinfo) build = bcls.get(bnvr) if build and build.update: log.info( f"Build, active update for {bnvr} exists already, skipping." ) return if not build: log.debug(f"Build for {bnvr} doesn't exist yet, creating.") # Package.get_or_create() infers content type already log.debug("Getting/creating related package object.") pkg = Package.get_or_create(dbsession, rbuildinfo) log.debug("Creating build object, adding it to the DB.") build = bcls(nvr=bnvr, package=pkg, release=rel) dbsession.add(build) owner_name = kbuildinfo['owner_name'] user = User.get(owner_name) if not user: log.debug(f"Creating bodhi user for '{owner_name}'.") # Leave email, groups blank, these will be filled # in or updated when they log into Bodhi next time, see # bodhi.server.security:remember_me(). user = User(name=owner_name) dbsession.add(user) log.debug(f"Creating new update for {bnvr}.") changelog = build.get_changelog(lastupdate=True) if changelog: notes = f"""Automatic update for {bnvr}. ##### **Changelog** ``` {changelog} ```""" else: notes = f"Automatic update for {bnvr}." update = Update( release=rel, builds=[build], notes=notes, type=UpdateType.unspecified, stable_karma=3, unstable_karma=-3, autokarma=False, user=user, status=UpdateStatus.pending, ) # Comment on the update that it was automatically created. update.comment( dbsession, str("This update was automatically created"), author="bodhi", ) update.add_tag(update.release.pending_signing_tag) log.debug("Adding new update to the database.") dbsession.add(update) log.debug("Committing changes to the database.") dbsession.commit()