[libvirt] [PATCH 2/4] virDomainInterfaceStats: Accept MAC address too

Michal Privoznik posted 4 patches 7 years, 7 months ago
[libvirt] [PATCH 2/4] virDomainInterfaceStats: Accept MAC address too
Posted by Michal Privoznik 7 years, 7 months ago
https://bugzilla.redhat.com/show_bug.cgi?id=1497396

The other APIs accept both, ifname and MAC address. There's no
reason virDomainInterfaceStats can't do the same.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 include/libvirt/libvirt-domain.h |  2 +-
 src/driver-hypervisor.h          |  2 +-
 src/libvirt-domain.c             | 15 ++++++++-------
 src/libxl/libxl_driver.c         |  8 ++++----
 src/lxc/lxc_driver.c             |  8 ++++----
 src/openvz/openvz_driver.c       |  8 ++++----
 src/qemu/qemu_driver.c           | 10 +++++-----
 src/remote/remote_protocol.x     |  2 +-
 src/remote_protocol-structs      |  2 +-
 src/test/test_driver.c           | 11 ++++++-----
 src/vz/vz_driver.c               |  4 ++--
 src/vz/vz_sdk.c                  |  9 +++++++--
 src/xen/xen_driver.c             | 11 +++++++++--
 tools/virsh.pod                  |  3 ++-
 14 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 030a62c43..ebf47a9bb 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1571,7 +1571,7 @@ int                     virDomainBlockStatsFlags (virDomainPtr dom,
                                                   int *nparams,
                                                   unsigned int flags);
 int                     virDomainInterfaceStats (virDomainPtr dom,
-                                                 const char *path,
+                                                 const char *device,
                                                  virDomainInterfaceStatsPtr stats,
                                                  size_t size);
 
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index 6c3f7d795..4de0581c3 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -486,7 +486,7 @@ typedef int
 
 typedef int
 (*virDrvDomainInterfaceStats)(virDomainPtr domain,
-                              const char *path,
+                              const char *device,
                               virDomainInterfaceStatsPtr stats);
 
 typedef int
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index d2d022a66..34a91d683 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -5507,14 +5507,15 @@ virDomainBlockStatsFlags(virDomainPtr dom,
 /**
  * virDomainInterfaceStats:
  * @dom: pointer to the domain object
- * @path: path to the interface
+ * @device: the interface name or MAC address
  * @stats: network interface stats (returned)
  * @size: size of stats structure
  *
  * This function returns network interface stats for interfaces
  * attached to the domain.
  *
- * The path parameter is the name of the network interface.
+ * The @device parameter is the name of the network interface or
+ * its MAC address.
  *
  * Domains may have more than one network interface.  To get stats for
  * each you should make multiple calls to this function.
@@ -5528,20 +5529,20 @@ virDomainBlockStatsFlags(virDomainPtr dom,
  * Returns: 0 in case of success or -1 in case of failure.
  */
 int
-virDomainInterfaceStats(virDomainPtr dom, const char *path,
+virDomainInterfaceStats(virDomainPtr dom, const char *device,
                         virDomainInterfaceStatsPtr stats, size_t size)
 {
     virConnectPtr conn;
     virDomainInterfaceStatsStruct stats2 = { -1, -1, -1, -1,
                                              -1, -1, -1, -1 };
 
-    VIR_DOMAIN_DEBUG(dom, "path=%s, stats=%p, size=%zi",
-                     path, stats, size);
+    VIR_DOMAIN_DEBUG(dom, "device=%s, stats=%p, size=%zi",
+                     device, stats, size);
 
     virResetLastError();
 
     virCheckDomainReturn(dom, -1);
-    virCheckNonNullArgGoto(path, error);
+    virCheckNonNullArgGoto(device, error);
     virCheckNonNullArgGoto(stats, error);
     if (size > sizeof(stats2)) {
         virReportInvalidArg(size,
@@ -5553,7 +5554,7 @@ virDomainInterfaceStats(virDomainPtr dom, const char *path,
     conn = dom->conn;
 
     if (conn->driver->domainInterfaceStats) {
-        if (conn->driver->domainInterfaceStats(dom, path, &stats2) == -1)
+        if (conn->driver->domainInterfaceStats(dom, device, &stats2) == -1)
             goto error;
 
         memcpy(stats, &stats2, size);
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 8483d6ecf..9db6f3503 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -4956,7 +4956,7 @@ libxlDomainIsUpdated(virDomainPtr dom)
 
 static int
 libxlDomainInterfaceStats(virDomainPtr dom,
-                          const char *path,
+                          const char *device,
                           virDomainInterfaceStatsPtr stats)
 {
     libxlDriverPrivatePtr driver = dom->conn->privateData;
@@ -4979,13 +4979,13 @@ libxlDomainInterfaceStats(virDomainPtr dom,
         goto endjob;
     }
 
-    if (!(net = virDomainNetFindByName(vm->def, path))) {
+    if (!(net = virDomainNetFind(vm->def, device))) {
         virReportError(VIR_ERR_INVALID_ARG,
-                       _("'%s' is not a known interface"), path);
+                       _("'%s' is not a known interface"), device);
         goto endjob;
     }
 
-    if (virNetDevTapInterfaceStats(path, stats,
+    if (virNetDevTapInterfaceStats(device, stats,
                                    !virDomainNetTypeSharesHostView(net)) < 0)
         goto endjob;
 
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 6ad61bdb7..4ab05a7ff 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -2849,7 +2849,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
 
 static int
 lxcDomainInterfaceStats(virDomainPtr dom,
-                        const char *path,
+                        const char *device,
                         virDomainInterfaceStatsPtr stats)
 {
     virDomainObjPtr vm;
@@ -2872,13 +2872,13 @@ lxcDomainInterfaceStats(virDomainPtr dom,
         goto endjob;
     }
 
-    if (!(net = virDomainNetFindByName(vm->def, path))) {
+    if (!(net = virDomainNetFind(vm->def, device))) {
         virReportError(VIR_ERR_INVALID_ARG,
-                       _("Invalid path, '%s' is not a known interface"), path);
+                       _("'%s' is not a known interface"), device);
         goto endjob;
     }
 
-    if (virNetDevTapInterfaceStats(path, stats,
+    if (virNetDevTapInterfaceStats(device, stats,
                                    !virDomainNetTypeSharesHostView(net)) < 0)
         goto endjob;
 
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 11173898d..05ed2bcae 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1980,7 +1980,7 @@ openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason)
 
 static int
 openvzDomainInterfaceStats(virDomainPtr dom,
-                           const char *path,
+                           const char *device,
                            virDomainInterfaceStatsPtr stats)
 {
     struct openvz_driver *driver = dom->conn->privateData;
@@ -2006,13 +2006,13 @@ openvzDomainInterfaceStats(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (!(net = virDomainNetFindByName(vm->def, path))) {
+    if (!(net = virDomainNetFind(vm->def, device))) {
         virReportError(VIR_ERR_INVALID_ARG,
-                       _("invalid path, '%s' is not a known interface"), path);
+                       _("'%s' is not a known interface"), device);
         goto cleanup;
     }
 
-    if (virNetDevTapInterfaceStats(path, stats,
+    if (virNetDevTapInterfaceStats(device, stats,
                                    !virDomainNetTypeSharesHostView(net)) < 0)
         goto cleanup;
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 7c6f1674a..f2cc0f0a5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -11021,7 +11021,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
 
 static int
 qemuDomainInterfaceStats(virDomainPtr dom,
-                         const char *path,
+                         const char *device,
                          virDomainInterfaceStatsPtr stats)
 {
     virDomainObjPtr vm;
@@ -11040,17 +11040,17 @@ qemuDomainInterfaceStats(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (!(net = virDomainNetFindByName(vm->def, path))) {
+    if (!(net = virDomainNetFind(vm->def, device))) {
         virReportError(VIR_ERR_INVALID_ARG,
-                       _("invalid path, '%s' is not a known interface"), path);
+                       _("'%s' is not a known interface"), device);
         goto cleanup;
     }
 
     if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
-        if (virNetDevOpenvswitchInterfaceStats(path, stats) < 0)
+        if (virNetDevOpenvswitchInterfaceStats(device, stats) < 0)
             goto cleanup;
     } else {
-        if (virNetDevTapInterfaceStats(path, stats,
+        if (virNetDevTapInterfaceStats(device, stats,
                                        !virDomainNetTypeSharesHostView(net)) < 0)
             goto cleanup;
     }
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 07463b781..e3014f66b 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -682,7 +682,7 @@ struct remote_domain_block_stats_flags_ret {
 
 struct remote_domain_interface_stats_args {
     remote_nonnull_domain dom;
-    remote_nonnull_string path;
+    remote_nonnull_string device;
 };
 
 struct remote_domain_interface_stats_ret { /* insert@2 */
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 6038bf138..dc78d51c4 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -348,7 +348,7 @@ struct remote_domain_block_stats_flags_ret {
 };
 struct remote_domain_interface_stats_args {
         remote_nonnull_domain      dom;
-        remote_nonnull_string      path;
+        remote_nonnull_string      device;
 };
 struct remote_domain_interface_stats_ret {
         int64_t                    rx_bytes;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index e92768a97..3e286635e 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -3160,9 +3160,10 @@ static int testDomainBlockStats(virDomainPtr domain,
     return ret;
 }
 
-static int testDomainInterfaceStats(virDomainPtr domain,
-                                    const char *path,
-                                    virDomainInterfaceStatsPtr stats)
+static int
+testDomainInterfaceStats(virDomainPtr domain,
+                         const char *device,
+                         virDomainInterfaceStatsPtr stats)
 {
     virDomainObjPtr privdom;
     struct timeval tv;
@@ -3180,9 +3181,9 @@ static int testDomainInterfaceStats(virDomainPtr domain,
         goto error;
     }
 
-    if (!(net = virDomainNetFindByName(privdom->def, path))) {
+    if (!(net = virDomainNetFind(privdom->def, device))) {
         virReportError(VIR_ERR_INVALID_ARG,
-                       _("invalid path, '%s' is not a known interface"), path);
+                       _("'%s' is not a known interface"), device);
         goto error;
     }
 
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
index 9ebb51d60..c33962229 100644
--- a/src/vz/vz_driver.c
+++ b/src/vz/vz_driver.c
@@ -1873,7 +1873,7 @@ vzDomainBlockStatsFlags(virDomainPtr domain,
 
 static int
 vzDomainInterfaceStats(virDomainPtr domain,
-                         const char *path,
+                         const char *device,
                          virDomainInterfaceStatsPtr stats)
 {
     virDomainObjPtr dom = NULL;
@@ -1888,7 +1888,7 @@ vzDomainInterfaceStats(virDomainPtr domain,
 
     privdom = dom->privateData;
 
-    ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, path, stats);
+    ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, device, stats);
 
  cleanup:
     virDomainObjEndAPI(&dom);
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 6ead47a0f..5f377147c 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -4484,7 +4484,7 @@ prlsdkFindNetByPath(PRL_HANDLE sdkdom, const char *path)
 }
 
 int
-prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path,
+prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *device,
                   virDomainInterfaceStatsPtr stats)
 {
     int ret = -1;
@@ -4492,8 +4492,13 @@ prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path,
     char *name = NULL;
     PRL_RESULT pret;
     PRL_HANDLE net = PRL_INVALID_HANDLE;
+    virMacAddr mac;
+
+    if (virMacAddrParse(device, &mac) == 0)
+        net = prlsdkFindNetByMAC(sdkdom, device);
+    else
+        net = prlsdkFindNetByPath(sdkdom, device);
 
-    net = prlsdkFindNetByPath(sdkdom, path);
     if (net == PRL_INVALID_HANDLE)
        goto cleanup;
 
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index dae0f4f28..4235ca0ce 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -2109,10 +2109,11 @@ xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path,
 }
 
 static int
-xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
+xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *device,
                                virDomainInterfaceStatsPtr stats)
 {
     virDomainDefPtr def = NULL;
+    virDomainNetDefPtr net = NULL;
     int ret = -1;
 
     if (!(def = xenGetDomainDefForDom(dom)))
@@ -2121,7 +2122,13 @@ xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
     if (virDomainInterfaceStatsEnsureACL(dom->conn, def) < 0)
         goto cleanup;
 
-    ret = xenHypervisorDomainInterfaceStats(def, path, stats);
+    if (!(net = virDomainNetFind(def, device))) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("'%s' is not a known interface"), device);
+        goto cleanup;
+    }
+
+    ret = xenHypervisorDomainInterfaceStats(def, net->ifname, stats);
 
  cleanup:
     virDomainDefFree(def);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 632f202e8..d21c5df72 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -777,7 +777,8 @@ the guest OS via an agent. If unspecified, 'lease' is the default.
 
 Get network interface stats for a running domain. This might be
 unavailable for some types of interface which don't have
-representation in the host, e.g. user.
+representation in the host, e.g. user. I<interface-device> can be
+the interface's target name or the MAC address.
 
 =item B<domif-setlink> I<domain> I<interface-device> I<state> [I<--config>]
 
-- 
2.13.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/4] virDomainInterfaceStats: Accept MAC address too
Posted by John Ferlan 7 years, 7 months ago

On 10/05/2017 10:18 AM, Michal Privoznik wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1497396
> 
> The other APIs accept both, ifname and MAC address. There's no
> reason virDomainInterfaceStats can't do the same.
> 
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  include/libvirt/libvirt-domain.h |  2 +-
>  src/driver-hypervisor.h          |  2 +-
>  src/libvirt-domain.c             | 15 ++++++++-------
>  src/libxl/libxl_driver.c         |  8 ++++----
>  src/lxc/lxc_driver.c             |  8 ++++----
>  src/openvz/openvz_driver.c       |  8 ++++----
>  src/qemu/qemu_driver.c           | 10 +++++-----
>  src/remote/remote_protocol.x     |  2 +-
>  src/remote_protocol-structs      |  2 +-
>  src/test/test_driver.c           | 11 ++++++-----
>  src/vz/vz_driver.c               |  4 ++--
>  src/vz/vz_sdk.c                  |  9 +++++++--
>  src/xen/xen_driver.c             | 11 +++++++++--
>  tools/virsh.pod                  |  3 ++-
>  14 files changed, 55 insertions(+), 40 deletions(-)
> 

Order-wise - I think patch 4 should go after patch 1. That way this
patch doesn't need all those error messages adjusted - they can just be
removed when calling virDomainNetFind since it would already provide the
message.


> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 030a62c43..ebf47a9bb 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -1571,7 +1571,7 @@ int                     virDomainBlockStatsFlags (virDomainPtr dom,
>                                                    int *nparams,
>                                                    unsigned int flags);
>  int                     virDomainInterfaceStats (virDomainPtr dom,
> -                                                 const char *path,
> +                                                 const char *device,
>                                                   virDomainInterfaceStatsPtr stats,
>                                                   size_t size);
>  
> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
> index 6c3f7d795..4de0581c3 100644
> --- a/src/driver-hypervisor.h
> +++ b/src/driver-hypervisor.h
> @@ -486,7 +486,7 @@ typedef int
>  
>  typedef int
>  (*virDrvDomainInterfaceStats)(virDomainPtr domain,
> -                              const char *path,
> +                              const char *device,
>                                virDomainInterfaceStatsPtr stats);
>  
>  typedef int
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index d2d022a66..34a91d683 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -5507,14 +5507,15 @@ virDomainBlockStatsFlags(virDomainPtr dom,
>  /**
>   * virDomainInterfaceStats:
>   * @dom: pointer to the domain object
> - * @path: path to the interface
> + * @device: the interface name or MAC address
>   * @stats: network interface stats (returned)
>   * @size: size of stats structure
>   *
>   * This function returns network interface stats for interfaces
>   * attached to the domain.
>   *
> - * The path parameter is the name of the network interface.
> + * The @device parameter is the name of the network interface or
> + * its MAC address.

The @device parameter is the network interface either by name or MAC
addresss.

>   *
>   * Domains may have more than one network interface.  To get stats for
>   * each you should make multiple calls to this function.
> @@ -5528,20 +5529,20 @@ virDomainBlockStatsFlags(virDomainPtr dom,
>   * Returns: 0 in case of success or -1 in case of failure.
>   */
>  int
> -virDomainInterfaceStats(virDomainPtr dom, const char *path,
> +virDomainInterfaceStats(virDomainPtr dom, const char *device,
>                          virDomainInterfaceStatsPtr stats, size_t size)
>  {
>      virConnectPtr conn;
>      virDomainInterfaceStatsStruct stats2 = { -1, -1, -1, -1,
>                                               -1, -1, -1, -1 };
>  
> -    VIR_DOMAIN_DEBUG(dom, "path=%s, stats=%p, size=%zi",
> -                     path, stats, size);
> +    VIR_DOMAIN_DEBUG(dom, "device=%s, stats=%p, size=%zi",
> +                     device, stats, size);
>  
>      virResetLastError();
>  
>      virCheckDomainReturn(dom, -1);
> -    virCheckNonNullArgGoto(path, error);
> +    virCheckNonNullArgGoto(device, error);
>      virCheckNonNullArgGoto(stats, error);
>      if (size > sizeof(stats2)) {
>          virReportInvalidArg(size,
> @@ -5553,7 +5554,7 @@ virDomainInterfaceStats(virDomainPtr dom, const char *path,
>      conn = dom->conn;
>  
>      if (conn->driver->domainInterfaceStats) {
> -        if (conn->driver->domainInterfaceStats(dom, path, &stats2) == -1)
> +        if (conn->driver->domainInterfaceStats(dom, device, &stats2) == -1)
>              goto error;
>  
>          memcpy(stats, &stats2, size);
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 8483d6ecf..9db6f3503 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -4956,7 +4956,7 @@ libxlDomainIsUpdated(virDomainPtr dom)
>  
>  static int
>  libxlDomainInterfaceStats(virDomainPtr dom,
> -                          const char *path,
> +                          const char *device,
>                            virDomainInterfaceStatsPtr stats)
>  {
>      libxlDriverPrivatePtr driver = dom->conn->privateData;
> @@ -4979,13 +4979,13 @@ libxlDomainInterfaceStats(virDomainPtr dom,
>          goto endjob;
>      }
>  
> -    if (!(net = virDomainNetFindByName(vm->def, path))) {
> +    if (!(net = virDomainNetFind(vm->def, device))) {
>          virReportError(VIR_ERR_INVALID_ARG,
> -                       _("'%s' is not a known interface"), path);
> +                       _("'%s' is not a known interface"), device);

If you adjust the order of patches, then message just gets deleted.

>          goto endjob;
>      }
>  
> -    if (virNetDevTapInterfaceStats(path, stats,
> +    if (virNetDevTapInterfaceStats(device, stats,
>                                     !virDomainNetTypeSharesHostView(net)) < 0)
>          goto endjob;
>  
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 6ad61bdb7..4ab05a7ff 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2849,7 +2849,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
>  
>  static int
>  lxcDomainInterfaceStats(virDomainPtr dom,
> -                        const char *path,
> +                        const char *device,
>                          virDomainInterfaceStatsPtr stats)
>  {
>      virDomainObjPtr vm;
> @@ -2872,13 +2872,13 @@ lxcDomainInterfaceStats(virDomainPtr dom,
>          goto endjob;
>      }
>  
> -    if (!(net = virDomainNetFindByName(vm->def, path))) {
> +    if (!(net = virDomainNetFind(vm->def, device))) {
>          virReportError(VIR_ERR_INVALID_ARG,
> -                       _("Invalid path, '%s' is not a known interface"), path);
> +                       _("'%s' is not a known interface"), device);

Same...

>          goto endjob;
>      }
>  
> -    if (virNetDevTapInterfaceStats(path, stats,
> +    if (virNetDevTapInterfaceStats(device, stats,
>                                     !virDomainNetTypeSharesHostView(net)) < 0)
>          goto endjob;
>  
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 11173898d..05ed2bcae 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -1980,7 +1980,7 @@ openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason)
>  
>  static int
>  openvzDomainInterfaceStats(virDomainPtr dom,
> -                           const char *path,
> +                           const char *device,
>                             virDomainInterfaceStatsPtr stats)
>  {
>      struct openvz_driver *driver = dom->conn->privateData;
> @@ -2006,13 +2006,13 @@ openvzDomainInterfaceStats(virDomainPtr dom,
>          goto cleanup;
>      }
>  
> -    if (!(net = virDomainNetFindByName(vm->def, path))) {
> +    if (!(net = virDomainNetFind(vm->def, device))) {
>          virReportError(VIR_ERR_INVALID_ARG,
> -                       _("invalid path, '%s' is not a known interface"), path);
> +                       _("'%s' is not a known interface"), device);

Same...

>          goto cleanup;
>      }
>  
> -    if (virNetDevTapInterfaceStats(path, stats,
> +    if (virNetDevTapInterfaceStats(device, stats,
>                                     !virDomainNetTypeSharesHostView(net)) < 0)
>          goto cleanup;
>  
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 7c6f1674a..f2cc0f0a5 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11021,7 +11021,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
>  
>  static int
>  qemuDomainInterfaceStats(virDomainPtr dom,
> -                         const char *path,
> +                         const char *device,
>                           virDomainInterfaceStatsPtr stats)
>  {
>      virDomainObjPtr vm;
> @@ -11040,17 +11040,17 @@ qemuDomainInterfaceStats(virDomainPtr dom,
>          goto cleanup;
>      }
>  
> -    if (!(net = virDomainNetFindByName(vm->def, path))) {
> +    if (!(net = virDomainNetFind(vm->def, device))) {
>          virReportError(VIR_ERR_INVALID_ARG,
> -                       _("invalid path, '%s' is not a known interface"), path);
> +                       _("'%s' is not a known interface"), device);

Same.

>          goto cleanup;
>      }
>  
>      if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
> -        if (virNetDevOpenvswitchInterfaceStats(path, stats) < 0)
> +        if (virNetDevOpenvswitchInterfaceStats(device, stats) < 0)
>              goto cleanup;
>      } else {
> -        if (virNetDevTapInterfaceStats(path, stats,
> +        if (virNetDevTapInterfaceStats(device, stats,
>                                         !virDomainNetTypeSharesHostView(net)) < 0)
>              goto cleanup;
>      }
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 07463b781..e3014f66b 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -682,7 +682,7 @@ struct remote_domain_block_stats_flags_ret {
>  
>  struct remote_domain_interface_stats_args {
>      remote_nonnull_domain dom;
> -    remote_nonnull_string path;
> +    remote_nonnull_string device;
>  };
>  
>  struct remote_domain_interface_stats_ret { /* insert@2 */
> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
> index 6038bf138..dc78d51c4 100644
> --- a/src/remote_protocol-structs
> +++ b/src/remote_protocol-structs
> @@ -348,7 +348,7 @@ struct remote_domain_block_stats_flags_ret {
>  };
>  struct remote_domain_interface_stats_args {
>          remote_nonnull_domain      dom;
> -        remote_nonnull_string      path;
> +        remote_nonnull_string      device;
>  };
>  struct remote_domain_interface_stats_ret {
>          int64_t                    rx_bytes;
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index e92768a97..3e286635e 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -3160,9 +3160,10 @@ static int testDomainBlockStats(virDomainPtr domain,
>      return ret;
>  }
>  
> -static int testDomainInterfaceStats(virDomainPtr domain,
> -                                    const char *path,
> -                                    virDomainInterfaceStatsPtr stats)
> +static int
> +testDomainInterfaceStats(virDomainPtr domain,
> +                         const char *device,
> +                         virDomainInterfaceStatsPtr stats)
>  {
>      virDomainObjPtr privdom;
>      struct timeval tv;
> @@ -3180,9 +3181,9 @@ static int testDomainInterfaceStats(virDomainPtr domain,
>          goto error;
>      }
>  
> -    if (!(net = virDomainNetFindByName(privdom->def, path))) {
> +    if (!(net = virDomainNetFind(privdom->def, device))) {
>          virReportError(VIR_ERR_INVALID_ARG,
> -                       _("invalid path, '%s' is not a known interface"), path);
> +                       _("'%s' is not a known interface"), device);

Same...

>          goto error;
>      }
>  
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index 9ebb51d60..c33962229 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -1873,7 +1873,7 @@ vzDomainBlockStatsFlags(virDomainPtr domain,
>  
>  static int
>  vzDomainInterfaceStats(virDomainPtr domain,
> -                         const char *path,
> +                         const char *device,
>                           virDomainInterfaceStatsPtr stats)
>  {
>      virDomainObjPtr dom = NULL;
> @@ -1888,7 +1888,7 @@ vzDomainInterfaceStats(virDomainPtr domain,
>  
>      privdom = dom->privateData;
>  
> -    ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, path, stats);
> +    ret = prlsdkGetNetStats(privdom->stats, privdom->sdkdom, device, stats);
>  
>   cleanup:
>      virDomainObjEndAPI(&dom);
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index 6ead47a0f..5f377147c 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -4484,7 +4484,7 @@ prlsdkFindNetByPath(PRL_HANDLE sdkdom, const char *path)
>  }
>  
>  int
> -prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path,
> +prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *device,
>                    virDomainInterfaceStatsPtr stats)
>  {
>      int ret = -1;
> @@ -4492,8 +4492,13 @@ prlsdkGetNetStats(PRL_HANDLE sdkstats, PRL_HANDLE sdkdom, const char *path,
>      char *name = NULL;
>      PRL_RESULT pret;
>      PRL_HANDLE net = PRL_INVALID_HANDLE;
> +    virMacAddr mac;
> +
> +    if (virMacAddrParse(device, &mac) == 0)
> +        net = prlsdkFindNetByMAC(sdkdom, device);
> +    else
> +        net = prlsdkFindNetByPath(sdkdom, device);
>  
> -    net = prlsdkFindNetByPath(sdkdom, path);
>      if (net == PRL_INVALID_HANDLE)
>         goto cleanup;
>  
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index dae0f4f28..4235ca0ce 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -2109,10 +2109,11 @@ xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path,
>  }
>  
>  static int
> -xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
> +xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *device,
>                                 virDomainInterfaceStatsPtr stats)
>  {
>      virDomainDefPtr def = NULL;
> +    virDomainNetDefPtr net = NULL;
>      int ret = -1;
>  
>      if (!(def = xenGetDomainDefForDom(dom)))
> @@ -2121,7 +2122,13 @@ xenUnifiedDomainInterfaceStats(virDomainPtr dom, const char *path,
>      if (virDomainInterfaceStatsEnsureACL(dom->conn, def) < 0)
>          goto cleanup;
>  
> -    ret = xenHypervisorDomainInterfaceStats(def, path, stats);
> +    if (!(net = virDomainNetFind(def, device))) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("'%s' is not a known interface"), device);

Same...

> +        goto cleanup;
> +    }
> +
> +    ret = xenHypervisorDomainInterfaceStats(def, net->ifname, stats);
>  
>   cleanup:
>      virDomainDefFree(def);
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 632f202e8..d21c5df72 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -777,7 +777,8 @@ the guest OS via an agent. If unspecified, 'lease' is the default.
>  
>  Get network interface stats for a running domain. This might be
>  unavailable for some types of interface which don't have
> -representation in the host, e.g. user.
> +representation in the host, e.g. user. I<interface-device> can be
> +the interface's target name or the MAC address.

the interface target by name or MAC address.

With ordering adjustment....

Reviewed-by: John Ferlan <jferlan@redhat.com>

John

>  
>  =item B<domif-setlink> I<domain> I<interface-device> I<state> [I<--config>]
>  
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/4] virDomainInterfaceStats: Accept MAC address too
Posted by Michal Privoznik 7 years, 7 months ago
On 10/13/2017 10:45 AM, John Ferlan wrote:
> 
> 
> On 10/05/2017 10:18 AM, Michal Privoznik wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1497396
>>
>> The other APIs accept both, ifname and MAC address. There's no
>> reason virDomainInterfaceStats can't do the same.
>>
>> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
>> ---
>>  include/libvirt/libvirt-domain.h |  2 +-
>>  src/driver-hypervisor.h          |  2 +-
>>  src/libvirt-domain.c             | 15 ++++++++-------
>>  src/libxl/libxl_driver.c         |  8 ++++----
>>  src/lxc/lxc_driver.c             |  8 ++++----
>>  src/openvz/openvz_driver.c       |  8 ++++----
>>  src/qemu/qemu_driver.c           | 10 +++++-----
>>  src/remote/remote_protocol.x     |  2 +-
>>  src/remote_protocol-structs      |  2 +-
>>  src/test/test_driver.c           | 11 ++++++-----
>>  src/vz/vz_driver.c               |  4 ++--
>>  src/vz/vz_sdk.c                  |  9 +++++++--
>>  src/xen/xen_driver.c             | 11 +++++++++--
>>  tools/virsh.pod                  |  3 ++-
>>  14 files changed, 55 insertions(+), 40 deletions(-)
>>
> 
> Order-wise - I think patch 4 should go after patch 1. That way this
> patch doesn't need all those error messages adjusted - they can just be
> removed when calling virDomainNetFind since it would already provide the
> message.
> 
> 

> 
> With ordering adjustment....

Ah, okay. I'll fix the ordering then.

> 
> Reviewed-by: John Ferlan <jferlan@redhat.com>

Thanks,

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list