On Fri, Apr 20, 2012 at 12:01:51PM -0400, Laine Stump wrote:
On 04/19/2012 06:32 PM, Guido Günther wrote:
> This will only work for veth devices since venet devices don't have
> a target element.
Well, there is precedent for having stats work on some types of
interfaces and not on others - type='user' interfaces in qemu also don't
get stats (as the gnome-boxes guys found out, much to their
disappointment). (Anyway, my point is that this shouldn't stop us from
enabling stats for those interfaces we *can* support :-)
> ---
> src/openvz/openvz_driver.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 52 insertions(+)
>
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 7ec327d..e8b6915 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -57,6 +57,7 @@
> #include "logging.h"
> #include "command.h"
> #include "viruri.h"
> +#include "stats_linux.h"
>
> #define VIR_FROM_THIS VIR_FROM_OPENVZ
>
> @@ -1672,6 +1673,56 @@ cleanup:
> return ret;
> }
>
> +static int
> +openvzDomainInterfaceStats (virDomainPtr dom,
> + const char *path,
> + struct _virDomainInterfaceStats *stats)
> +{
> + struct openvz_driver *driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + int i;
> + int ret = -1;
> +
> + openvzDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> + openvzDriverUnlock(driver);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(dom->uuid, uuidstr);
> + openvzError(VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"),
uuidstr);
> + goto cleanup;
> + }
> +
> + if (!virDomainObjIsActive(vm)) {
> + openvzError(VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto cleanup;
> + }
> +
> + /* Check the path is one of the domain's network interfaces. */
> + for (i = 0 ; i < vm->def->nnets ; i++) {
> + if (vm->def->nets[i]->ifname &&
> + STREQ (vm->def->nets[i]->ifname, path)) {
> + ret = 0;
> + break;
> + }
> + }
> +
> + if (ret == 0)
> + ret = linuxDomainInterfaceStats(path, stats);
> + else
> + openvzError(VIR_ERR_INVALID_ARG,
> + _("invalid path, '%s' is not a known
interface"), path);
> +
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + return ret;
> +}
> +
> +
> static virDriver openvzDriver = {
> .no = VIR_DRV_OPENVZ,
> .name = "OPENVZ",
> @@ -1717,6 +1768,7 @@ static virDriver openvzDriver = {
> .domainUndefineFlags = openvzDomainUndefineFlags, /* 0.9.4 */
> .domainGetAutostart = openvzDomainGetAutostart, /* 0.4.6 */
> .domainSetAutostart = openvzDomainSetAutostart, /* 0.4.6 */
> + .domainInterfaceStats = openvzDomainInterfaceStats, /* 0.9.12 */
> .isEncrypted = openvzIsEncrypted, /* 0.7.3 */
> .isSecure = openvzIsSecure, /* 0.7.3 */
> .domainIsActive = openvzDomainIsActive, /* 0.7.3 */
ACK. This is pretty much verbatim what is in qemuDomainInterfaceStats,
and they're both operating on a host-side veth/tap.
Pushed. Thanks,
-- Guido