[Pulp-dev] Publish API for Plugin Writers (Pulp3)

Jeff Ortel jortel at redhat.com
Fri Apr 21 21:09:40 UTC 2017


I like this Brian and want to take it one step further.  I think there is value in abstracting how a
publication is composed.  Files like metadata need to be composed by the publisher (as needed) in the
working_dir then "added" to the publication.  Artifacts could be "associated" to the publication and the
platform determines how this happens (symlinks/in the DB).

Assuming the Publisher is instantiated with a 'working_dir' attribute.

---------------------------------------

Something like this to kick around:


class Publication:
    """
    The Publication provided by the plugin API.

    Examples:

    A crude example with lots of hand waving.

    In Publisher.publish()

    >>>
    >>> publication = Publication(self.working_dir)
    >>>
    >>> # Artifacts
    >>> for artifact in []: # artifacts
    >>>     path = ' <determine relative path>'
    >>>     publication.associate(artifact, path)
    >>>
    >>> # Metadata created in self.staging_dir <here>.
    >>>
    >>> publication.add('repodata/primary.xml')
    >>> publication.add('repodata/others.xml')
    >>> publication.add('repodata/repomd.xml')
    >>>
    >>> # - OR -
    >>>
    >>> publication.add('repodata/')
    >>>
    >>> publication.commit()
    """

    def __init__(self, staging_dir):
        """
        Args:
            staging_dir: Absolute path to where publication is staged.
        """
        self.staging_dir = staging_dir

    def associate(self, artifact, path):
        """
        Associate an artifact to the publication.
        This could result in creating a symlink in the staging directory
        or (later) creating a record in the db.

        Args:
            artifact: A content artifact
            path: Relative path within the staging directory AND eventually
                  within the published URL.
        """

    def add(self, path):
        """
        Add a file within the staging directory to the publication by relative path.

        Args:
            path: Relative path within the staging directory AND eventually within
                  the published URL.  When *path* is a directory, all files
                  within the directory are added.
        """

    def commit(self):
        """
        When committed, the publication is atomically published.
        """
        # atomic magic





On 04/19/2017 10:16 AM, Brian Bouterse wrote:
> I was thinking about the design here and I wanted to share some thoughts.
> 
> For the MVP, I think a publisher implemented by a plugin developer would write all files into the working
> directory and the platform will "atomically publish" that data into the location configured by the repository.
> The "atomic publish" aspect would copy/stage the files in a permanent location but would use a single symlink
> to the top level folder to go live with the data. This would make atomic publication the default behavior.
> This runs after the publish() implemented by the plugin developer returns, after it has written all of its
> data to the working dir.
> 
> Note that ^ allows for the plugin writer to write the actual contents of files in the working directory
> instead of symlinks, causing Pulp to duplicate all content on disk with every publish. That would be a
> incredibly inefficient way to write a plugin but it's something the platform would not prevent in any explicit
> way. I'm not sure if this is something we should improve on or not.
> 
> At a later point, we could add in the incremental publish maybe as a method on a Publisher called
> incremental_publish() which would only be called if the previous publish only had units added.
> 
> 
> 
> On Mon, Apr 17, 2017 at 4:22 PM, Brian Bouterse <bbouters at redhat.com <mailto:bbouters at redhat.com>> wrote:
> 
>     For plugin writers who are writing a publisher for Pulp3, what do they need to handle during publishing
>     versus platform? To make a comparison against sync, the "Download API" and "Changesets" [0] allows the
>     plugin writer to tell platform about a remote piece of content. Then platform handles creating the unit,
>     fetching it, and saving it. Will there be a similar API to support publishing to ease the burden of a
>     plugin writer? Also will this allow platform to have a structured knowledge of a publication with Pulp3?
> 
>     I wanted to try to characterize the problem statement as two separate questions:
> 
>     1) How will units be recorded to allow platform to know which units comprise a specific publish?
>     2) What are plugin writer's needs at publish time, and what repetitive tasks could be moved to platform?
> 
>     As a quick recalling of how Pulp2 works. Each publisher would write files into the working directory and
>     then they would get moved into their permanent home. Also there is the incrementalPublisher base machinery
>     which allowed for an additive publication which would use the previous publish and was "faster". Finally
>     in Pulp2, the only record of a publication are the symlinks on the filesystem.
> 
>     I have some of my own ideas on these things, but I'll start the conversation.
> 
>     [0]: https://github.com/pulp/pulp/pull/2876 <https://github.com/pulp/pulp/pull/2876>
> 
>     -Brian
> 
> 
> 
> 
> _______________________________________________
> Pulp-dev mailing list
> Pulp-dev at redhat.com
> https://www.redhat.com/mailman/listinfo/pulp-dev
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 847 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/pulp-dev/attachments/20170421/77d85581/attachment.sig>


More information about the Pulp-dev mailing list