[Pulp-dev] Master-detail inheritance in Pulp 3

David Davis daviddavis at redhat.com
Tue Apr 23 14:29:52 UTC 2019


I wanted to email the pulp-dev list about a major problem[0] that was
recently encountered in Pulp 3 that affects how the Pulp 3 plugin API
functions.

# Problem

In the plugin API we rely on inheritance to allow plugin writers to import
functionality into their plugin. This includes models such as Remote and
Content that are inherited by plugins. We rely on django's multi-table
inheritance[1] for these models.

Behind the scenes, django defines a OneToOneField and a reverse accessor.
This field is not namespace so if two subclasses have the same name, you
get an error ("Reverse accessor for 'Package.content_ptr' clashes with
reverse accessor for 'Package.content_ptr'.")

To give an actual example, both the Debian and RPM plugins implement a
Package class. This causes an error to be raised when a user installs both
plugins. Django tries to define a 'package' reverse accessor for both
subclasses and blows up.

# Potential Solutions

## Class Naming

The first solution I can think of which is probably also the simplest and
most straightforward would be to require plugin writers to namespace their
master/detail subclass names. So Package would be RpmPackage. This places
the onus on plugin writers to name their master/detail classes correctly.

## Defining OneToOneField

The other solution would be to either manually define the OneToOneField on
the subclasses[2] and specify a namespaced field name. There may be a way
to do this dynamically (ie magically) in the parent somehow as well.

## Abstract Class

Lastly, we could redefine master models as abstract classes[3]. I can think
of at least one or two places (e.g. content field on
RepositoryVersionContent, publisher field on Publication) that would have
to switch their relationships to generic relationships in order to
accommodate this change.

There might be other solutions I am not thinking of so feel free to propose
something. Also, quick feedback would be greatly appreciated as this is
going to be a major change in our plugin API.

[0] https://pulp.plan.io/issues/4681
[1]
https://docs.djangoproject.com/en/2.2/topics/db/models/#multi-table-inheritance
[2]
https://docs.djangoproject.com/en/2.2/topics/db/models/#specifying-the-parent-link-field
[3]
https://docs.djangoproject.com/en/2.2/topics/db/models/#abstract-base-classes

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/pulp-dev/attachments/20190423/03c71c95/attachment.htm>


More information about the Pulp-dev mailing list