I think to William's point, we should have already authenticated the unit as part of the API request, thus we should have a Unit object hanging around somewhere close to where that request is being made, and can just pass it into state.
John =:-> On Mon, Jan 25, 2016 at 3:07 PM, Nate Finch <nate.fi...@canonical.com> wrote: > I was really trying not to give too much information about this exact > case, so we could avoid talking about a specific implementation, and focus > on the more general question of how we identify objects. Yes, we get the > bytes using an HTTP request, but that is irrelevant to my question :) > > On Mon, Jan 25, 2016 at 2:00 AM John Meinel <j...@arbash-meinel.com> > wrote: > >> On Sat, Jan 23, 2016 at 1:28 AM, William Reade < >> william.re...@canonical.com> wrote: >> >>> On Fri, Jan 22, 2016 at 9:53 PM, Nate Finch <nate.fi...@canonical.com> >>> wrote: >>> >>>> Working in the model layer on the server between the API and the DB. >>>> Specifically in my instance, an API call comes in from a unit, requesting >>>> the bytes for a resource. We want to record that this unit is now using >>>> the bytes from that specific revision of the resource. I have a pointer to >>>> a state.Unit, and a function that takes a Resource metadata object and some >>>> reference to the unit, and does the actual transaction to the DB to store >>>> the unit's ID and the resource information. >>>> >>> >>> I'm a bit surprised that we'd be transferring those bytes over an API >>> call in the first place (is json-over-websocket really a great way to send >>> potential gigabytes? shouldn't we be getting URL+SHA256 from the apiserver >>> as we do for charms, and downloading separately? and do we really want to >>> enforce charmstore == apiserver?); and I'd point out that merely having >>> agreed to deliver some bytes to a client is no indication that the client >>> will actually be using those bytes for anything; but we should probably >>> chat about those elsewhere, I'm evidently missing some context. >>> >> >> So I would have expected that we'd rather use a similar raw >> HTTP-to-get-content instead of a JSON request (given the intent of >> resources is that they may be GB in size), but regardless it is the intent >> that you download the bytes from the charm rather from the store directly. >> Similar to how we currently fetch the charm archive content itself. >> As for "will you be using it", the specific request from the charm is >> when it calls "resource-get" which is very specifically the time when the >> charm wants to go do something with those bytes. >> >> John >> =:-> >> >> >>> But whenever we do record the unit-X-uses-resource-Y info I assume we'll >>> have much the same stuff available in the apiserver, in which case I think >>> you just want to pass the *Unit back into state; without it, you just need >>> to read the doc from the DB all over again to make appropriate >>> liveness/existence checks [0], and why bother unless you've already hit an >>> assertion failure in your first txn attempt? >>> >>> Cheers >>> William >>> >>> [0] I imagine you're not just dumping (unit, resource) pairs into the DB >>> without checking that they're sane? that's really not safe >>> >>> >>>> On Fri, Jan 22, 2016 at 3:34 PM William Reade < >>>> william.re...@canonical.com> wrote: >>>> >>>>> Need a bit more context here. What layer are you working in? >>>>> >>>>> In general terms, entity references in the API *must* use tags; entity >>>>> references that leak out to users *must not* use tags; otherwise it's a >>>>> matter of judgment and convenience. In state code, it's annoying to use >>>>> tags because we've already got the globalKey convention; in worker code >>>>> it's often justifiable if not exactly awesome. See >>>>> https://github.com/juju/juju/wiki/Managing-complexity#workers >>>>> >>>>> Cheers >>>>> William >>>>> >>>>> On Fri, Jan 22, 2016 at 6:02 PM, Nate Finch <nate.fi...@canonical.com> >>>>> wrote: >>>>> >>>>>> I have a function that is recording which unit is using a specific >>>>>> resource. I wrote the function to take a UnitTag, because that's the >>>>>> closest thing we have to an ID type. However, I and others seem to >>>>>> remember >>>>>> hearing that Tags are really only supposed to be used for the API. That >>>>>> leaves me with a problem - what can I pass to this function to indicate >>>>>> which unit I'm talking about? I'd be fine passing a pointer to the unit >>>>>> object itself, but we're trying to avoid direct dependencies on state. >>>>>> People have suggested just passing a string (presumably >>>>>> unit.Tag().String()), but then my API is too lenient - it appears to say >>>>>> "give me any string you want for an id", but what it really means is >>>>>> "give >>>>>> me a serialized UnitTag". >>>>>> >>>>>> I think most places in the code just use a string for an ID, but this >>>>>> opens up the code to abuses and developer errors. >>>>>> >>>>>> Can someone explain why tags should only be used in the API? It seems >>>>>> like the perfect type to pass around to indicate the ID of a specific >>>>>> object. >>>>>> >>>>>> -Nate >>>>>> >>>>>> -- >>>>>> Juju-dev mailing list >>>>>> Juju-dev@lists.ubuntu.com >>>>>> Modify settings or unsubscribe at: >>>>>> https://lists.ubuntu.com/mailman/listinfo/juju-dev >>>>>> >>>>>> >>> >>> -- >>> Juju-dev mailing list >>> Juju-dev@lists.ubuntu.com >>> Modify settings or unsubscribe at: >>> https://lists.ubuntu.com/mailman/listinfo/juju-dev >>> >>>
-- Juju-dev mailing list Juju-dev@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/juju-dev