On Tue, Jan 16, 2007 at 05:21:15PM +0000, Mark McLoughlin wrote: > On Tue, 2007-01-16 at 15:57 +0000, Daniel P. Berrange wrote: > > On Mon, Jan 15, 2007 at 08:53:43PM +0000, Mark McLoughlin wrote: > > > On Mon, 2007-01-15 at 20:06 +0000, Mark McLoughlin wrote: > > > > > > > * Since virConnect is supposed to be a connection to a specific > > > > hypervisor, does it make sense to create networks (which should > > > > be hypervisor agnostic) through virConnect? > > > > > > Personally, I think virConnect should be little more than a library > > > context through which you access all hypervisors at once. In practical > > > terms, the XML describing a domain is what chooses which hypervisor to > > > connect to - e.g. all apps should pass NULL to virConnectOpen() and all > > > drivers should handle NULL. > > > > > > The one exception to that is for remote connections. In that case apps > > > should pass a URI for a remote libvirt daemon which, in turn, would be > > > equivalent to calling virConnectOpen(NULL) on the remote host. > > > > > > So, remotely connecting directly to a hypervisor should be deprecated. > > > > Having been kept away last night thinking about the implications of this > > I think you're description above could actually work, with a fairly small > > modification. But first, some pretty pictures: > > > > 1. The simple (current) usage of using libvirt to connect to a local > > hypervisor. Showing two examples - first how the current Xen backends > > works, and second how my prototype QEMU backend works: > > > > http://people.redhat.com/berrange/libvirt/libvirt-arch-local.png > > This is actually what I'd like to see change. > > Here's my train of thought: > > - As a user running multiple types of guests, you want to just decide > at creation time whether the guest should be e.g. Xen or QEMU. > Apart from that, you don't really want to have to think about what > type a guest is. This reminds me of something I've not explicitly said elsewhere. While libvirt API may support multiple difference hypervisors, I'm rather expecting that the common case usage will be that any single host will only ever use one particular hypervisor. ie, a host will be providing Xen, or QEMU+KVM or VMWare or XXX - I think its reasonable to expect that people won't run both Xen and QEMU+KVM on the same host. So, one does not neccessarily have to expose the type of guest to the end user - one could say 'give me the hypervisor connection for this host' and it would auto-detect what hypervisor is available for that host. Of course some people might be perverse enough to run many HV on a host but I suspect that's rather the niche case. Probably main case I'd see is that a host is primarily running Xen as its primary HV. For some one off task, the user may fire up an unprivileged QEMU session, for a few hours. > - That implies that users don't want to have different apps for > each type of virt, nor different windows, nor different tabs, nor > different lists of guests ... if the app doesn't aggregate the > guests, then the user will mentally have to aggregate them. I think we'd probably end up grouping the guests based on the host they are running on. In the common case of only one HV per host, there would be no need for the user to worry about the different types of HV, unless they opted-in to accessing a non-default HV from the host. > - So, should each app do all the heavy lifting to aggregate virt > types or should libvirt? I'd argue that while having a consistent > API to access different virt types is useful, it's less useful if > the app developer needs to access each hypervisor individually. > > - You're rightly concerned about the namespace clash. It's a problem. > I really do sympathise. However, should we just punt the problem to > the app developers, or worse ... to the users? Well a combination of all ? We have a hierarchy of namespaces currently, from narrowest scope to broadest: - ID: unique to an active guest on a single HV - Name: unique to a guest for its lifetime on a single host+HV - UUID: unique to a guest for its lifetime, across a datacenter > - As an example, do you want a situation where someone creates a Xen > guest named "Foo", a QEMU guest named "Foo" and when wanting to > shutdown the QEMU guest does: > > $> virsh destroy Foo > > rather than: > > $> virsh --connect qemud:///system destroy Foo > > Oops :-) Indeed - but not particularly different to the case of managing two remote hosts with virsh $ virsh --connect xen://web1/ destroy Foo vs $ virsh --connect xen://db1/ destroy Foo And I don't think its viable to enforce unique naming of guests across the entire data center. There's always a big risk when using command line tools like this - for graphical tools we can do better, because UI cues can help distinguish guests better - eg grouping by host. > - Namespace clash #1 is the guest name. I don't think libvirt should > allow users to create multiple guests of the same name. It may be > technically possible to do that, but if users aggregate the > namespace anyway, then it will just cause them confusion if they > do. > > - Probably the only serious problem with that is that libvirt > currently will manage Xen guests not created using libvirt. Does it > make sense to do that? Will we allow the same with non-Xen? In the ideal world I'd ignore anything not managed by libvirt, but in reality I don't think that's practical. We need to be able to interoperate as cleanly as possible with other tools, either provided by the HV itself (eg xm) or by other 3rd party vendors. While my prototype QEMU backend ignores VMs not created by libvirt, work going on upstream will make it practical to manage them too. > - Namespace clash #2 is the ID. These IDs are assigned by libvirt > (except for Xen) and should be opaque to the user, so we could > split this namespace now. Start QEMU IDs at 1000? Or prefix the > integer with "qemu:"? It has to be an integer because of existing ABI constraints. I'm not sure we really want to maintain an internal mapping of libvirt IDs to the actual HV's view of IDs. We already provide a globally unique ID - eg the UUID, so having a second one doesn't seem like much use. > - Namespace clash #3 is the UUID. This one's kind of funny - one > would think we wouldn't need to worry about namespace clashes with > "universally unique" IDs :-) We should definitely be trying to > prevent from re-using UUIDs. Well, assuming we use a sane generation technique, statistically these are supposed to be globally unique. Of course users make mistakes, for example, when cloning VMs, so XenD will do reasonable effort to check uniqueness. I'm of opinion though that libvirt should avoid trying to implement policy itself, and rather deligate that policy to the underlying HV. eg If libvirt had a polucy for VM names saying a-Z, 0-9, but XenD instead requires a-Z, 0-9, _, - then we can get into crazy situation where user is trying to manage an existing VM, but libvirt incorrectly rejects it. > - Or perhaps, libvirt would *always* talk to a daemon ... whether > local or remote. That way you don't have the race condition where > multiple apps can create a guest of the same name or uuid at once. Possibly :-) I think I'll draw another diagram... Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|