I am responding on the list because this seems like a problem that other plugins will also face.
It seems like there are 2 possible solutions here. 1) pulp_docker could provide a custom REST api endpoint that will provide 'tagging' functionality. This API would perform all the validation needed and then create a new repository version with all the proper tags. 2) pulpcore's v3/repositories/1234/versions/ endpoint could provide a way for plugins to provide custom behavior. I have advocated for 2 in the past and I continue to believe that the repository versions API should take an 'action' or 'operation' parameter that would map to some functionality provided by a plugin. On Tue, Mar 6, 2018 at 4:03 PM, Austin Macdonald <[email protected]> wrote: > Concept: > ContentUnits are created with a POST request to /v3/content/<type>/. > Adding the Tag to a Repository is a separate call. This workflow is awkward > for Tags because we would need to set the "repository" field on the Tag in > the first call, and actually add it to the repository in a second call. The > first call won't have enough information to enforce the uniqueness > constraints due to repository versions. The second call won't work either, > because adding content units to a repository is strictly a pulpcore > endpoint, and does not offer plugins the ability to enforce uniqueness > constraints. In Pulp 2, we enforced "only 1 tag of name X, type Y, > repository Z" with unique together, but this cannot work anymore because of > RepositoryVersions, because Tags created for old RepositoryVersions still > exist after they are removed from a later version. > > Example: > We have a Repository, myrepo, and 2 manifests, m1 and m2. We put m1 in > myrepo. > myrepov1 = [m1] > Then we create a tag t1 = Tag("latest", m1, myrepo) and we add it to > myrepo. > myrepov2 = [m1, t1] > > Then we add m2 to myrepo. > myrepov3 = [m1, t1, m2] > > Then it gets interesting. Can we create t2 = Tag("latest", m2, myrepo)? > > We can remove t1 from myrepo, (but we have to leave the tag unchanged to > preserve old repo versions), which means that yes, t2 is a valid tag. > > Now we have a problem. Without removing t1, we can add t2 to myrepo, and > the docker plugin is powerless to stop it because the endpoint > v3/repositories/1234/versions/ does not involve plugins. We don't have the > ability to validate uniqueness within a repository. >
_______________________________________________ Pulp-dev mailing list [email protected] https://www.redhat.com/mailman/listinfo/pulp-dev
