def run(self, cmdline, db) -> None: mbt = bugtrackers["centos-mantisbt"] db_tracker = get_bugtracker_by_name(db, "centos-mantisbt") for bug_id in mbt.list_bugs(): self.log_info("Processing Mantis issue #{0}".format(bug_id)) bug = mbt.mc.mc_issue_get(mbt.user, mbt.password, bug_id) bug_dict = mbt.preprocess_bug(bug) if bug_dict and bug_dict.get("url", False): url = bug_dict["url"] report_hash = url.split("/")[-1] db_report = get_report(db, report_hash) if db_report is None: self.log_info( "Report with hash {0} not found.".format(report_hash)) continue db_mantisbug = get_mantis_bug(db, bug_id, db_tracker.id) if db_mantisbug is None: self.log_info("Downloading bug to storage...") db_mantisbug = mbt.download_bug_to_storage(db, bug_id) if db_mantisbug is None: self.log_info("Failed to download bug.") continue db_rm = (db.session.query(ReportMantis).filter( ReportMantis.report == db_report).filter( ReportMantis.mantisbug == db_mantisbug).first()) if db_rm is None: db_rm = ReportMantis() db_rm.mantisbug = db_mantisbug db_rm.report = db_report db.session.add(db_rm) db.session.flush() self.log_info( "Associated issue #{0} with report #{1}.".format( bug_id, db_report.id)) else: self.log_info( "Bug {0} is not a valid ABRT issue.".format(bug_id))
def run(self, cmdline, db): mbt = bugtrackers["centos-mantisbt"] db_tracker = get_bugtracker_by_name(db, "centos-mantisbt") for bug_id in mbt.list_bugs(): self.log_info("Processing Mantis issue #{0}".format(bug_id)) bug = mbt.mc.mc_issue_get(mbt.user, mbt.password, bug_id) bug_dict = mbt._preprocess_bug(bug) if bug_dict and bug_dict.get("url", False): url = bug_dict["url"] report_hash = url.split("/")[-1] db_report = get_report(db, report_hash) if db_report is None: self.log_info("Report with hash {0} not found.".format(report_hash)) continue db_mantisbug = get_mantis_bug(db, bug_id, db_tracker.id) if db_mantisbug is None: self.log_info("Downloading bug to storage...") db_mantisbug = mbt.download_bug_to_storage(db, bug_id) if db_mantisbug is None: self.log_info("Failed to download bug.") continue db_rm = ( db.session.query(ReportMantis) .filter(ReportMantis.report == db_report) .filter(ReportMantis.mantisbug == db_mantisbug) .first() ) if db_rm is None: db_rm = ReportMantis() db_rm.mantisbug = db_mantisbug db_rm.report = db_report db.session.add(db_rm) db.session.flush() self.log_info("Associated issue #{0} with report #{1}.".format(bug_id, db_report.id)) else: self.log_info("Not a valid ABRT issue.".format(bug_id))
def save_attachment(db, attachment): atype = attachment["type"].lower() if not attachment_type_allowed(atype): raise FafError( "Attachment type '{}' not allowed on this server".format(atype)) report = get_report(db, attachment["bthash"]) if not report: raise FafError("Report for given bthash not found") if atype in ["rhbz", "fedora-bugzilla", "rhel-bugzilla"]: bug_id = int(attachment["data"]) reportbug = (db.session.query( ReportBz).filter((ReportBz.report_id == report.id) & (ReportBz.bzbug_id == bug_id)).first()) if reportbug: log.debug("Skipping existing attachment") return bug = get_bz_bug(db, bug_id) if not bug: if atype in bugtrackers: # download from bugtracker identified by atype tracker = bugtrackers[atype] if not tracker.installed(db): raise FafError("Bugtracker used in this attachment" " is not installed") bug = tracker.download_bug_to_storage(db, bug_id) elif atype == "rhbz": # legacy value # - we need to guess the bugtracker: # either fedora-bugzilla or rhel-bugzilla, # former is more probable for possible_tracker in ["fedora-bugzilla", "rhel-bugzilla"]: if possible_tracker not in bugtrackers: continue tracker = bugtrackers[possible_tracker] if not tracker.installed(db): continue bug = tracker.download_bug_to_storage(db, bug_id) if bug: break if bug: new = ReportBz() new.report = report new.bzbug = bug db.session.add(new) db.session.flush() else: log.error("Failed to fetch bug #{0} from '{1}'".format( bug_id, atype)) elif atype == "centos-mantisbt": bug_id = int(attachment["data"]) reportbug = (db.session.query(ReportMantis).filter( (ReportMantis.report_id == report.id) & (ReportMantis.mantisbug_id == bug_id)).first()) if reportbug: log.debug("Skipping existing attachment") return bug = get_mantis_bug(db, bug_id) if not bug: if atype in bugtrackers: # download from bugtracker identified by atype tracker = bugtrackers[atype] if not tracker.installed(db): raise FafError("Bugtracker used in this attachment" " is not installed") bug = tracker.download_bug_to_storage(db, bug_id) if bug: new = ReportMantis() new.report = report new.mantisbug = bug db.session.add(new) db.session.flush() else: log.error("Failed to fetch bug #{0} from '{1}'".format( bug_id, atype)) elif atype == "comment": comment = ReportComment() comment.report = report comment.text = attachment["data"] comment.saved = datetime.datetime.utcnow() db.session.add(comment) db.session.flush() elif atype == "email": db_contact_email = get_contact_email(db, attachment["data"]) if db_contact_email is None: db_contact_email = ContactEmail() db_contact_email.email_address = attachment["data"] db.session.add(db_contact_email) db_report_contact_email = ReportContactEmail() db_report_contact_email.contact_email = db_contact_email db_report_contact_email.report = report db.session.add(db_report_contact_email) else: db_report_contact_email = \ get_report_contact_email(db, db_contact_email.id, report.id) if db_report_contact_email is None: db_report_contact_email = ReportContactEmail() db_report_contact_email.contact_email = db_contact_email db_report_contact_email.report = report db.session.add(db_report_contact_email) try: db.session.flush() except IntegrityError: raise FafError("Email address already assigned to the report") elif atype == "url": url = attachment["data"] # 0ne URL can be attached to many Reports, but every reports must # have unique url's db_url = (db.session.query(ReportURL).filter( ReportURL.url == url).filter( ReportURL.report_id == report.id).first()) if db_url: log.debug("Skipping existing URL") return db_url = ReportURL() db_url.report = report db_url.url = url db_url.saved = datetime.datetime.utcnow() try: db.session.flush() except IntegrityError: raise FafError("Unable to save URL") else: log.warning("Unknown attachment type")
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") return self.log_debug("Saving bug #{0}: {1}".format(bug_dict["bug_id"], bug_dict["summary"])) bug_id = bug_dict["bug_id"] 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)) return # check if we already have this bug up-to-date old_bug = ( db.session.query(MantisBug) .filter(MantisBug.external_id == bug_id) .filter(MantisBug.tracker_id == tracker.id) .filter(MantisBug.last_change_time == bug_dict["last_change_time"]) .first()) if old_bug: self.log_info("Bug already up-to-date") return old_bug 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"])) return 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"])) return component = relcomponent.component new_bug = MantisBug() new_bug.external_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"] if bug_dict["status"] == "CLOSED": new_bug.resolution = bug_dict["resolution"] if bug_dict["resolution"] == "DUPLICATE": if not queries.get_mantis_bug(db, bug_dict["dupe_id"], tracker.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_id = dup.id new_bug.tracker_id = tracker.id new_bug.component_id = component.id new_bug.opsysrelease_id = opsysrelease.id # the bug itself might be downloaded during duplicate processing # exit in this case - it would cause duplicate database entry if queries.get_mantis_bug(db, bug_dict["bug_id"], tracker.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(MantisBug) .filter(MantisBug.external_id == bug_id) .filter(MantisBug.tracker_id == tracker.id) .update(bugdict)) new_bug = queries.get_mantis_bug(db, bug_dict["bug_id"], tracker.id) else: db.session.add(new_bug) db.session.flush() return new_bug
def save_attachment(db, attachment): atype = attachment["type"].lower() if not attachment_type_allowed(atype): raise FafError("Attachment type '{}' not allowed on this server" .format(atype)) report = get_report(db, attachment["bthash"]) if not report: raise FafError("Report for given bthash not found") if atype in ["rhbz", "fedora-bugzilla", "rhel-bugzilla"]: bug_id = int(attachment["data"]) reportbug = (db.session.query(ReportBz) .filter( (ReportBz.report_id == report.id) & (ReportBz.bzbug_id == bug_id) ) .first()) if reportbug: log.debug("Skipping existing attachment") return bug = get_bz_bug(db, bug_id) if not bug: if atype in bugtrackers: # download from bugtracker identified by atype tracker = bugtrackers[atype] if not tracker.installed(db): raise FafError("Bugtracker used in this attachment" " is not installed") bug = tracker.download_bug_to_storage(db, bug_id) elif atype == "rhbz": # legacy value # - we need to guess the bugtracker: # either fedora-bugzilla or rhel-bugzilla, # former is more probable for possible_tracker in ["fedora-bugzilla", "rhel-bugzilla"]: if possible_tracker not in bugtrackers: continue tracker = bugtrackers[possible_tracker] if not tracker.installed(db): continue bug = tracker.download_bug_to_storage(db, bug_id) if bug: break if bug: new = ReportBz() new.report = report new.bzbug = bug db.session.add(new) db.session.flush() else: log.error("Failed to fetch bug #{0} from '{1}'" .format(bug_id, atype)) elif atype == "centos-mantisbt": bug_id = int(attachment["data"]) reportbug = (db.session.query(ReportMantis) .filter( (ReportMantis.report_id == report.id) & (ReportMantis.mantisbug_id == bug_id)) .first()) if reportbug: log.debug("Skipping existing attachment") return bug = get_mantis_bug(db, bug_id) if not bug: if atype in bugtrackers: # download from bugtracker identified by atype tracker = bugtrackers[atype] if not tracker.installed(db): raise FafError("Bugtracker used in this attachment" " is not installed") bug = tracker.download_bug_to_storage(db, bug_id) if bug: new = ReportMantis() new.report = report new.mantisbug = bug db.session.add(new) db.session.flush() else: log.error("Failed to fetch bug #{0} from '{1}'" .format(bug_id, atype)) elif atype == "comment": comment = ReportComment() comment.report = report comment.text = attachment["data"] comment.saved = datetime.datetime.utcnow() db.session.add(comment) db.session.flush() elif atype == "email": db_contact_email = get_contact_email(db, attachment["data"]) if db_contact_email is None: db_contact_email = ContactEmail() db_contact_email.email_address = attachment["data"] db.session.add(db_contact_email) db_report_contact_email = ReportContactEmail() db_report_contact_email.contact_email = db_contact_email db_report_contact_email.report = report db.session.add(db_report_contact_email) else: db_report_contact_email = \ get_report_contact_email(db, db_contact_email.id, report.id) if db_report_contact_email is None: db_report_contact_email = ReportContactEmail() db_report_contact_email.contact_email = db_contact_email db_report_contact_email.report = report db.session.add(db_report_contact_email) try: db.session.flush() except IntegrityError: raise FafError("Email address already assigned to the report") elif atype == "url": url = attachment["data"] # 0ne URL can be attached to many Reports, but every reports must # have unique url's db_url = (db.session.query(ReportURL) .filter(ReportURL.url == url) .filter(ReportURL.report_id == report.id) .first()) if db_url: log.debug("Skipping existing URL") return db_url = ReportURL() db_url.report = report db_url.url = url db_url.saved = datetime.datetime.utcnow() try: db.session.flush() except IntegrityError: raise FafError("Unable to save URL") else: log.warning("Unknown attachment type")