Handler Example¶
The following handler example provides an implementation of the content, bind, and system capabilities. The choice to define all of them in a single descriptor is arbitrary. They could also have been defined in separate descriptors.
Handler¶
Handler Descriptor¶
Define the handler descriptor.
[main]
enabled=1
[types]
content=rpm
bind=yum
system=Linux
[rpm]
class=example.agent.handler.PackageHandler
[yum]
class=example.agent.handler.YumBindHandler
[Linux]
class=example.agent.handler.LinuxHandler
Content Handler¶
Define the PackageHandler class.
from pulp.agent.lib.handler import ContentHandler
from pulp.agent.lib.report import ProfileReport, ContentReport
class PackageHandler(ContentHandler):
   """
   An RPM content handler.
   Install, update, and uninstall RPMs.
   """
   def install(self, conduit, units, options):
       """
       Install RPM content units.  Each unit specifies an RPM that is to be installed.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param units: A list of content unit keys.
       :type units: list
       :param options: Unit install options.
       :type options: dict
       :return: An installation report.
       :rtype: ContentReport
       """
       report = ContentReport()
       #
       # RPMs installed here
       #
       # succeeded = <did it succeed>
       # details = <the details of the installed packages here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
   def update(self, conduit, units, options):
       """
       Update RPM content units.  Each unit specifies an RPM that is to be updated.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param units: A list of content unit keys.
       :type units: list
       :param options: Unit update options.
       :type options: dict
       :return: An update report.
       :rtype: ContentReport
       """
       report = ContentReport()
       #
       # RPMs updated here
       #
       # succeeded = <did it succeed>
       # details = <the details of the updated packages here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
   def uninstall(self, conduit, units, options):
       """
       Uninstall RPM content units.  Each unit specifies an RPM that is to be uninstalled.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param units: A list of content unit_keys.
       :type units: list
       :param options: Unit uninstall options.
       :type options: dict
       :return: An uninstall report.
       :rtype: ContentReport
       """
       report = ContentReport()
       #
       # RPMs uninstalled here
       #
       # succeeded = <did it succeed>
       # details = <the details of the uninstalled packages here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
   def profile(self, conduit):
       """
       Get the installed package profile.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :return: An profile report.
       :rtype: ProfileReport
       """
       report = ProfileReport()
       #
       # Assemble the report here
       #
       # succeeded = <did it succeed>
       # details = <the package profile here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
Bind Handler¶
Define the YumBindHandler class.
from pulp.agent.lib.handler import BindHandler
from pulp.agent.lib.report import BindReport
class YumBindHandler(BindHandler):
   """
   A yum repository bind request handler.
   Manages the /etc/yum.repos.d/abc.repo based on bind requests.
   """
   def bind(self, conduit, binding, options):
       """
       Bind a repository.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param binding: A binding to add/update.
         A binding is: {type_id:<str>, repo_id:<str>, details:<dict>}
       :type binding: dict
       :param options: Bind options.
       :type options: dict
       :return: A bind report.
       :rtype: BindReport
       """
       repo_id = binding['repo_id']
       report = BindReport(repo_id)
       #
       # Update the abc.repo file here
       #
       # succeeded = <did it succeed>
       # details = <the details of the bind here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
   def unbind(self, conduit, repo_id, options):
       """
       Bind a repository.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param repo_id: A repository ID.
       :type repo_id: str
       :param options: Unbind options.
       :type options: dict
       :return: An unbind report.
       :rtype: BindReport
       """
       report = BindReport(repo_id)
       #
       # Update a abc.repo file here
       #
       # succeeded = <did it succeed>
       # details = <the details of the unbind here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
System Handler¶
Define the LinuxHandler class.
from pulp.agent.lib.handler import SystemHandler
from pulp.agent.lib.report import RebootReport
class LinuxHandler(SystemHandler):
   """
   Linux system handler
   Provides support for operating system specific operations.
   """
   def reboot(self, conduit, options):
       """
       Schedule a system reboot.
       :param conduit: A handler conduit.
       :type conduit: pulp.agent.lib.conduit.Conduit
       :param options: reboot options
       :type options: dict
       """
       report = RebootReport()
       #
       # Schedule the reboot here
       #
       # succeeded = <did it succeed>
       # details = <the details of the reboot here>
       #
       if succeeded:
           report.set_succeeded(details)
       else:
           report.set_failed(details)
       return report
Installation¶
The descriptor is installed into the /etc/pulp/agent/conf.d/ directory.
The example handler classes are installed into site-packages/example/agent/handler/ where site-packages can be any directory in the python path.
After installation, restart the goferd service.