[libvirt] [PATCH 2/2] network: backend for virNetworkUpdate of portgroups

Daniel Veillard veillard at redhat.com
Fri Sep 21 04:15:41 UTC 2012


On Thu, Sep 20, 2012 at 10:25:41PM -0400, Laine Stump wrote:
> portgroup elements are located in the toplevel of <network>
> objects. There can be multiple <portgroup> elements, and they each
> have a unique name attribute.
> 
> Add, delete, and modify are all supported for portgroup. When deleting
> a portgroup, only the name must be specified in the provided xml - all
> other attributes and subelements are ignored for the purposes of
> matching and existing portgroup.
> 
> The bridge driver and virsh already know about the portgroup element,
> so providing this backend should cause the entire stack to work. Note
> that in the case of portgroup, there is no external daemon based on
> the portgroup config, so nothing must be restarted.
> 
> It is important to note that guests make a copy of the appropriate
> network's portgroup data when they are started, so although an updated
> portgroup's configuration will have an affect on new guests started
> after the cahange, existing guests won't magically have their
> bandwidth changed, for example. If something like that is desired, it
> will take a lot of redesign work in the way network devices are setup
> (there is currently no link from the network back to the individual
> interfaces using it, much less from a portgroup within a network back
> to the individual interfaces).
> ---
>  src/conf/network_conf.c | 85 +++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 79 insertions(+), 6 deletions(-)
> 
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 7fc559f..34487dd 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -2625,15 +2625,88 @@ virNetworkDefUpdateForwardPF(virNetworkDefPtr def,
>  }
>  
>  static int
> -virNetworkDefUpdatePortgroup(virNetworkDefPtr def,
> -                             unsigned int command ATTRIBUTE_UNUSED,
> +virNetworkDefUpdatePortGroup(virNetworkDefPtr def,
> +                             unsigned int command,
>                               int parentIndex ATTRIBUTE_UNUSED,
> -                             xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                             xmlXPathContextPtr ctxt,
>                               /* virNetworkUpdateFlags */
>                               unsigned int fflags ATTRIBUTE_UNUSED)
>  {
> -    virNetworkDefUpdateNoSupport(def, "portgroup");
> -    return -1;
> +    int ii, ret = -1;
> +    virPortGroupDef portgroup;
> +
> +    memset(&portgroup, 0, sizeof(portgroup));
> +
> +    if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "portgroup") < 0)
> +        goto cleanup;
> +
> +    if (virNetworkPortGroupParseXML(&portgroup, ctxt->node, ctxt) < 0)
> +        goto cleanup;
> +
> +    /* check if a portgroup with same name already exists */
> +    for (ii = 0; ii < def->nPortGroups; ii++) {
> +        if (STREQ(portgroup.name, def->portGroups[ii].name))
> +            break;
> +    }
> +    if (ii == def->nPortGroups &&
> +        ((command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) ||
> +         (command == VIR_NETWORK_UPDATE_COMMAND_DELETE))) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       _("couldn't find a portgroup entry "
> +                         "in network '%s' matching <portgroup name='%s'>"),
> +                       def->name, portgroup.name);
> +        goto cleanup;
> +    } else if (ii < def->nPortGroups &&
> +               ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) ||
> +                (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST))) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       _("there is an existing portgroup entry in "
> +                         "network '%s' that matches "
> +                         "\"<portgroup name='%s'>\""),
> +                       def->name, portgroup.name);
> +        goto cleanup;
> +    }
> +
> +    if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
> +
> +        /* replace existing entry */
> +        virPortGroupDefClear(&def->portGroups[ii]);
> +        def->portGroups[ii] = portgroup;
> +        memset(&portgroup, 0, sizeof(portgroup));
> +
> +    } else if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) ||
> +        (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) {
> +
> +        /* add to beginning/end of list */
> +        if (VIR_REALLOC_N(def->portGroups, def->nPortGroups +1) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        if (command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST) {
> +            def->portGroups[def->nPortGroups] = portgroup;
> +        } else { /* implied (command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) */
> +            memmove(def->portGroups + 1, def->portGroups,
> +                    sizeof(*def->portGroups) * def->nPortGroups);
> +            def->portGroups[0] = portgroup;
> +        }
> +        def->nPortGroups++;
> +        memset(&portgroup, 0, sizeof(portgroup));
> +
> +    } else if (command == VIR_NETWORK_UPDATE_COMMAND_DELETE) {
> +
> +        /* remove it */
> +        virPortGroupDefClear(&def->portGroups[ii]);
> +        memmove(def->portGroups + ii, def->portGroups + ii + 1,
> +                sizeof(*def->portGroups) * (def->nPortGroups - ii - 1));
> +        def->nPortGroups--;
> +        ignore_value(VIR_REALLOC_N(def->portGroups, def->nPortGroups));
> +    }
> +
> +    ret = 0;
> +cleanup:
> +    virPortGroupDefClear(&portgroup);
> +    return ret;
>  }
>  
>  static int
> @@ -2719,7 +2792,7 @@ virNetworkDefUpdateSection(virNetworkDefPtr def,
>                                             parentIndex, ctxt, flags);
>          break;
>      case VIR_NETWORK_SECTION_PORTGROUP:
> -        ret = virNetworkDefUpdatePortgroup(def, command,
> +        ret = virNetworkDefUpdatePortGroup(def, command,
>                                             parentIndex, ctxt, flags);
>          break;
>      case VIR_NETWORK_SECTION_DNS_HOST:

  ACK too, but same remark as for patch 1

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list