[libvirt] [PATCH 2/3] Support reporting live interface IP/netmask.
Daniel P. Berrange
berrange at redhat.com
Fri Oct 23 16:22:53 UTC 2009
On Fri, Oct 16, 2009 at 10:56:18AM -0400, laine at laine.org wrote:
> From: Laine Stump <laine at laine.org>
>
> This patch adds the flag VIR_INTERFACE_XML_INACTIVE to
> virInterfaceGetXMLDesc's flags. When it is*not* set (the default), the
> live interface info will be returned in the XML (in particular, the IP
> address(es) and netmask(s) will be retrieved by querying the interface
> directly, rather than reporting what's in the config file). The
> backend of this is in netcf's ncf_if_xml_state() function.
>
> Note that after this patch is applied, netcf support will be omitted
> from the build unless you have netcf-devel-0.1.3 or better installed.
> ---
> configure.in | 2 +-
> include/libvirt/libvirt.h.in | 4 +++
> libvirt.spec.in | 2 +-
> src/conf/interface_conf.c | 53 +++++++++++++++++++-----------------------
> src/interface/netcf_driver.c | 8 ++++-
> src/libvirt.c | 15 ++++++++---
> tools/virsh.c | 10 ++++++-
> 7 files changed, 55 insertions(+), 39 deletions(-)
>
> diff --git a/configure.in b/configure.in
> index 2f9db72..3402b4f 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -33,7 +33,7 @@ GNUTLS_REQUIRED="1.0.25"
> AVAHI_REQUIRED="0.6.0"
> POLKIT_REQUIRED="0.6"
> PARTED_REQUIRED="1.8.0"
> -NETCF_REQUIRED="0.0.1"
> +NETCF_REQUIRED="0.1.3"
>
> dnl Checks for C compiler.
> AC_PROG_CC
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 6186d4e..7e75bee 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -930,6 +930,10 @@ virInterfacePtr virInterfaceLookupByMACString (virConnectPtr conn,
> const char* virInterfaceGetName (virInterfacePtr iface);
> const char* virInterfaceGetMACString (virInterfacePtr iface);
>
> +typedef enum {
> + VIR_INTERFACE_XML_INACTIVE = 1 /* dump inactive interface information */
> +} virInterfaceXMLFlags;
> +
> char * virInterfaceGetXMLDesc (virInterfacePtr iface,
> unsigned int flags);
> virInterfacePtr virInterfaceDefineXML (virConnectPtr conn,
> diff --git a/libvirt.spec.in b/libvirt.spec.in
> index 6cd0888..32596d4 100644
> --- a/libvirt.spec.in
> +++ b/libvirt.spec.in
> @@ -308,7 +308,7 @@ BuildRequires: libcap-ng-devel >= 0.5.0
> BuildRequires: libssh2-devel
> %endif
> %if %{with_netcf}
> -BuildRequires: netcf-devel
> +BuildRequires: netcf-devel >= 0.1.3
> %endif
>
> # Fedora build root suckage
> diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
> index 540c931..d46f7ac 100644
> --- a/src/conf/interface_conf.c
> +++ b/src/conf/interface_conf.c
> @@ -279,22 +279,19 @@ virInterfaceDefParseIp(virConnectPtr conn, virInterfaceDefPtr def,
> static int
> virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceDefPtr def,
> xmlXPathContextPtr ctxt) {
> - xmlNodePtr cur;
> - int ret;
> + xmlNodePtr dhcp, ip;
> + int ret = 0;
>
> - cur = virXPathNode(conn, "./dhcp", ctxt);
> - if (cur != NULL)
> - ret = virInterfaceDefParseDhcp(conn, def, cur, ctxt);
> - else {
> - cur = virXPathNode(conn, "./ip", ctxt);
> - if (cur != NULL)
> - ret = virInterfaceDefParseIp(conn, def, cur, ctxt);
> - else {
> - virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
> - "%s", _("interface miss dhcp or ip adressing"));
> - ret = -1;
> - }
> - }
> + dhcp = virXPathNode(conn, "./dhcp", ctxt);
> + if (dhcp != NULL)
> + ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt);
> +
> + if (ret != 0)
> + return(ret);
> +
> + ip = virXPathNode(conn, "./ip", ctxt);
> + if (ip != NULL)
> + ret = virInterfaceDefParseIp(conn, def, ip, ctxt);
> return(ret);
> }
>
> @@ -1012,20 +1009,18 @@ virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
> virBufferAddLit(buf, " <dhcp peerdns='yes'/>\n");
> else
> virBufferAddLit(buf, " <dhcp/>\n");
> - } else {
> - /* theorically if we don't have dhcp we should have an address */
> - if (def->proto.address != NULL) {
> - if (def->proto.prefix != 0)
> - virBufferVSprintf(buf, " <ip address='%s' prefix='%d'/>\n",
> - def->proto.address, def->proto.prefix);
> - else
> - virBufferVSprintf(buf, " <ip address='%s'/>\n",
> - def->proto.address);
> - }
> - if (def->proto.gateway != NULL) {
> - virBufferVSprintf(buf, " <route gateway='%s'/>\n",
> - def->proto.gateway);
> - }
> + }
> + if (def->proto.address != NULL) {
> + if (def->proto.prefix != 0)
> + virBufferVSprintf(buf, " <ip address='%s' prefix='%d'/>\n",
> + def->proto.address, def->proto.prefix);
> + else
> + virBufferVSprintf(buf, " <ip address='%s'/>\n",
> + def->proto.address);
> + }
> + if (def->proto.gateway != NULL) {
> + virBufferVSprintf(buf, " <route gateway='%s'/>\n",
> + def->proto.gateway);
> }
> virBufferAddLit(buf, " </protocol>\n");
> return(0);
> diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c
> index ca14fb0..b5c3664 100644
> --- a/src/interface/netcf_driver.c
> +++ b/src/interface/netcf_driver.c
> @@ -326,7 +326,7 @@ cleanup:
> }
>
> static char *interfaceGetXMLDesc(virInterfacePtr ifinfo,
> - unsigned int flags ATTRIBUTE_UNUSED)
> + unsigned int flags)
> {
> struct interface_driver *driver = ifinfo->conn->interfacePrivateData;
> struct netcf_if *iface = NULL;
> @@ -342,7 +342,11 @@ static char *interfaceGetXMLDesc(virInterfacePtr ifinfo,
> goto cleanup;
> }
>
> - xmlstr = ncf_if_xml_desc(iface);
> + if ((flags & VIR_INTERFACE_XML_INACTIVE)) {
> + xmlstr = ncf_if_xml_desc(iface);
> + } else {
> + xmlstr = ncf_if_xml_state(iface);
> + }
> if (!xmlstr) {
> const char *errmsg, *details;
> int errcode = ncf_error(driver->netcf, &errmsg, &details);
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 92a1eaa..c7d6bcc 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -6198,10 +6198,17 @@ virInterfaceGetMACString(virInterfacePtr iface)
> /**
> * virInterfaceGetXMLDesc:
> * @iface: an interface object
> - * @flags: an OR'ed set of extraction flags, not used yet
> + * @flags: an OR'ed set of extraction flags. Current valid bits:
> + *
> + * VIR_INTERFACE_XML_INACTIVE - return the static configuration,
> + * suitable for use redefining the
> + * interface via virInterfaceDefineXML()
> *
> - * Provide an XML description of the interface. The description may be reused
> - * later to redefine the interface with virInterfaceDefineXML().
> + * Provide an XML description of the interface. If
> + * VIR_INTERFACE_XML_INACTIVE is set, the description may be reused
> + * later to redefine the interface with virInterfaceDefineXML(). If it
> + * is not set, the ip address and netmask will be the current live
> + * setting of the interface, not the settings from the config files.
> *
> * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
> * the caller must free() the returned value.
> @@ -6218,7 +6225,7 @@ virInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)
> virLibInterfaceError(NULL, VIR_ERR_INVALID_INTERFACE, __FUNCTION__);
> return (NULL);
> }
> - if (flags != 0) {
> + if ((flags & ~VIR_INTERFACE_XML_INACTIVE) != 0) {
> virLibInterfaceError(iface, VIR_ERR_INVALID_ARG, __FUNCTION__);
> goto error;
> }
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 47122d5..322de30 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -2792,7 +2792,7 @@ cmdInterfaceEdit (vshControl *ctl, const vshCmd *cmd)
> char *doc = NULL;
> char *doc_edited = NULL;
> char *doc_reread = NULL;
> - int flags = 0;
> + int flags = VIR_INTERFACE_XML_INACTIVE;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> goto cleanup;
> @@ -3326,6 +3326,7 @@ static const vshCmdInfo info_interface_dumpxml[] = {
>
> static const vshCmdOptDef opts_interface_dumpxml[] = {
> {"interface", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("interface name or MAC address")},
> + {"inactive", VSH_OT_BOOL, 0, gettext_noop("show inactive defined XML")},
> {NULL, 0, 0, NULL}
> };
>
> @@ -3335,6 +3336,11 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd)
> virInterfacePtr iface;
> int ret = TRUE;
> char *dump;
> + int flags = 0;
> + int inactive = vshCommandOptBool(cmd, "inactive");
> +
> + if (inactive)
> + flags |= VIR_INTERFACE_XML_INACTIVE;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> return FALSE;
> @@ -3342,7 +3348,7 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd)
> if (!(iface = vshCommandOptInterface(ctl, cmd, NULL)))
> return FALSE;
>
> - dump = virInterfaceGetXMLDesc(iface, 0);
> + dump = virInterfaceGetXMLDesc(iface, flags);
> if (dump != NULL) {
> printf("%s", dump);
> free(dump);
> --
ACK
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list