예제 #1
0
    def __call__(self, message: typing.Union[UpdateEditV1,
                                             UpdateRequestTestingV1]):
        """
        Process the given message, updating relevant bugs and test cases.

        Duplicate messages: if the server delivers the message multiple times,
        the bugs and test cases are simply re-fetched and updated, so nothing
        bad happens.

        Args:
            message: A message about a new or edited update.
        """
        topic = message.topic
        alias = message.update.alias

        log.info("Updates Handler handling  %s, %s" % (alias, topic))

        # Go to sleep for a second to try and avoid a race condition
        # https://github.com/fedora-infra/bodhi/issues/458
        time.sleep(1)

        with self.db_factory() as session:
            update = Update.get(alias)
            if not update:
                raise BodhiException("Couldn't find alias '%s' in DB" % alias)

            bugs = []
            if isinstance(message, UpdateEditV1):
                for idx in message.new_bugs:
                    bug = Bug.get(idx)

                    # Sanity check
                    if bug is None or bug not in update.bugs:
                        update_bugs_ids = [b.bug_id for b in update.bugs]
                        update.update_bugs(update_bugs_ids + [idx], session)

                        # Now, after update.update_bugs, bug with idx should exists in DB
                        bug = Bug.get(idx)

                    bugs.append(bug)

            elif isinstance(message, UpdateRequestTestingV1):
                bugs = update.bugs
            else:
                raise NotImplementedError("Should never get here.")

            self.work_on_bugs(session, update, bugs)
            self.fetch_test_cases(session, update)

        if config['test_gating.required']:
            with self.db_factory() as session:
                update = Update.get(alias)
                update.update_test_gating_status()

        log.info("Updates Handler done with %s, %s" % (alias, topic))
예제 #2
0
파일: updates.py 프로젝트: onosek/bodhi
    def run(self, api_version: int, data: dict):
        """
        Process the given message, updating relevant bugs and test cases.

        Duplicate messages: if the server delivers the message multiple times,
        the bugs and test cases are simply re-fetched and updated, so nothing
        bad happens.

        Args:
            api_version: API version number.
            data: Information about a new or edited update.
        """
        action = data["action"]
        alias = data['update'].get('alias')

        log.info("Updates Handler handling  %s, %s" % (alias, action))

        # Go to sleep for a second to try and avoid a race condition
        # https://github.com/fedora-infra/bodhi/issues/458
        time.sleep(1)

        with self.db_factory() as session:
            update = Update.get(alias)
            if not update:
                raise BodhiException("Couldn't find alias '%s' in DB" % alias)

            bugs = []
            if action == "edit":
                for idx in data['new_bugs']:
                    bug = Bug.get(idx)

                    # Sanity check
                    if bug is None or bug not in update.bugs:
                        update_bugs_ids = [b.bug_id for b in update.bugs]
                        update.update_bugs(update_bugs_ids + [idx], session)

                        # Now, after update.update_bugs, bug with idx should exists in DB
                        bug = Bug.get(idx)

                    bugs.append(bug)

            elif action == "testing":
                bugs = update.bugs
            else:
                raise NotImplementedError("Should never get here.")

            self.work_on_bugs(session, update, bugs)
            self.fetch_test_cases(session, update)

        if config['test_gating.required']:
            with self.db_factory() as session:
                update = Update.get(alias)
                update.update_test_gating_status()

        log.info("Updates Handler done with %s, %s" % (alias, action))
예제 #3
0
파일: updates.py 프로젝트: sebwoj/bodhi
    def __call__(self, message: fedora_messaging.api.Message):
        """
        Process the given message, updating relevant bugs and test cases.

        Args:
            message: A message about a new or edited update.
        """
        msg = message.body['msg']
        topic = message.topic
        alias = msg['update'].get('alias')

        log.info("Updates Handler handling  %s, %s" % (alias, topic))

        # Go to sleep for a second to try and avoid a race condition
        # https://github.com/fedora-infra/bodhi/issues/458
        time.sleep(1)

        with self.db_factory() as session:
            update = Update.get(alias)
            if not update:
                raise BodhiException("Couldn't find alias '%s' in DB" % alias)

            bugs = []
            if topic.endswith('update.edit'):
                for idx in msg['new_bugs']:
                    bug = Bug.get(idx)

                    # Sanity check
                    if bug is None or bug not in update.bugs:
                        update_bugs_ids = [b.bug_id for b in update.bugs]
                        update.update_bugs(update_bugs_ids + [idx], session)

                        # Now, after update.update_bugs, bug with idx should exists in DB
                        bug = Bug.get(idx)

                    bugs.append(bug)

            elif topic.endswith('update.request.testing'):
                bugs = update.bugs
            else:
                raise NotImplementedError("Should never get here.")

            self.work_on_bugs(session, update, bugs)
            self.fetch_test_cases(session, update)

        if config['test_gating.required']:
            with self.db_factory() as session:
                update = Update.get(alias)
                update.update_test_gating_status()

        log.info("Updates Handler done with %s, %s" % (alias, topic))
예제 #4
0
파일: updates.py 프로젝트: sedrubal/bodhi
    def consume(self, message):
        """
        Process the given message, updating relevant bugs and test cases.

        Args:
            message (munch.Munch): A fedmsg about a new or edited update.
        """
        msg = message['body']['msg']
        topic = message['topic']
        alias = msg['update'].get('alias')

        log.info("Updates Handler handling  %s, %s" % (alias, topic))

        # Go to sleep for a second to try and avoid a race condition
        # https://github.com/fedora-infra/bodhi/issues/458
        time.sleep(1)

        if not alias:
            log.error("Update Handler got update with no "
                      "alias %s." % pprint.pformat(msg))
            return

        with self.db_factory() as session:
            update = Update.get(alias)
            if not update:
                raise BodhiException("Couldn't find alias '%s' in DB" % alias)

            if topic.endswith('update.edit'):
                bugs = [Bug.get(idx) for idx in msg['new_bugs']]
                # Sanity check
                for bug in bugs:
                    assert bug in update.bugs
            elif topic.endswith('update.request.testing'):
                bugs = update.bugs
            else:
                raise NotImplementedError("Should never get here.")

            self.work_on_bugs(session, update, bugs)
            self.fetch_test_cases(session, update)

        if config['test_gating.required']:
            with self.db_factory() as session:
                update = Update.get(alias)
                update.update_test_gating_status()

        log.info("Updates Handler done with %s, %s" % (alias, topic))
예제 #5
0
def main(alias: str, bugs: typing.List[int]):
    """
    Iterate the list of bugs, retrieving information from Bugzilla and modifying them.

    Iterate the given list of bugs associated with the given update. For each bug, retrieve
    details from Bugzilla, comment on the bug to let watchers know about the update, and mark
    the bug as MODIFIED. If the bug is a security issue, mark the update as a security update.

    Args:
        update: The update that the bugs are associated with.
        bugs: A list of bodhi.server.models.Bug instances that we wish to act on.
    """
    from bodhi.server.models import Bug, Update, UpdateType

    log.info(f'Got {len(bugs)} bugs to sync for {alias}')

    db_factory = util.transactional_session_maker()
    with db_factory() as session:
        update = Update.get(alias)
        if not update:
            raise BodhiException(f"Couldn't find alias {alias} in DB")

        for bug_id in bugs:
            bug = Bug.get(bug_id)
            # Sanity check
            if bug is None or bug not in update.bugs:
                update_bugs_ids = [b.bug_id for b in update.bugs]
                update.update_bugs(update_bugs_ids + [bug_id], session)
                # Now, after update.update_bugs, bug with bug_id should exists in DB
                bug = Bug.get(bug_id)

            log.info(f'Getting RHBZ bug {bug.bug_id}')
            try:
                rhbz_bug = bug_module.bugtracker.getbug(bug.bug_id)

                log.info(f'Updating our details for {bug.bug_id}')
                bug.update_details(rhbz_bug)
                log.info(f'  Got title {bug.title} for {bug.bug_id}')

                # If you set the type of your update to 'enhancement' but you
                # attach a security bug, we automatically change the type of your
                # update to 'security'. We need to do this first, so we don't
                # accidentally comment on stuff that we shouldn't.
                if not update.type == UpdateType.security and bug.security:
                    log.info("Setting our UpdateType to security.")
                    update.type = UpdateType.security

                log.info(f'Commenting on {bug.bug_id}')
                comment = config['initial_bug_msg'] % (
                    update.alias, update.release.long_name, update.abs_url())

                log.info(f'Modifying {bug.bug_id}')
                bug.modified(update, comment)
            except Exception:
                log.warning('Error occurred during updating single bug',
                            exc_info=True)
                raise ExternalCallException
예제 #6
0
def update_from_db_message(msgid: str, itemdict: dict):
    """
    Find and return update for waiverdb or resultsdb message.

    Used by the resultsdb and waiverdb consumers.

    Args:
        msgid:    the message ID (for logging purposes)
        itemdict: the relevant dict from the message. 'subject' dict
                  for a waiverdb message, 'item' dict for resultsdb.
    Returns:
        bodhi.server.models.Update or None: the relevant update, if
                                            found.
    """
    itemtype = itemdict.get("type")
    if not itemtype:
        log.error(f"Couldn't find item type in message {msgid}")
        return None
    if isinstance(itemtype, list):
        # In resultsdb.result.new messages, the values are all lists
        # for some reason
        itemtype = itemtype[0]
    if itemtype not in ("koji_build", "bodhi_update"):
        log.debug(f"Irrelevant item type {itemtype}")
        return None

    # find the update
    if itemtype == "bodhi_update":
        updateid = itemdict.get("item")
        if isinstance(updateid, list):
            updateid = updateid[0]
        if not updateid:
            log.error(f"Couldn't find update ID in message {msgid}")
            return None
        update = Update.get(updateid)
        if not update:
            log.error(f"Couldn't find update {updateid} in DB")
            return None
    else:
        nvr = itemdict.get("nvr", itemdict.get("item"))
        if isinstance(nvr, list):
            nvr = nvr[0]
        if not nvr:
            log.error(f"Couldn't find nvr in message {msgid}")
            return None
        build = Build.get(nvr)
        if not build:
            log.error(f"Couldn't find build {nvr} in DB")
            return None
        update = build.update

    return update
예제 #7
0
def main(alias: str):
    """
    Query the wiki for test cases for each package on the given update.

    Args:
        alias: The update's builds are iterated upon to find test cases for
            them.
    """
    from bodhi.server.models import Update

    db_factory = transactional_session_maker()
    with db_factory() as session:
        update = Update.get(alias)
        if not update:
            raise BodhiException(f"Couldn't find alias {alias} in DB")

        for build in update.builds:
            try:
                build.update_test_cases(session)
            except ExternalCallException:
                log.warning('Error occurred during fetching testcases',
                            exc_info=True)
                raise ExternalCallException
예제 #8
0
파일: updates.py 프로젝트: gsteja025/bodhi
    def run(self, api_version: int, data: dict):
        """
        Process the given message, updating relevant bugs and test cases.

        Duplicate messages: if the server delivers the message multiple times,
        the bugs and test cases are simply re-fetched and updated, so nothing
        bad happens.

        Args:
            api_version: API version number.
            data: Information about a new or edited update.
        """
        if api_version == 1:
            alias = data["update"].get("alias")
        elif api_version == 2:
            try:
                alias = data['update_alias']
            except KeyError:
                log.error(f"Wrong message format for the handle_update task: {data}")
                return
        else:
            log.error(f"The Updates Handler doesn't know how to handle api_version {api_version}. "
                      f"Message was: {data}")
            return

        action = data["action"]
        log.info("Updates Handler handling  %s, %s" % (alias, action))

        # Go to sleep for a second to try and avoid a race condition
        # https://github.com/fedora-infra/bodhi/issues/458
        time.sleep(1)

        with self.db_factory() as session:
            update = Update.get(alias)
            if not update:
                raise BodhiException("Couldn't find alias '%s' in DB" % alias)

            bugs = []
            if action == "edit":
                # If editing a Pending update, all of whose builds are signed, for a release
                # which isn't composed by Bodhi (i.e. Rawhide), move it directly to Testing.
                if not update.release.composed_by_bodhi \
                        and update.status == UpdateStatus.pending \
                        and update.signed:
                    log.info("Every build in the update is signed, set status to testing")

                    update.status = UpdateStatus.testing
                    update.date_testing = func.current_timestamp()
                    update.request = None

                    log.info(f"Update status of {update.display_name} has been set to testing")

                for idx in data['new_bugs']:
                    bug = Bug.get(idx)

                    # Sanity check
                    if bug is None or bug not in update.bugs:
                        update_bugs_ids = [b.bug_id for b in update.bugs]
                        update.update_bugs(update_bugs_ids + [idx], session)

                        # Now, after update.update_bugs, bug with idx should exists in DB
                        bug = Bug.get(idx)

                    bugs.append(bug)

            elif action == "testing":
                bugs = update.bugs
            else:
                raise NotImplementedError("Should never get here.")

            self.work_on_bugs(session, update, bugs)
            self.fetch_test_cases(session, update)

        if config['test_gating.required']:
            with self.db_factory() as session:
                update = Update.get(alias)
                update.update_test_gating_status()

        log.info("Updates Handler done with %s, %s" % (alias, action))