def run(self, cmdline, db): if cmdline.opsys is None: self.log_error("You must specify an operating system") return 1 if not cmdline.opsys in systems: self.log_error("Operating system '{0}' does not exist".format( cmdline.opsys)) return 1 opsys = systems[cmdline.opsys] db_opsys = get_opsys_by_name(db, opsys.nice_name) if db_opsys is None: self.log_error("Operating system '{0}' is not installed".format( opsys.nice_name)) return 1 db_component = get_component_by_name(db, cmdline.COMPONENT, opsys.nice_name) if db_component is None: self.log_info( "Adding component '{0}' to operating system '{1}'".format( cmdline.COMPONENT, opsys.nice_name)) db_component = OpSysComponent() db_component.opsys = db_opsys db_component.name = cmdline.COMPONENT db.session.add(db_component) for release in cmdline.opsys_release: db_release = get_osrelease(db, opsys.nice_name, release) if db_release is None: self.log_warn("Release '{0} {1}' is not defined".format( opsys.nice_name, release)) continue db_relcomponent = get_component_by_name_release( db, db_release, cmdline.COMPONENT) if db_relcomponent is None: self.log_info("Adding component '{0}' to '{1} {2}'".format( cmdline.COMPONENT, opsys.nice_name, release)) db_relcomponent = OpSysReleaseComponent() db_relcomponent.component = db_component db_relcomponent.release = db_release db.session.add(db_relcomponent) db.session.flush() return 0
def run(self, cmdline, db): if cmdline.opsys is None: self.log_error("You must specify an operating system") return 1 if not cmdline.opsys in systems: self.log_error("Operating system '{0}' does not exist" .format(cmdline.opsys)) return 1 opsys = systems[cmdline.opsys] db_opsys = get_opsys_by_name(db, opsys.nice_name) if db_opsys is None: self.log_error("Operating system '{0}' is not installed" .format(opsys.nice_name)) return 1 db_component = get_component_by_name(db, cmdline.COMPONENT, opsys.nice_name) if db_component is None: self.log_info("Adding component '{0}' to operating system '{1}'" .format(cmdline.COMPONENT, opsys.nice_name)) db_component = OpSysComponent() db_component.opsys = db_opsys db_component.name = cmdline.COMPONENT db.session.add(db_component) for release in cmdline.opsys_release: db_release = get_osrelease(db, opsys.nice_name, release) if db_release is None: self.log_warn("Release '{0} {1}' is not defined" .format(opsys.nice_name, release)) continue db_relcomponent = get_component_by_name_release(db, db_release, cmdline.COMPONENT) if db_relcomponent is None: self.log_info("Adding component '{0}' to '{1} {2}'" .format(cmdline.COMPONENT, opsys.nice_name, release)) db_relcomponent = OpSysReleaseComponent() db_relcomponent.component = db_component db_relcomponent.release = db_release db.session.add(db_relcomponent) db.session.flush() return 0
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 _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_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