[libvirt] [PATCHv2 6/9] network: implement virNetworkUpdate for bridge_driver

Daniel Veillard veillard at redhat.com
Tue Sep 18 08:00:46 UTC 2012


On Tue, Sep 18, 2012 at 03:39:02AM -0400, Laine Stump wrote:
> Call the network_conf function that modifies the live/persistent/both
> config, then refresh/restart dnsmasq/radvd if necessary, and finally
> save the config in the proper place(s).
> 
> This patch also needed to uncomment a few utility functions that were
> added inside #if 0 in the previous commit (to avoid compiler errors
> due to unreferenced static functions).
> ---
>  src/network/bridge_driver.c | 120 +++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 112 insertions(+), 8 deletions(-)
> 
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 5f7f31e..252c964 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -468,8 +468,6 @@ networkShutdown(void) {
>  }
>  
>  
> -#if 0
> -/* currently unused, so it causes a build error unless we #if it out */
>  /* networkKillDaemon:
>   *
>   * kill the specified pid/name, and wait a bit to make sure it's dead.
> @@ -528,7 +526,6 @@ networkKillDaemon(pid_t pid, const char *daemonName, const char *networkName)
>  cleanup:
>      return ret;
>  }
> -#endif /* #if 0 */
>  
>  static int
>  networkBuildDnsmasqHostsfile(dnsmasqContext *dctx,
> @@ -908,8 +905,6 @@ cleanup:
>      return ret;
>  }
>  
> -#if 0
> -/* currently unused, so they cause a build error unless we #if them out */
>  /* networkRefreshDhcpDaemon:
>   *  Update dnsmasq config files, then send a SIGHUP so that it rereads
>   *  them.
> @@ -978,7 +973,6 @@ networkRestartDhcpDaemon(virNetworkObjPtr network)
>      /* now start dnsmasq if it should be started */
>      return networkStartDhcpDaemon(network);
>  }
> -#endif /* #if 0 */
>  
>  static int
>  networkRadvdConfContents(virNetworkObjPtr network, char **configstr)
> @@ -1171,8 +1165,6 @@ cleanup:
>      return ret;
>  }
>  
> -#if 0
> -/* currently unused, so they cause a build error unless we #if them out */
>  static int
>  networkRefreshRadvd(virNetworkObjPtr network)
>  {
> @@ -1191,6 +1183,8 @@ networkRefreshRadvd(virNetworkObjPtr network)
>      return kill(network->radvdPid, SIGHUP);
>  }
>  
> +#if 0
> +/* currently unused, so it causes a build error unless we #if it out */
>  static int
>  networkRestartRadvd(virNetworkObjPtr network)
>  {
> @@ -2830,6 +2824,115 @@ cleanup:
>      return ret;
>  }
>  
> +static int
> +networkUpdate(virNetworkPtr net,
> +              unsigned int command,
> +              unsigned int section,
> +              int parentIndex,
> +              const char *xml,
> +              unsigned int flags)
> +{
> +    struct network_driver *driver = net->conn->networkPrivateData;
> +    virNetworkObjPtr network = NULL;
> +    int isActive, ret = -1;
> +
> +    virCheckFlags(VIR_NETWORK_UPDATE_AFFECT_LIVE |
> +                  VIR_NETWORK_UPDATE_AFFECT_CONFIG,
> +                  -1);
> +
> +    networkDriverLock(driver);
> +
> +    network = virNetworkFindByUUID(&driver->networks, net->uuid);
> +    if (!network) {
> +        virReportError(VIR_ERR_NO_NETWORK,
> +                       "%s", _("no network with matching uuid"));
> +        goto cleanup;
> +    }
> +
> +    /* VIR_NETWORK_UPDATE_AFFECT_CURRENT means "change LIVE if network
> +     * is active, else change CONFIG
> +    */
> +    isActive = virNetworkObjIsActive(network);
> +    if ((flags & (VIR_NETWORK_UPDATE_AFFECT_LIVE
> +                   | VIR_NETWORK_UPDATE_AFFECT_CONFIG)) ==
> +        VIR_NETWORK_UPDATE_AFFECT_CURRENT) {
> +        if (isActive)
> +            flags |= VIR_NETWORK_UPDATE_AFFECT_LIVE;
> +        else
> +            flags |= VIR_NETWORK_UPDATE_AFFECT_CONFIG;
> +    }
> +
> +    /* update the network config in memory/on disk */
> +    if (virNetworkObjUpdate(network, command, section, parentIndex, xml, flags) < 0)
> +        goto cleanup;
> +
> +    if (flags & VIR_NETWORK_UPDATE_AFFECT_CONFIG) {
> +        /* save updated persistent config to disk */
> +        if (virNetworkSaveConfig(driver->networkConfigDir,
> +                                 virNetworkObjGetPersistentDef(network)) < 0) {
> +            goto cleanup;
> +        }
> +    }
> +
> +    if (isActive && (flags & VIR_NETWORK_UPDATE_AFFECT_LIVE)) {
> +        /* rewrite dnsmasq host files, restart dnsmasq, update iptables
> +         * rules, etc, according to which section was modified. Note that
> +         * some sections require multiple actions, so a single switch
> +         * statement is inadequate.
> +         */
> +        if (section == VIR_NETWORK_SECTION_BRIDGE ||
> +            section == VIR_NETWORK_SECTION_DOMAIN ||
> +            section == VIR_NETWORK_SECTION_IP ||
> +            section == VIR_NETWORK_SECTION_IP_DHCP_RANGE) {
> +            /* these sections all change things on the dnsmasq commandline,
> +             * so we need to kill and restart dnsmasq.
> +             */
> +            if (networkRestartDhcpDaemon(network) < 0)
> +                goto cleanup;
> +
> +        } else if (section == VIR_NETWORK_SECTION_IP_DHCP_HOST ||
> +                   section == VIR_NETWORK_SECTION_DNS_HOST ||
> +                   section == VIR_NETWORK_SECTION_DNS_TXT ||
> +                   section == VIR_NETWORK_SECTION_DNS_SRV) {
> +            /* these sections only change things in config files, so we
> +             * can just update the config files and send SIGHUP to
> +             * dnsmasq.
> +             */
> +            if (networkRefreshDhcpDaemon(network) < 0)
> +                goto cleanup;
> +
> +        }
> +
> +        if (section == VIR_NETWORK_SECTION_IP) {
> +            /* only a change in IP addresses will affect radvd, and all of radvd's
> +             * config is stored in the conf file which will be re-read with a SIGHUP.
> +             */
> +            if (networkRefreshRadvd(network) < 0)
> +                goto cleanup;
> +        }
> +
> +        if (section == VIR_NETWORK_SECTION_IP ||
> +            section == VIR_NETWORK_SECTION_FORWARD ||
> +            section == VIR_NETWORK_SECTION_FORWARD_INTERFACE) {
> +            /* these could affect the iptables rules */
> +            networkRemoveIptablesRules(driver, network);
> +            if (networkAddIptablesRules(driver, network) < 0)
> +                goto cleanup;
> +
> +        }
> +
> +        /* save current network state to disk */
> +        if ((ret = virNetworkSaveStatus(NETWORK_STATE_DIR, network)) < 0)
> +            goto cleanup;
> +    }
> +    ret = 0;
> +cleanup:
> +    if (network)
> +        virNetworkObjUnlock(network);
> +    networkDriverUnlock(driver);
> +    return ret;
> +}
> +
>  static int networkStart(virNetworkPtr net) {
>      struct network_driver *driver = net->conn->networkPrivateData;
>      virNetworkObjPtr network;
> @@ -3057,6 +3160,7 @@ static virNetworkDriver networkDriver = {
>      .networkCreateXML = networkCreate, /* 0.2.0 */
>      .networkDefineXML = networkDefine, /* 0.2.0 */
>      .networkUndefine = networkUndefine, /* 0.2.0 */
> +    .networkUpdate = networkUpdate, /* 0.10.2 */
>      .networkCreate = networkStart, /* 0.2.0 */
>      .networkDestroy = networkDestroy, /* 0.2.0 */
>      .networkGetXMLDesc = networkGetXMLDesc, /* 0.2.0 */
> -- 

ACK,

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