[libvirt] [PATCH] virsh: Make <mac> required when device-detaching interface

Michal Prívozník mprivozn at redhat.com
Wed Feb 23 08:19:00 UTC 2011


On 02/23/2011 05:30 AM, Daniel Veillard wrote:
> On Tue, Feb 22, 2011 at 11:16:29AM +0100, Michal Privoznik wrote:
>> Problem is, if user does not specify mac address in input XML,
>> we generate a random one, which is why device-detach fails giving
>> a confusing error message. Therefore<mac>  needs to be required.
>
>    Well if the domain only has one interface then if there is no<mac>
> specified the semantic of the operation is still clear. Since it a very
> frequent user case, I would rather not break something which was working
> and has a clear semantic.
I couldn't agree more, but this is not how it works now anyway. Actually 
this should be the patch for 
https://bugzilla.redhat.com/show_bug.cgi?id=616721
But yeah, it would be better, if it works that way you've pointed out.
>
>    IMHO we should check if the domain has multiple interface first and
> only raise a problem then. I think I saw such a patch a few weeks ago
> possibly in a different context though.
>
>> ---
>>   tools/virsh.c |   57 ++++++++++++++++++++++++++++++++++++++++++++++-----------
>>   1 files changed, 46 insertions(+), 11 deletions(-)
>>
>> diff --git a/tools/virsh.c b/tools/virsh.c
>> index 2837e0f..dfb48d2 100644
>> --- a/tools/virsh.c
>> +++ b/tools/virsh.c
>> @@ -8580,9 +8580,12 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
>>       virDomainPtr dom;
>>       char *from;
>>       char *buffer;
>> -    int ret = TRUE;
>> +    int ret = FALSE;
>>       int found;
>>       unsigned int flags;
>> +    xmlDocPtr xml = NULL;
>> +    xmlXPathContextPtr ctxt = NULL;
>> +    int mac_cnt;
>>
>>       if (!vshConnectionUsability(ctl, ctl->conn))
>>           return FALSE;
>> @@ -8592,14 +8595,41 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
>>
>>       from = vshCommandOptString(cmd, "file",&found);
>>       if (!found) {
>> -        virDomainFree(dom);
>> -        return FALSE;
>> +        goto cleanup;
>>       }
>>
>>       if (virFileReadAll(from, VIRSH_MAX_XML_FILE,&buffer)<  0) {
>>           virshReportError(ctl);
>> -        virDomainFree(dom);
>> -        return FALSE;
>> +        goto cleanup;
>> +    }
>> +
>> +    xml = xmlReadDoc((const xmlChar *) buffer, "interface.xml", NULL,
>> +                     XML_PARSE_NOENT | XML_PARSE_NONET |
>> +                     XML_PARSE_NOWARNING);
>> +
>> +    if (!xml) {
>> +        vshError(ctl, "%s", _("input XML is not valid"));
>> +        goto cleanup;
>> +    }
>
>    Hum, "valid"in XML means conformant to the DTD ot to a schemas, and
> that's not something xmlReadDoc checks. The best is to say something like
>    "input XML failed to parse"
> i.e. it's likely to be a syntactic error, which should be reported more
> precisely by libxml2
>
>> +    ctxt = xmlXPathNewContext(xml);
>> +    mac_cnt = virXPathNodeSet("/interface/mac", ctxt, NULL);
>> +
>> +    switch(mac_cnt) {
>> +        case 1:
>> +            break;
>> +
>> +        case 0:
>> +        case -1:
>> +            vshError(ctl, "%s", _("You must specify mac address in xml file"));
>> +            goto cleanup;
>> +            break;
>> +
>> +        default:
>> +            vshError(ctl, "%s", _("You must specify exactly one mac address in"
>> +                                  " xml file"));
>> +            goto cleanup;
>> +            break;
>>       }
>>
>>       if (vshCommandOptBool(cmd, "persistent")) {
>> @@ -8610,18 +8640,23 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
>>       } else {
>>           ret = virDomainDetachDevice(dom, buffer);
>>       }
>> -    VIR_FREE(buffer);
>>
>>       if (ret<  0) {
>> +        ret = FALSE;
>>           vshError(ctl, _("Failed to detach device from %s"), from);
>> -        virDomainFree(dom);
>> -        return FALSE;
>> -    } else {
>> -        vshPrint(ctl, "%s", _("Device detached successfully\n"));
>> +        goto cleanup;
>>       }
>>
>> +    vshPrint(ctl, "%s", _("Device detached successfully\n"));
>> +    ret = TRUE;
>
>    centralizing error handling is a good idea
>
>> +cleanup:
>> +    xmlXPathFreeContext(ctxt);
>> +    if (xml)
>> +        xmlFreeDoc(xml);
>> +    VIR_FREE(buffer);
>>       virDomainFree(dom);
>> -    return TRUE;
>> +    return ret;
>>   }
>>
>>
>
> Daniel
>

I'll rewrite and sent v2.




More information about the libvir-list mailing list