[libvirt] [PATCHv2 4/5] hyperv: Add basic driver for Microsoft Hyper-V

Eric Blake eblake at redhat.com
Fri Aug 19 23:26:50 UTC 2011


On 08/03/2011 09:00 AM, Matthias Bolte wrote:
> Domain listing, basic information retrieval and domain life cycle
> management is implemented. But currently the domian XML output

s/domian/domain/

> lacks the complete devices section.
>
> The driver uses OpenWSMAN to directly communicate with an Hyper-V

s/an Hyper/a Hyper/

Since the H in Hyper is aspirated, we use 'a' instead of 'an'.  Blame 
English for being stupid.

> server over its WS-Management interface exposed via Microsoft WinRM.
>
> The driver is based on the work of Michael Sievers. This started in
> the same master program project group at the University of Paderborn
> as the ESX driver.
>
> See Michael's blog for details: http://hyperv4libvirt.wordpress.com/
> ---
>
> v2:
> - add more virCheckFlags to please recent syntax-check additions for flags

Yay - my syntax-check was worth something!

> +
> +    /* Check if the connection can be established and if the server has the
> +     * Hyper-V role installed. If the call to hypervGetMsvmComputerSystemList
> +     * succeeds than the connection has be established. If the returned list

s/has be/has been/

> +    /* Strip the string to fit more relevant information in 32 chars */
> +    tmp = processorList->data->Name;
> +
> +    while (*tmp != '\0') {
> +        if (STRPREFIX(tmp, "  ")) {
> +            memmove(tmp, tmp + 1, strlen(tmp + 1) + 1);
> +            continue;
> +        } else if (STRPREFIX(tmp, "(R)") || STRPREFIX(tmp, "(C)")) {
> +            memmove(tmp, tmp + 3, strlen(tmp + 3) + 1);
> +            continue;
> +        } else if (STRPREFIX(tmp, "(TM)")) {

Cute.  Hopefully no one complains about stripping copyright and 
trademark notations in our compressed strings.  I think you're okay, but 
IANAL.

> +
> +static int
> +hypervDomainDestroy(virDomainPtr domain)

Let's implement hypervDomainDestroyFlags while we're at it (you don't 
have to support any flags for now).

> +
> +static int
> +hypervDomainGetState(virDomainPtr domain, int *state, int *reason,
> +                     unsigned int flags)
> +{
> +    int result = -1;
> +    hypervPrivate *priv = domain->conn->privateData;
> +    Msvm_ComputerSystem *computerSystem = NULL;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (hypervMsvmComputerSystemFromDomain(domain,&computerSystem)<  0) {
> +        goto cleanup;
> +    }
> +
> +    *state = hypervMsvmComputerSystemEnabledStateToDomainState(computerSystem);
> +
> +    if (reason != NULL) {
> +        *reason = 0;
> +    }

Looked like you might have enough details for some population of 
*reason, but it can be saved for later patches.

> +
> +static char *
> +hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
> +{
> +    char *xml = NULL;
> +    hypervPrivate *priv = domain->conn->privateData;
> +    virDomainDefPtr def = NULL;
> +    char uuid_string[VIR_UUID_STRING_BUFLEN];
> +    virBuffer query = VIR_BUFFER_INITIALIZER;
> +    Msvm_ComputerSystem *computerSystem = NULL;
> +    Msvm_VirtualSystemSettingData *virtualSystemSettingData = NULL;
> +    Msvm_ProcessorSettingData *processorSettingData = NULL;
> +    Msvm_MemorySettingData *memorySettingData = NULL;
> +

My convention in the other drivers was to put a comment here saying why 
I didn't do a virCheckFlags - because virDomainDefFormat does instead.

> +
> +static int
> +hypervDomainCreate(virDomainPtr domain)

Again, implement hypervDomainCreateWithFlags (you can hard-code flags to 
0), and make hypervDomainCreate call into the more powerful interface.

> +
> +
> +static int
> +hypervDomainManagedSave(virDomainPtr domain, unsigned int flags)
> +{
> +    int result = -1;
> +    hypervPrivate *priv = domain->conn->privateData;
> +    Msvm_ComputerSystem *computerSystem = NULL;
> +    bool in_transition = false;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (hypervMsvmComputerSystemFromDomain(domain,&computerSystem)<  0) {
> +        goto cleanup;
> +    }
> +
> +    if (!hypervIsMsvmComputerSystemActive(computerSystem,&in_transition) ||
> +        in_transition) {
> +        HYPERV_ERROR(VIR_ERR_OPERATION_INVALID, "%s",
> +                     _("Domain is not active or is in state transition"));
> +        goto cleanup;
> +    }
> +
> +    result = hypervInvokeMsvmComputerSystemRequestStateChange
> +               (domain, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_SUSPENDED);

Ah - now I see - HyperV suspended corresponds to a managed save (the 
hypervisor process exits, and resuming starts a new process), while 
paused corresponds to vcpus stopped (the hypervisor process exists but 
does nothing).  You were correct in mapping HyperV suspended to shut off.

Conditional ACK - I pointed out a couple more flag-variant functions 
that are trivially implemented.  I'm okay if you post a delta patch for 
review, then squash it in before pushing, since that would be shorter 
than a full-blown v3.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list