[libvirt] [PATCHv2 4/9] conf: implement NetworkObj backend of virNetworkUpdate API

Daniel Veillard veillard at redhat.com
Tue Sep 18 07:56:46 UTC 2012


On Tue, Sep 18, 2012 at 03:39:00AM -0400, Laine Stump wrote:
> virNetworkObjUpdate takes care of all virNetworkUpdate-related changes
> to the data stored in the in-memory virNetworkObj list. It should be
> called by network drivers that use this in-memory list.
> 
> virNetworkObjUpdate *does not* take care of updating any disk-based
> copies of the config, nor does it perform any other operations
> necessary to have the new config data take effect (e.g. it won't
> re-write dnsmasq host files, nor will it send a SIGHUP to dnsmasq) -
> those things should all be taken care of in the network driver
> function that calls virNetworkObjUpdate (assuming that it returns
> success).
> ---
>  src/conf/network_conf.c  | 308 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/network_conf.h  |   8 ++
>  src/libvirt_private.syms |   1 +
>  3 files changed, 317 insertions(+)
> 
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index a48eb9e..2a65f1d 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -2251,6 +2251,314 @@ void virNetworkSetBridgeMacAddr(virNetworkDefPtr def)
>      }
>  }
>  
> +/* NetworkObj backend of the virNetworkUpdate API */
> +
> +static void
> +virNetworkDefUpdateNoSupport(virNetworkDefPtr def, const char *section)
> +{
> +    virReportError(VIR_ERR_NO_SUPPORT,
> +                   _("can't update '%s' section of network '%s'"),
> +                   section, def->name);
> +}
> +
> +#if 0
> +static int
> +virNetworkDefUpdateCheckElementName(virNetworkDefPtr def,
> +                                    xmlNodePtr node,
> +                                    const char *section)
> +{
> +    if (!xmlStrEqual(node->name, BAD_CAST section)) {
> +        virReportError(VIR_ERR_XML_ERROR,
> +                       _("unexpected element <%s>, expecting <%s>, "
> +                         "while updating network '%s'"),
> +                       node->name, section, def->name);
> +        return -1;
> +    }
> +    return 0;
> +}
> +#endif
> +
> +static int
> +virNetworkDefUpdateBridge(virNetworkDefPtr def,
> +                          unsigned int command ATTRIBUTE_UNUSED,
> +                          int parentIndex ATTRIBUTE_UNUSED,
> +                          xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                          /* virNetworkUpdateFlags */
> +                          unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "bridge");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateDomain(virNetworkDefPtr def,
> +                          unsigned int command ATTRIBUTE_UNUSED,
> +                          int parentIndex ATTRIBUTE_UNUSED,
> +                          xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                          /* virNetworkUpdateFlags */
> +                          unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "domain");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateIP(virNetworkDefPtr def,
> +                      unsigned int command ATTRIBUTE_UNUSED,
> +                      int parentIndex ATTRIBUTE_UNUSED,
> +                      xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                      /* virNetworkUpdateFlags */
> +                      unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "ip");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
> +                              unsigned int command ATTRIBUTE_UNUSED,
> +                              int parentIndex ATTRIBUTE_UNUSED,
> +                              xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                              /* virNetworkUpdateFlags */
> +                              unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "ip dhcp host");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateIPDHCPRange(virNetworkDefPtr def,
> +                               unsigned int command ATTRIBUTE_UNUSED,
> +                               int parentIndex ATTRIBUTE_UNUSED,
> +                               xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                               /* virNetworkUpdateFlags */
> +                               unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "ip dhcp range");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateForward(virNetworkDefPtr def,
> +                           unsigned int command ATTRIBUTE_UNUSED,
> +                           int parentIndex ATTRIBUTE_UNUSED,
> +                           xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                           /* virNetworkUpdateFlags */
> +                           unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "forward");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateForwardInterface(virNetworkDefPtr def,
> +                                    unsigned int command ATTRIBUTE_UNUSED,
> +                                    int parentIndex ATTRIBUTE_UNUSED,
> +                                    xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                                    /* virNetworkUpdateFlags */
> +                                    unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "forward interface");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateForwardPF(virNetworkDefPtr def,
> +                             unsigned int command ATTRIBUTE_UNUSED,
> +                             int parentIndex ATTRIBUTE_UNUSED,
> +                             xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                             /* virNetworkUpdateFlags */
> +                             unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "forward pf");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdatePortgroup(virNetworkDefPtr def,
> +                             unsigned int command ATTRIBUTE_UNUSED,
> +                             int parentIndex ATTRIBUTE_UNUSED,
> +                             xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                             /* virNetworkUpdateFlags */
> +                             unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "portgroup");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateDNSHost(virNetworkDefPtr def,
> +                           unsigned int command ATTRIBUTE_UNUSED,
> +                           int parentIndex ATTRIBUTE_UNUSED,
> +                           xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                           /* virNetworkUpdateFlags */
> +                           unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "dns host");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateDNSTxt(virNetworkDefPtr def,
> +                          unsigned int command ATTRIBUTE_UNUSED,
> +                          int parentIndex ATTRIBUTE_UNUSED,
> +                          xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                          /* virNetworkUpdateFlags */
> +                          unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "dns txt");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateDNSSrv(virNetworkDefPtr def,
> +                          unsigned int command ATTRIBUTE_UNUSED,
> +                          int parentIndex ATTRIBUTE_UNUSED,
> +                          xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
> +                          /* virNetworkUpdateFlags */
> +                          unsigned int fflags ATTRIBUTE_UNUSED)
> +{
> +    virNetworkDefUpdateNoSupport(def, "dns txt");
> +    return -1;
> +}
> +
> +static int
> +virNetworkDefUpdateSection(virNetworkDefPtr def,
> +                           unsigned int command, /* virNetworkUpdateCommand */
> +                           unsigned int section, /* virNetworkUpdateSection */
> +                           int parentIndex,
> +                           const char *xml,
> +                           unsigned int flags)  /* virNetworkUpdateFlags */
> +{
> +    int ret = -1;
> +    xmlDocPtr doc;
> +    xmlXPathContextPtr ctxt = NULL;
> +
> +    if (!(doc = virXMLParseStringCtxt(xml, _("network_update_xml"), &ctxt)))
> +        goto cleanup;
> +
> +    switch (section) {
> +    case VIR_NETWORK_SECTION_BRIDGE:
> +       ret = virNetworkDefUpdateBridge(def, command, parentIndex, ctxt, flags);
> +        break;
> +
> +    case VIR_NETWORK_SECTION_DOMAIN:
> +        ret = virNetworkDefUpdateDomain(def, command, parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_IP:
> +        ret = virNetworkDefUpdateIP(def, command, parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_IP_DHCP_HOST:
> +        ret = virNetworkDefUpdateIPDHCPHost(def, command,
> +                                            parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_IP_DHCP_RANGE:
> +        ret = virNetworkDefUpdateIPDHCPRange(def, command,
> +                                             parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_FORWARD:
> +        ret = virNetworkDefUpdateForward(def, command,
> +                                         parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_FORWARD_INTERFACE:
> +        ret = virNetworkDefUpdateForwardInterface(def, command,
> +                                                  parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_FORWARD_PF:
> +        ret = virNetworkDefUpdateForwardPF(def, command,
> +                                           parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_PORTGROUP:
> +        ret = virNetworkDefUpdatePortgroup(def, command,
> +                                           parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_DNS_HOST:
> +        ret = virNetworkDefUpdateDNSHost(def, command,
> +                                         parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_DNS_TXT:
> +        ret = virNetworkDefUpdateDNSTxt(def, command, parentIndex, ctxt, flags);
> +        break;
> +    case VIR_NETWORK_SECTION_DNS_SRV:
> +        ret = virNetworkDefUpdateDNSSrv(def, command, parentIndex, ctxt, flags);
> +        break;
> +    default:
> +        virReportError(VIR_ERR_NO_SUPPORT, "%s",
> +                       _("can't update unrecognized section of network"));
> +        break;
> +    }
> +
> +cleanup:
> +    xmlFreeDoc(doc);
> +    xmlXPathFreeContext(ctxt);
> +    return ret;
> +}
> +
> +/*
> + * virNetworkObjUpdate:
> + *
> + * Apply the supplied update to the given virNetworkObj. Except for
> + * @network pointing to an actual network object rather than the
> + * opaque virNetworkPtr, parameters are identical to the public API
> + * virNetworkUpdate.
> + *
> + * The original virNetworkDefs are copied, and all modifications made
> + * to these copies. The originals are replaced with the copies only
> + * after success has been guaranteed.
> + *
> + * Returns: -1 on error, 0 on success.
> + */
> +int
> +virNetworkObjUpdate(virNetworkObjPtr network,
> +                    unsigned int command, /* virNetworkUpdateCommand */
> +                    unsigned int section, /* virNetworkUpdateSection */
> +                    int parentIndex,
> +                    const char *xml,
> +                    unsigned int flags)  /* virNetworkUpdateFlags */
> +{
> +    int ret = -1;
> +    virNetworkDefPtr def = NULL;
> +
> +    /* normalize config data, and check for common invalid requests. */
> +    if (virNetworkConfigChangeSetup(network, flags) < 0)
> +       goto cleanup;
> +
> +    if (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE) {
> +        /* work on a copy of the def */
> +        if (!(def = virNetworkDefCopy(network->def, 0)))
> +            goto cleanup;
> +        if (virNetworkDefUpdateSection(def, command, section,
> +                                       parentIndex, xml, flags) < 0) {
> +            goto cleanup;
> +        }
> +        /* successfully modified copy, now replace original */
> +        virNetworkDefFree(network->def);
> +        network->def = def;
> +        def = NULL;
> +    }
> +
> +    if (flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG) {
> +        /* work on a copy of the def */
> +        if (!(def = virNetworkDefCopy(virNetworkObjGetPersistentDef(network),
> +                                      VIR_NETWORK_XML_INACTIVE))) {
> +            goto cleanup;
> +        }
> +        if (virNetworkDefUpdateSection(def, command, section,
> +                                       parentIndex, xml, flags) < 0) {
> +            goto cleanup;
> +        }
> +        /* successfully modified copy, now replace original */
> +        if (virNetworkObjReplacePersistentDef(network, def) < 0)
> +           goto cleanup;
> +        def = NULL;
> +    }
> +
> +    ret = 0;
> +cleanup:
> +    virNetworkDefFree(def);
> +    return ret;
> +}
> +
>  /*
>   * virNetworkObjIsDuplicate:
>   * @doms : virNetworkObjListPtr to search
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index 0d37a8b..c8ed2ea 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -326,6 +326,14 @@ int virNetworkSetBridgeName(const virNetworkObjListPtr nets,
>  
>  void virNetworkSetBridgeMacAddr(virNetworkDefPtr def);
>  
> +int
> +virNetworkObjUpdate(virNetworkObjPtr obj,
> +                    unsigned int command, /* virNetworkUpdateCommand */
> +                    unsigned int section, /* virNetworkUpdateSection */
> +                    int parentIndex,
> +                    const char *xml,
> +                    unsigned int flags);  /* virNetworkUpdateFlags */
> +
>  int virNetworkObjIsDuplicate(virNetworkObjListPtr doms,
>                               virNetworkDefPtr def,
>                               unsigned int check_active);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 39e06e4..ec2e544 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -863,6 +863,7 @@ virNetworkObjLock;
>  virNetworkObjReplacePersistentDef;
>  virNetworkObjSetDefTransient;
>  virNetworkObjUnlock;
> +virNetworkObjUpdate;
>  virNetworkRemoveInactive;
>  virNetworkSaveConfig;
>  virNetworkSaveStatus;

  ACK, not functional but put the framework in place,

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