class ParticipantHandler(object):
    """Participant class as defined by the SkyNET API."""
    def __init__(self):
        self.oscrc = None
        self.obs = None

    def handle_wi_control(self, ctrl):
        """Job control thread."""
        pass

    def handle_lifecycle_control(self, ctrl):
        """Participant control thread."""
        if ctrl.message == "start":
            if ctrl.config.has_option("obs", "oscrc"):
                self.oscrc = ctrl.config.get("obs", "oscrc")

    def setup_obs(self, namespace):
        """Setup the Buildservice instance

        Using the namespace as an alias to the apiurl.
        """
        self.obs = BuildService(oscrc=self.oscrc, apiurl=namespace)

    def revert_trial(self, wid):
        """Copy packages from trunk to testing.

          * The revert notes the intended request destination and copies the
            latest version from there (usually Trunk) back into the build_in
            project.
          * Later, if/when parallel build_in projects are used it may be
            important to correctly sync build_in from a potentially updated
            Trunk
          * If build_in is a project link we remove the packages and
            wipebinaries
        """

        wid.result = False
        rid = wid.fields.ev.id
        actions = wid.fields.ev.actions
        build_in = wid.params.build_in

        for act in actions:
            if act['type'] != 'submit':
                continue
            if wid.params.linked:
                self.obs.deletePackage(build_in, act['targetpackage'])
                # wipeBinaries errors if there are no packages to wipe
                if self.obs.getPackageList(build_in):
                    self.obs.wipeBinaries(build_in)
            else:
                try:
                    self.obs.copyPackage(self.obs.apiurl,
                                         act['targetproject'],
                                         act['targetpackage'],
                                         self.obs.apiurl,
                                         build_in,
                                         act['targetpackage'],
                                         client_side_copy=False,
                                         keep_maintainers=False,
                                         keep_develproject=False,
                                         expand=False,
                                         comment="Trial revert for \
                                                    request %s" % rid)
                except HTTPError, exp:
                    # If the package is not found in target, reverting is
                    # done by deleting it from build_in.
                    if exp.code == 404:
                        self.obs.deletePackage(build_in, act['targetpackage'])
                else:
                    raise
class ParticipantHandler(object):
    """Participant class as defined by the SkyNET API."""

    def __init__(self):
        self.oscrc = None
        self.obs = None

    def handle_wi_control(self, ctrl):
        """Job control thread."""
        pass

    def handle_lifecycle_control(self, ctrl):
        """Participant control thread."""
        if ctrl.message == "start":
            if ctrl.config.has_option("obs", "oscrc"):
                self.oscrc = ctrl.config.get("obs", "oscrc")

    def setup_obs(self, namespace):
        """Setup the Buildservice instance

        Using the namespace as an alias to the apiurl.
        """
        self.obs = BuildService(oscrc=self.oscrc, apiurl=namespace)

    def revert_trial(self, wid):
        """Copy packages from trunk to testing.

          * The revert notes the intended request destination and copies the
            latest version from there (usually Trunk) back into the build_in
            project.
          * Later, if/when parallel build_in projects are used it may be
            important to correctly sync build_in from a potentially updated
            Trunk
          * If build_in is a project link we remove the packages and
            wipebinaries
        """

        wid.result = False
        rid = wid.fields.ev.id
        actions = wid.fields.ev.actions
        build_in = wid.params.build_in

        for act in actions:
            if act['type'] != 'submit':
                continue
            if wid.params.linked :
                self.obs.deletePackage(build_in, act['targetpackage'])
                # wipeBinaries errors if there are no packages to wipe
                if self.obs.getPackageList(build_in):
                    self.obs.wipeBinaries(build_in)
            else:
                try:
                    self.obs.copyPackage(self.obs.apiurl,
                                         act['targetproject'],
                                         act['targetpackage'],
                                         self.obs.apiurl,
                                         build_in,
                                         act['targetpackage'],
                                         client_side_copy = False,
                                         keep_maintainers = False,
                                         keep_develproject = False,
                                         expand = False,
                                         comment = "Trial revert for \
                                                    request %s" % rid)
                except HTTPError, exp:
                    # If the package is not found in target, reverting is
                    # done by deleting it from build_in.
                    if exp.code == 404:
                        self.obs.deletePackage(build_in,
                                               act['targetpackage'])
                else:
                    raise