[libvirt] Python listDefinedDomains broken?
Daniel P. Berrange
berrange at redhat.com
Wed Jun 1 13:03:17 UTC 2016
On Wed, Jun 01, 2016 at 02:49:26PM +0200, Marc Richter wrote:
> Hi everyone,
>
> please, don't roast me if I'm asking stupid things or fail to provide info,
> since I'm a freshman, using libvirt.
No problem, we're a friendly lot here :-)
> Then a domain named "winxp_ausgeschaltet" is within that list:
>
>
> Id Name State
> ----------------------------------------------------
> ...
> - winxp_ausgeschaltet shut off
>
>
> When I do the same for the second host, it is also in that list:
>
>
> Id Name State
> ----------------------------------------------------
> ...
> 7 winxp_ausgeschaltet running
>
>
> When I do the following in Python, this domain is listed for the first host
> (where it's state is "shut off"), but not for the second one:
>
>
> import libvirt
> import sys
>
> class kvmhost:
> def __init__(self, host, keyfile):
> self.conn = self.connect_kvm(host, keyfile)
> self.doms = sorted(self.get_doms())
> def connect_kvm(self, host, keyfile):
> try:
> conn = libvirt.openReadOnly('qemu+ssh://root@' + host +
> '/system?keyfile=' + keyfile)
> except libvirt.libvirtError as lve:
> print('Error: ' + str(lve))
> sys.exit(1)
> return conn
> def get_doms(self):
> try:
> alldoms = self.conn.listDefinedDomains()
> except libvirt.libvirtError as lve:
> print('Error: ' + str(lve))
> self.conn.close()
> sys.exit(1)
> return alldoms
>
> host1 = kvmhost('host1', '/path/to/ssh_keyfile')
> host2 = kvmhost('host2', '/path/to/ssh_keyfile')
>
> print(host1.doms)
> print(host2.doms)
>
>
> What am I doing wrong here or: is there a missbehavior in libvirt or the
> python module?
This is expected behaviour of the listDefinedDomains() API call - though
admittedly somewhat stupid behaviour.
Originally libvirt has a listDomainsIDs API call that only listed guests
that were running.
We then added listDefinedDomains() call that only listed guests that
were *not* running.
So to get a complete list of guests on the host you had to use *both*
listDomainsIDs and listDefinedDomains().
This had a built-in race condition if a guest started or stopped in
betweeen the 2 API calls. So we introduced 'listAllDomains' as a better
API that can give you a list of *all* domains whether running or stopped.
> Using listAllDomains instead of listDefinedDomains gives:
>
> libvirt: Remote Driver error : unknown procedure: 273
I'm really surprised to see that error - this API call has existed
since libvirt 0.9.13 and you say you have 1.3.1 which is more than
new enough
> What is the difference between listAllDomains and listDefinedDomains at all?
Essentially listAllDomains() is what any app using modern libvirt should
be using. We recommend ignoring listDefinedDomains & listDomainIDs unless
you need to work with older (ancient) libvirt
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list