On 11/27/2011 11:16 AM, Michael Pasternak wrote:
Hi Geert,
On 11/26/2011 07:49 PM, Geert Jansen wrote:
> Hi Michael,
>
> i just wrote a small program with the new Python SDK. I found it very easy to use, so
great work. I do have a few points of feedback:
>
> * Probably we want all Exceptions derived from a single base class. That way, the
user can intercept any ovirtsdk with a single try/except clause. Currently that's not
> possible, as all your exceptions derive directly from Exception.
sure, in my TODO list.
Would be great if you could publish the TODO list on the ovirt Wiki.
It would encourage others to work on those items as well.
Y.
> * I think the .get() method should be id-based not name based. Using "id"
as a primary key has a number of advantages over name:
>
> - It is immutable, which makes e.g. renaming a lot easier.
> - It allows you to retrieve an object without a search query or a filter.
> - It matches how the API works as well.
"id" is supported, you can do api.collection.get(id=xxx), only as you
mentioned
"id" is not primary, but secondary key (i thought that searching by name will
be easier),
but i can change it in a second if this is an issue.
> Also currently i think it's not possible to retrieve a resource by its ID,
unless you use the id= keyword argument to list() which retrieves the whole collection and
then
> filters out the matching id.
nope, it's supported - i even added it to examples.py [1]
-> vm5 = api.vms.get(id='02f0f4a4-9738-4731-83c4-293f3f734782')
[1] will add it to get method .get(id, name) as you suggested.
> * You may want to introduce some non-entity related operations, like ping(), and
connect(). These allow you to better control when you connect, and allow an program to
> test if the connection details work. That helps client except the right exceptions at
the right time, and display more relevant error messages.
- no need for explicit connect() as its done implicitly on proxy construction
- no need for ping() as any attempt to use disconnected (and not recoverable) proxy, will
cause ConnectionError,
so user should only /Trap/ this exception for disaster_recovery
> * There's two Python objects involved for each API object. For a VM for
example, you have params.VM and brokers.VM. This distinction is made visible to the user,
for example:
>
> template = api.templates.get('Blank')
>
> vm = params.VM()
> vm.name = 'foo'
> vm.template = template # ERROR
yep, you right doing this is in my TODO list as well
(had to switch to CLI, so i do have few leftovers[1] - this is one of them)
[1] they all have simple workarounds (like this one as described below)
> The last line need to be:
>
> vm.template = params.Template(id=template.id)
for now (as workaround you can pass 'superclass', e.g vm.template =
template.superclass),
but i suggest you just wait for another day till I'll support this.
> In my version of the Python API i used mix-in classes to add the OO behavior to the
generated classes. It was easy, because PyXB had support for that. This gave me the
> single class behavior. I am not sure if GenerateDS generated code allows that.
I'm pretty sure it could be done though, but you may need to do some Python magic.
no need, i do this with regular inheritance pattern
> * Nitpick: should this just be called "ovirt" instead of
"ovirtsdk"?
initially it was, but since both cli& sdk would operate in same namespace,
i wanted to avoid future collisions and renamed them to ovirtsdk/ovirtcli.
> Overall great work though!
10nx a lot mate.
> Regards,
> Geert
> _______________________________________________
> Engine-devel mailing list
> Engine-devel(a)ovirt.org
>
http://lists.ovirt.org/mailman/listinfo/engine-devel