Hello all,
        I have a need for managing "local clouds" and I was hoping to add 
support to libcloud for such a thing, since I'm already using it for 
remote/private cloud management.  When I brought this up in IRC, someone 
mentioned the idea of creating a libvirt (http://libvirt.org/) driver for 
libcloud.  That being said, I've created a GitHub fork for that purpose 
(https://github.com/jcscoobyrs/libcloud).  I have committed only one revision 
at this time but it does add partial libvirt support such that you can connect 
to any of the supported libvirt hypervisors, although I've only tested 
VirtualBox, and list nodes with node information.  As the effort stands right 
now, once you successfully create a LibvirtNodeDriver (LND), you can perform 
the following:

* LND.list_nodes()
* LND.destroy_node(Node)
* LND.reboot_node(Node)

For an example in action:

>>> from libcloud.compute.drivers import virtlib
>>> d = virtlib.LibvirtNodeDriver('vbox')
>>> d.list_nodes()
[<Node: uuid=c11d579a204f0c41102bd2fde52ea4364856ff30, name=Ubuntu, state=2, 
public_ip=None, provider=Libvirt Node Provider (VirtualBox) ...>, <Node: 
uuid=a79ecb055026d19949dee544e532e5ca87a8f75c, name=Fedora, state=2, 
public_ip=None, 
provider=Libvirt Node Provider (VirtualBox) ...>]
>>> nodes = d.list_nodes()
>>> nodes[0].extra
{'os_type': 'hvm', 'ram': 1024L, 'cpus': 1, 'snapshot_names': ['Initial Working 
State']}
>>> nodes[0].name
'Ubuntu'
>>> nodes[0].id
'387ea2e2-997c-46a0-9d07-e183d6a1dda1'

So given the list of functions implemented above, there are a few others that 
need implementing to finish libvirt's initial support:

* LND.create_node()
* LND.deploy_node() (I'm not sure this one is something that I plan on doing 
initially.)
* Constants for making the API easier to use and more intuitive
* Helper functions for getting Libvirt/driver information
* Helper functions for easing the interaction with libvirt

That being said, when I started working on the create_node function, I ran into 
a problem where function signatures that libcloud publishes/expects no longer 
make sense in the libvirt world.  In libvirt, there is no notion of images, 
locations and sizes.  In libvirt, you create an XML document and that is what 
describes the new guest/node and its "pieces" (http://libvirt.org/format.html). 
 (I do have an idea about locations where it could list the currently available 
hypervisors that libvirt was compiled with support for but the other things do 
not really lend themselves to be done.)

The purpose of this email is really two fold:

1) Show my current work so others can critique/test
2) Explain the problems I'm facing with finishing this up

All of this being said, let's talk about the feasibility of libvirt support 
being in libcloud and if it's feasible, how might I be able to get past the 
initial problem of describing guests/nodes in a way that libvirt needs without 
completely diverting from the libcloud API.

Take care,

Jeremy Whitlock <[email protected]>
Twitter: jcscoobyrs
Website: http://www.thoughtspark.org

Reply via email to