On 11/29/2017 04:32 PM, Brian Bouterse wrote: > For deletes, the db relationships are all there, so I expect deletes to > cascade to other objects with any url > structure. I believe closer to the release, we'll have to look at the > cascading delete relationships to see if > the behaviors that we have are correct. > > Overall, I'm +1 on un-nesting. I think it would result in a good user > experience. I know it goes against the > logical composition arguments, which have been well laid out. We want Pulp to > be really simple, and the nested > URL in the top of this thread is anything but simple. Consider another > project like Ansible Galaxy (who also > uses Django and DRF). Their API is very flat and as an outsider I find it > very approachable: > https://galaxy.ansible.com/api/v1/ Pulp could be that simple.
Clicking through the Galaxy API, there seems to be a good bit of nesting. > > My main concern in keeping the nesting is that this is going to be difficult > for plugin writers. Making plugin > writing easy is a primary goal if not the primary goal of Pulp3. If core devs > are spending lots of time on it, > a person doing this in their free time may not bother. > > I also see practical reasons motivating us to un-nest. We have been adding > custom code regularly in this area, > and it's been highly complexity and slow going. I think Austin described it > well. Getting the viewsets working > and to be simpler would allow us to move forward in many areas. > > So overall, un-nesting would give a better user experience (I think), a > simpler plugin writer experience, and > it would unblock a lot of work. > > > > On Wed, Nov 29, 2017 at 3:29 PM, Bihan Zhang <bizh...@redhat.com > <mailto:bizh...@redhat.com>> wrote: > > I have a question about repository delete with the un-nested model. > When a repository is deleted does the DELETE cascade to the > importers/publishers that are linked to the > repo? In an un-nested world I don't think they would. It would be odd for > an object with its own endpoint > to vanish without the user calling DELETE on the model. > > When nested it makes sense to cascade the delete so if /repo/1/ is > deleted, everything thereafter > (/repo/1/importer/2) should also be removed. > > Austin, I do see you point about it being a lot more complicated, but I > think modeling things the right > way is worth carrying the extra code and complexity. > > Anyways, maybe I'm wrong and importer/publishers should exist without a > repository, in which case I can > definitely see the value in un-nesting the URLs. > > > On Wed, Nov 29, 2017 at 2:21 PM, Jeff Ortel <jor...@redhat.com > <mailto:jor...@redhat.com>> wrote: > > Austin makes a compelling argument. > > > On 11/28/2017 02:16 PM, Austin Macdonald wrote: > > When I look at this, the most important point is that we have a > hyperlinked REST API, which means > that the > > urls are specifically not going to be built by users. > > > > For a user to retrieve an importer, they would first GET the > importers for a repository. The next > call would > > be the exact href returned by pulp. This workflow is exactly the > same whether we nest or not. The only > > difference is that we no longer convey the information in the href, > which seems fine to me since > they aren't > > particularly readable anyway. > > > > It has already been discussed that filtering can make up for the > use cases that use nesting, and > that filters > > would be more flexible. > > > > So for me, nesting costs in (1) extra code to carry (2) extra > dependency (3) complexity to use. > > > > To elaborate on the complexity, the problem is in declaring fields > on the serializer. The serializer is > > responsible for building the urls, which requires all of the uuids > for the entire nested structure. > This is > > further complicated by master/detail, which is an entirely Pulp > concept. > > > > Because of this, anyone working on the API (likely including plugin > writers) will need to understand > > parent_lookup_kwargs and how to use then with: > > DetailNestedHyperlinkedRelatedField > > DetailNestedHyperlinkedidentityField > > DetailwritableNestedUrlRelatedField > > DetailRelatedField > > DetailIdentityField > > NestedHyperlinkedRelatedField > > HyperlinkedRelatedField. > > > > The complexity seems inherrent, so I doubt we will be able to > simplify this much. So, is all this > code and > > complexity worth the implied relationship in non-human-friendly > urls? As someone who has spent a lot > of time > > on this code, I don't think so. > > > > > > > > On Nov 28, 2017 06:12, "Patrick Creech" <pcre...@redhat.com > <mailto:pcre...@redhat.com> > <mailto:pcre...@redhat.com <mailto:pcre...@redhat.com>>> wrote: > > > > On Mon, 2017-11-27 at 16:10 -0600, Jeff Ortel wrote: > > > On 11/27/2017 12:19 PM, Jeff Ortel wrote: > > > > > > > > > > > > On 11/17/2017 08:55 AM, Patrick Creech wrote: > > > > > One of the things I like to think about in these types of > situations is, "what is good rest > > > > > api > > > > > design". Nesting resources under other resources is a > necessary part of good api design, and > > > > > has > > > > > its place. To borrow some terms from domain driven > development: > > > > > > > > > > Collections of objects are called aggregates. Think 'an > order and its line items'. Line > > > > > items make > > > > > no sense without having the order context, so they are an > aggregate that is accessed under an > > > > > Order. This is called the aggregate root. The rest api > design for such an object, using > > > > > order as > > > > > the aggregate root, would look like: > > > > > > > > > > '/orders/' -- all orders > > > > > '/orders/{order_key}/' -- a specific order with key. > > > > > '/orders/{order_key}/items/' -- All of the order's items. > > > > > '/orders/{order_key}/items/{item_key}/' -- a specific > line item of the order > > > > > > > > > > When it comes to order items themselves, it isn't helpful > to start with them as their own > > > > > aggregate > > > > > root in one large collection: > > > > > > > > > > '/items/' -- all order items in the system > > > > > > > > The order/items is a good example of aggregation (or > composition) and I agree it makes a strong > > > > case for > > > > nesting. In pulp, a repository is easily thought of as a > collection or aggregation of content. > > > > > > > > > > > > > > Because you lose the order context. Based on api design, > this endpoint will need to respond > > > > > with all > > > > > order items across all orders and resort to parameter > filtering to provide the context you > > > > > need. > > > > > > > > > > A quote borrowed from Martin Fowler [0] > > > > > > > > > > "An aggregate will have one of its component objects be > the aggregate root. Any references > > > > > from > > > > > outside the aggregate should only go to the aggregate > root. The root can thus ensure the > > > > > integrity > > > > > of the aggregate as a whole." > > > > > > > > > > Publishers, importers, and publications are all > aggregates that don't make much sense outside > > > > > of > > > > > their aggregate root of Repository. They are dependent > on the Repository context, and from a > > > > > domain > > > > > view, should be accessed starting with their specific > Repository endpoint. > > > > > > > > I don't think the aggregation relationship exists between > repository and > > > > importer/publisher. There is a > > > > strong association between repository and > importer/publisher which /could/ even be characterized > > > > as > > > > "ownership". However, I don't think there is an > aggregation (or composition) relationship. The > > > > same for > > > > publisher & publication. A publication is associated to > its creating publisher but the > > > > publisher isn't an > > > > aggregation of publications. The relationship mainly > provides linkage to the repository. > > > > > > This is not an argument to flatten the URLs but meant to > clarify the relationships. > > > > I'm in agreement here. I was possibly a little hasty in > lumping all things that have a Repositoy fk > > as being 'dependent' in that paragraph during the formation of > my argument. > > > > > > > > > > > > > > > > > -------------------------------------------------------------- > > > > > Specific items rebuttals: > > > > > > > > > > Yes, using the primary key uuid's as the immutable > key adds some human readable challenges > > > > > to > > > > > the API. That sounds more like a point to discuss in the > human readable vs. not human > > > > > readable > > > > > immutable key debate. > > > > > > > > Agreed. > > > > > > > > Also, I don't think nesting impacts URL readability. > > > > > > > > > > > > > > One of the challenges in software engineering is > ensuring the tools you are using don't > > > > > limit > > > > > your choices. DRF limited the choices for pulp's rest > API design, and drf-nested-routers was > > > > > introduced to help remove that limit. If working around > these limitations is complex, take > > > > > advantage of open source here and help improve the > upstream dependencies for your workflow. > > > > > > > > > > As far as making things simpler for plugin writers, > perhaps there are ways you can > > > > > simplify it > > > > > for them by providing some encapsulation in pulp's core > instead. Abstract away the nasty bits > > > > > behind the scenes, and provide them with a simpler > interface to do what they need. > > > > > > > > > > With respect to the invested time already in making > this work, I agree with jeremy that it > > > > > should be considered part of the sunken cost fallacy. > What does need to be evaluated though > > > > > is how > > > > > much time re-architecting at this point will cost you > (discussion, planning, and development) > > > > > vs the > > > > > amount of time it will save, and weigh that against any > planned milestones for pulp to see if > > > > > it > > > > > will push them out as well. > > > > > > > > > > I'm also in agreement that it is moot if pulp3 has a > different api structure than > > > > > pulp2. Major > > > > > version boundaries are the perfect time for evaluating > and moving such things around. > > > > > > > > > > [0] https://martinfowler.com/bliki/DDD_Aggregate.html > <https://martinfowler.com/bliki/DDD_Aggregate.html> > > <https://martinfowler.com/bliki/DDD_Aggregate.html > <https://martinfowler.com/bliki/DDD_Aggregate.html>> > > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > > > Pulp-dev mailing list > > > > > Pulp-dev@redhat.com <mailto:Pulp-dev@redhat.com> > <mailto:Pulp-dev@redhat.com > <mailto:Pulp-dev@redhat.com>> > > > > > https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev> > <https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev>> > > > > > > > > > > > _______________________________________________ > > > Pulp-dev mailing list > > > Pulp-dev@redhat.com <mailto:Pulp-dev@redhat.com> > <mailto:Pulp-dev@redhat.com > <mailto:Pulp-dev@redhat.com>> > > > https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev> > <https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev>> > > _______________________________________________ > > Pulp-dev mailing list > > Pulp-dev@redhat.com <mailto:Pulp-dev@redhat.com> > <mailto:Pulp-dev@redhat.com > <mailto:Pulp-dev@redhat.com>> > > https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev> > <https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev>> > > > > > _______________________________________________ > Pulp-dev mailing list > Pulp-dev@redhat.com <mailto:Pulp-dev@redhat.com> > https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev> > > > > _______________________________________________ > Pulp-dev mailing list > Pulp-dev@redhat.com <mailto:Pulp-dev@redhat.com> > https://www.redhat.com/mailman/listinfo/pulp-dev > <https://www.redhat.com/mailman/listinfo/pulp-dev> > > > > > _______________________________________________ > Pulp-dev mailing list > Pulp-dev@redhat.com > https://www.redhat.com/mailman/listinfo/pulp-dev >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Pulp-dev mailing list Pulp-dev@redhat.com https://www.redhat.com/mailman/listinfo/pulp-dev