def bz_bugs(self, count=100): comps = self.ses.query(OpSysComponent).all() releases = self.ses.query(OpSysRelease).all() bz_users = self.ses.query(BzUser).all() self.begin('Bz bugs') for i in range(count): comp = random.choice(comps) bug = BzBug() bug.id = 900000 + i*1337 # over 9000 bug.summary = '[faf] Crash in component {0}'.format(comp) bug.status = random.choice(pyfaf.storage.bugzilla.BUG_STATES) if bug.status == 'CLOSED': bug.resolution = random.choice( pyfaf.storage.bugzilla.BUG_RESOLUTIONS) when = datetime.now().date() + fuzzy_timedelta( months=random.randrange(-6, 0)) bug.creation_time = when bug.last_change_time = when bug.opsysrelease = random.choice(releases) bug.component = comp bug.creator = random.choice(bz_users) bug.whiteboard = 'empty' self.add(bug) self.commit()
def bz_bugs(self, count=100): comps = self.ses.query(OpSysComponent).all() releases = self.ses.query(OpSysRelease).all() bz_users = self.ses.query(BzUser).all() self.begin("Bz bugs") for i in range(count): comp = random.choice(comps) bug = BzBug() bug.id = 900000 + i * 1337 # over 9000 bug.summary = "[faf] Crash in component {0}".format(comp) bug.status = random.choice(pyfaf.storage.bugzilla.BUG_STATES) if bug.status == "CLOSED": bug.resolution = random.choice(pyfaf.storage.bugzilla.BUG_RESOLUTIONS) when = datetime.now().date() + fuzzy_timedelta(months=random.randrange(-6, 0)) bug.creation_time = when bug.last_change_time = when bug.opsysrelease = random.choice(releases) bug.component = comp bug.creator = random.choice(bz_users) bug.whiteboard = "empty" self.add(bug) self.commit()
def setUp(self): """ Add required stuff to the database """ super(UreportTestCase, self).setUp() self.basic_fixtures() tracker = Bugtracker(name="fedora-bugzilla") self.db.session.add(tracker) bzuser = BzUser(name="Fake user", email="*****@*****.**", real_name="Fake name", can_login=False) self.db.session.add(bzuser) bug = BzBug() bug.id = 123456 bug.summary = "Fake bug" bug.status = "NEW" bug.creation_time = datetime.datetime.now() bug.last_change_time = datetime.datetime.now() bug.whiteboard = "empty" bug.tracker = tracker bug.creator = bzuser bug.component = self.comp_faf bug.opsysrelease = self.release_20 bug.private = False self.bug = bug self.db.session.add(bug) self.db.session.flush() self.sample_report_names = ("ureport1", "ureport2", "ureport_core", "ureport_python", "ureport_kerneloops", "ureport_java", "ureport_ruby", "ureport_kerneloops_nouveau") self.sample_reports = {} for report_name in self.sample_report_names: with open("sample_reports/{0}".format(report_name), "r") as file: self.sample_reports[report_name] = json.load(file) with open("sample_reports/bugzilla_attachment", "r") as file: self.bugzilla_attachment = json.load(file) with open("sample_reports/comment_attachment", "r") as file: self.comment_attachment = json.load(file) with open("sample_reports/contact_email_attachment", "r") as file: self.contact_email_attachment = json.load(file) with open("sample_reports/url_attachment", "r") as file: self.url_attachment = json.load(file)
def _save_bug(self, db, bug): """ Save bug represented by `bug_dict` to the database. If bug is marked as duplicate, the duplicate bug is downloaded as well. """ bug_dict = self._preprocess_bug(bug) if not bug_dict: self.log_error("Bug pre-processing failed") raise FafError("Bug pre-processing failed") self.log_debug("Saving bug #{0}: {1}".format(bug_dict["bug_id"], bug_dict["summary"])) bug_id = bug_dict["bug_id"] # check if we already have this bug up-to-date old_bug = ( db.session.query(BzBug) .filter(BzBug.id == bug_id) .filter(BzBug.last_change_time == bug_dict["last_change_time"]) .first()) if old_bug: self.log_info("Bug already up-to-date") return old_bug tracker = queries.get_bugtracker_by_name(db, self.name) if not tracker: self.log_error("Tracker with name '{0}' is not installed" .format(self.name)) raise FafError("Tracker with name '{0}' is not installed" .format(self.name)) opsysrelease = queries.get_osrelease(db, bug_dict["product"], bug_dict["version"]) if not opsysrelease: self.log_error("Unable to save this bug due to unknown " "release '{0} {1}'".format(bug_dict["product"], bug_dict["version"])) raise FafError("Unable to save this bug due to unknown " "release '{0} {1}'".format(bug_dict["product"], bug_dict["version"])) relcomponent = queries.get_component_by_name_release( db, opsysrelease, bug_dict["component"]) if not relcomponent: self.log_error("Unable to save this bug due to unknown " "component '{0}'".format(bug_dict["component"])) raise FafError("Unable to save this bug due to unknown " "component '{0}'".format(bug_dict["component"])) component = relcomponent.component reporter = queries.get_bz_user(db, bug_dict["reporter"]) if not reporter: self.log_debug("Creator {0} not found".format( bug_dict["reporter"])) downloaded = self._download_user(bug_dict["reporter"]) if not downloaded: self.log_error("Unable to download user, skipping.") raise FafError("Unable to download user, skipping.") reporter = self._save_user(db, downloaded) new_bug = BzBug() new_bug.id = bug_dict["bug_id"] new_bug.summary = bug_dict["summary"] new_bug.status = bug_dict["status"] new_bug.creation_time = bug_dict["creation_time"] new_bug.last_change_time = bug_dict["last_change_time"] new_bug.private = True if bug_dict["groups"] else False if bug_dict["status"] == "CLOSED": new_bug.resolution = bug_dict["resolution"] if bug_dict["resolution"] == "DUPLICATE": if not queries.get_bz_bug(db, bug_dict["dupe_id"]): self.log_debug("Duplicate #{0} not found".format( bug_dict["dupe_id"])) dup = self.download_bug_to_storage(db, bug_dict["dupe_id"]) if dup: new_bug.duplicate = dup.id new_bug.tracker_id = tracker.id new_bug.component_id = component.id new_bug.opsysrelease_id = opsysrelease.id new_bug.creator_id = reporter.id new_bug.whiteboard = bug_dict["status_whiteboard"] # the bug itself might be downloaded during duplicate processing # exit in this case - it would cause duplicate database entry if queries.get_bz_bug(db, bug_dict["bug_id"]): self.log_debug("Bug #{0} already exists in storage," " updating".format(bug_dict["bug_id"])) bugdict = {} for col in new_bug.__table__._columns: bugdict[col.name] = getattr(new_bug, col.name) (db.session.query(BzBug) .filter(BzBug.id == bug_id).update(bugdict)) new_bug = queries.get_bz_bug(db, bug_dict["bug_id"]) else: db.session.add(new_bug) db.session.flush() self._save_ccs(db, bug_dict["cc"], new_bug.id) self._save_history(db, bug_dict["history"], new_bug.id) if self.save_attachments: self._save_attachments(db, bug_dict["attachments"], new_bug.id) if self.save_comments: self._save_comments(db, bug_dict["comments"], new_bug.id) return new_bug
def releasedel_testing(self, repo_type): self.assertEqual( self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "1337", }), 1) # add release f24 and assign two builds self.assign_release_to_builds_testing(repo_type) # assign sample_repo to f24 release (sample_repo comes from ^^^) self.assertEqual( self.call_action_ordered_args( "repoassign", [ "sample_repo", # NAME "Fedora 24", # OPSYS "x86_64", # ARCH ]), 0) tracker = Bugtracker(name="fedora-bugzilla") self.db.session.add(tracker) self.save_report('ureport_f20') self.save_report('ureport_core') self.call_action("create-problems") bzuser = BzUser(name="Fake user", email="*****@*****.**", real_name="Fake name", can_login=False) self.db.session.add(bzuser) bug = BzBug() bug.id = 123456 bug.summary = "Fake bug" bug.status = "NEW" bug.creation_time = datetime.now() bug.last_change_time = datetime.now() bug.whiteboard = "empty" bug.tracker = tracker bug.creator = bzuser bug.component = self.comp_faf bug.opsysrelease = self.release_20 bug.private = False self.db.session.add(bug) # add package and lob that will be deleted pkg_del = Package() pkg_del.build = self.db.session.query(Build).first() pkg_del.arch = self.db.session.query(Arch).first() pkg_del.name = "pkg-test-del" self.db.session.add(pkg_del) self.db.session.flush() config["storage.lobdir"] = tempfile.mkdtemp(prefix="faf") sample_rpm = glob.glob("sample_rpms/sample*.rpm")[0] with open(sample_rpm, mode='rb') as sample: pkg_del.save_lob("package", sample, truncate=True) self.assertTrue(pkg_del.has_lob("package")) # add build and package and lob that will not be deleted build = Build() build.base_package_name = "build_unassigned" build.epoch = 0 build.version = "1.2.3" build.release = "20.fc23" self.db.session.add(build) pkg_stay = Package() pkg_stay.build = build pkg_stay.arch = self.db.session.query(Arch).first() pkg_stay.name = "pkg-test-stay" self.db.session.add(pkg_stay) self.db.session.flush() sample_rpm = glob.glob("sample_rpms/sample*.rpm")[0] with open(sample_rpm, mode='rb') as sample: pkg_stay.save_lob("package", sample, truncate=True) self.assertTrue(pkg_stay.has_lob("package")) init_bosra = self.db.session.query(BuildOpSysReleaseArch).count() bosra = self.db.session.query(BuildOpSysReleaseArch).count() # delete release f24 with assigned repos and builds with lobs self.assertEqual( self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "24", }), 0) self.assertEqual(bosra, init_bosra) self.assertTrue(pkg_stay.has_lob("package")) self.assertFalse(pkg_del.has_lob("package")) self.assertEqual(self.db.session.query(Report).count(), 2) self.assertEqual(self.db.session.query(Problem).count(), 2) # delete release f20 with assigned bugs, reports and problems self.assertEqual( self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "20", }), 0) self.assertEqual(self.db.session.query(Report).count(), 0) self.assertEqual(self.db.session.query(Problem).count(), 0) # attempt to delete deleted release f20 self.assertEqual( self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "20", }), 1)
def _save_bug(self, db, bug): """ Save bug represented by `bug_dict` to the database. If bug is marked as duplicate, the duplicate bug is downloaded as well. """ bug_dict = self.preprocess_bug(bug) if not bug_dict: self.log_error("Bug pre-processing failed") raise FafError("Bug pre-processing failed") self.log_debug("Saving bug #{0}: {1}".format(bug_dict["bug_id"], bug_dict["summary"])) bug_id = bug_dict["bug_id"] # check if we already have this bug up-to-date old_bug = ( db.session.query(BzBug) .filter(BzBug.id == bug_id) .filter(BzBug.last_change_time == bug_dict["last_change_time"]) .first()) if old_bug: self.log_info("Bug already up-to-date") return old_bug tracker = queries.get_bugtracker_by_name(db, self.name) if not tracker: self.log_error("Tracker with name '{0}' is not installed" .format(self.name)) raise FafError("Tracker with name '{0}' is not installed" .format(self.name)) opsysrelease = queries.get_osrelease(db, bug_dict["product"], bug_dict["version"]) if not opsysrelease: self.log_error("Unable to save this bug due to unknown " "release '{0} {1}'".format(bug_dict["product"], bug_dict["version"])) raise FafError("Unable to save this bug due to unknown " "release '{0} {1}'".format(bug_dict["product"], bug_dict["version"])) relcomponent = queries.get_component_by_name_release( db, opsysrelease, bug_dict["component"]) if not relcomponent: self.log_error("Unable to save this bug due to unknown " "component '{0}'".format(bug_dict["component"])) raise FafError("Unable to save this bug due to unknown " "component '{0}'".format(bug_dict["component"])) component = relcomponent.component reporter = queries.get_bz_user(db, bug_dict["reporter"]) if not reporter: self.log_debug("Creator {0} not found".format( bug_dict["reporter"])) downloaded = self._download_user(bug_dict["reporter"]) if not downloaded: self.log_error("Unable to download user, skipping.") raise FafError("Unable to download user, skipping.") reporter = self._save_user(db, downloaded) new_bug = BzBug() new_bug.id = bug_dict["bug_id"] new_bug.summary = bug_dict["summary"] new_bug.status = bug_dict["status"] new_bug.creation_time = bug_dict["creation_time"] new_bug.last_change_time = bug_dict["last_change_time"] new_bug.private = bool(bug_dict["groups"]) if bug_dict["status"] == "CLOSED": new_bug.resolution = bug_dict["resolution"] if bug_dict["resolution"] == "DUPLICATE": if not queries.get_bz_bug(db, bug_dict["dupe_id"]): self.log_debug("Duplicate #{0} not found".format( bug_dict["dupe_id"])) dup = self.download_bug_to_storage(db, bug_dict["dupe_id"]) if dup: new_bug.duplicate = dup.id new_bug.tracker_id = tracker.id new_bug.component_id = component.id new_bug.opsysrelease_id = opsysrelease.id new_bug.creator_id = reporter.id new_bug.whiteboard = bug_dict["status_whiteboard"] # the bug itself might be downloaded during duplicate processing # exit in this case - it would cause duplicate database entry if queries.get_bz_bug(db, bug_dict["bug_id"]): self.log_debug("Bug #{0} already exists in storage," " updating".format(bug_dict["bug_id"])) bugdict = {} for col in new_bug.__table__._columns: #pylint: disable=protected-access bugdict[col.name] = getattr(new_bug, col.name) (db.session.query(BzBug) .filter(BzBug.id == bug_id).update(bugdict)) new_bug = queries.get_bz_bug(db, bug_dict["bug_id"]) else: db.session.add(new_bug) db.session.flush() self._save_ccs(db, bug_dict["cc"], new_bug.id) self._save_history(db, bug_dict["history"], new_bug.id) if self.save_attachments: self._save_attachments(db, bug_dict["attachments"], new_bug.id) if self.save_comments: self._save_comments(db, bug_dict["comments"], new_bug.id) return new_bug
def releasedel_testing(self, repo_type): self.assertEqual(self.call_action("releasedel"), 1) self.assertEqual(self.call_action("releasedel", { "opsys": "FooBarOS", }), 1) self.assertEqual(self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "1337", }), 1) # add release f24 and assign two builds self.assign_release_to_builds_testing(repo_type) # assign sample_repo to f24 release (sample_repo comes from ^^^) self.assertEqual(self.call_action_ordered_args("repoassign", [ "sample_repo", # NAME "Fedora 24", # OPSYS "x86_64", # ARCH ]), 0) tracker = Bugtracker(name="fedora-bugzilla") self.db.session.add(tracker) self.save_report('ureport_f20') self.save_report('ureport_core') self.call_action("create-problems") bzuser = BzUser(name="Fake user", email="*****@*****.**", real_name="Fake name", can_login=False) self.db.session.add(bzuser) bug = BzBug() bug.id = 123456 bug.summary = "Fake bug" bug.status = "NEW" bug.creation_time = datetime.now() bug.last_change_time = datetime.now() bug.whiteboard = "empty" bug.tracker = tracker bug.creator = bzuser bug.component = self.comp_faf bug.opsysrelease = self.release_20 bug.private = False self.db.session.add(bug) # add package and lob that will be deleted pkg_del = Package() pkg_del.build = self.db.session.query(Build).first() pkg_del.arch = self.db.session.query(Arch).first() pkg_del.name = "pkg-test-del" self.db.session.add(pkg_del) self.db.session.flush() config["storage.lobdir"] = tempfile.mkdtemp(prefix="faf") sample_rpm = glob.glob("sample_rpms/sample*.rpm")[0] with open(sample_rpm, mode='rb') as sample: pkg_del.save_lob("package", sample, truncate=True) self.assertTrue(pkg_del.has_lob("package")) # add build and package and lob that will not be deleted build = Build() build.base_package_name = "build_unassigned" build.epoch = 0 build.version = "1.2.3" build.release = "20.fc23" self.db.session.add(build) pkg_stay = Package() pkg_stay.build = build pkg_stay.arch = self.db.session.query(Arch).first() pkg_stay.name = "pkg-test-stay" self.db.session.add(pkg_stay) self.db.session.flush() sample_rpm = glob.glob("sample_rpms/sample*.rpm")[0] with open(sample_rpm, mode='rb') as sample: pkg_stay.save_lob("package", sample, truncate=True) self.assertTrue(pkg_stay.has_lob("package")) init_bosra = self.db.session.query(BuildOpSysReleaseArch).count() bosra = self.db.session.query(BuildOpSysReleaseArch).count() # delete release f24 with assigned repos and builds with lobs self.assertEqual(self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "24", }), 0) self.assertEqual(bosra, init_bosra) self.assertTrue(pkg_stay.has_lob("package")) self.assertFalse(pkg_del.has_lob("package")) self.assertEqual(self.db.session.query(Report).count(), 2) self.assertEqual(self.db.session.query(Problem).count(), 2) # delete release f20 with assigned bugs, reports and problems self.assertEqual(self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "20", }), 0) self.assertEqual(self.db.session.query(Report).count(), 0) self.assertEqual(self.db.session.query(Problem).count(), 0) # attempt to delete deleted release f20 self.assertEqual(self.call_action("releasedel", { "opsys": "fedora", "opsys-release": "20", }), 1)