On Thu, 2011-03-10 at 09:31 -0600, Jeff Ortel wrote:
> All,
>
> I've pushed the 2nd round of changes that complete the "update semantics"
> story. This
> work included the decoupling of the DB crud operations from the APIs. The
> API classes
> have been changed to use the mongo collection. Also, the BaseApi insert(),
> update(),
> delete() methods have been commented out to ensure two things. First, API
> classes most
> provided meaningful implementations for the CRUD of system entities. Second,
> it forces
> the afore mentioned DB decoupling. Although, BaseApi.clean() remains and I
> think we
> should consider leaving delete() as they rarely need to be specialized.
>
> For those API classes that did not implement an update() method, I added one.
> I
> determined which keywords (fields) to support in the 'delta' using the
> following criteria:
> 1) looking in the model and assuming what was reasonable; 2) only considered
> fields that
> were *not* covered by specific update-like method in the API such as
> RepoApi.add_package().
>
> Here's the basic update() impl pattern:
>
> def update(id, delta):
>
> 1. Get rid of the ID in the 'delta'. Eg: delta.pop('id', None)
> 2. Fetch the object.
> 3. Iterate the 'delta' content in as CASE style loop.
>
> for key,value in delta.items():
> if key in ('a','b',...): <----- SIMPLE UPDATES FIRST
> object[key] = value
> continue
> if key == 'foobar': <------ SPECIAL UPDATES (repeat)
> <special logic>
> object[key] = <something>
> continue
> # default <------ UNSUPPORTED
> raise Exception, 'not supported'
>
> 4. Save the updated object using the mongo collection
> 5. Return the updated object.
>
> There are as many 'SPECIAL UPDATES' blocks as needed. So, when adding a
> supported field
> to an update() method, please add another 'if key; continue' block.
>
> After converting each API class, I updated the callers in the expected places:
> * The WS controllers
> * The other APIs
> * The unit tests
> * The CLI classes to just pass delta
> * The client.api classes update() signatures
>
> In some cases, I changed the call to Api.update() to match the signature. In
> other cases,
> the changed the call to use one of the specific update methods on the API
> such as
> RepoApi.add_package() rather then updating the packages list on the repo and
> calling
> update(). It's more appropriate anyway.
>
> The nosetests are clean and I've sanity tested using the CLI. But, I can't
> test
> everything. I would really appreciate everyone taking a good look at the
> Api.update()
> methods and making sure I got the fields correct. Also, take some time to
> double check
> the WS controllers as they are not tested by the unit tests.
>
> Thanks,
>
> JeffThis is excellent. I'll poke at the web services today as I'm in there already writing documentation. -- Jason L Connor linear on freenode #pulp http://pulpproject.org/ RHCE: 805010912355231 GPG Fingerprint: 2048R/CC4ED7C1
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Pulp-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/pulp-list
