From e51cf5c19213d3414061493f1cafa56efde547c3 Mon Sep 17 00:00:00 2001 From: Ryota Ozaki Date: Thu, 12 Nov 2009 14:55:44 +0100 Subject: [PATCH] LXC implement missing DomainInterfaceStats API * src/lxc/lxc_driver.c: add lxcDomainInterfaceStats implementing virDomainInterfaceStats() --- src/lxc/lxc_driver.c | 62 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 2baff65d6b..7af4161fb8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -48,6 +48,7 @@ #include "event.h" #include "nodeinfo.h" #include "uuid.h" +#include "stats_linux.h" #define VIR_FROM_THIS VIR_FROM_LXC @@ -1956,6 +1957,65 @@ cleanup: return ret; } +#ifdef __linux__ +static int +lxcDomainInterfaceStats(virDomainPtr dom, + const char *path, + struct _virDomainInterfaceStats *stats) +{ + lxc_driver_t *driver = dom->conn->privateData; + virDomainObjPtr vm; + int i; + int ret = -1; + + lxcDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + lxcDriverUnlock(driver); + + if (!vm) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(dom->uuid, uuidstr); + lxcError(dom->conn, dom, VIR_ERR_NO_DOMAIN, + _("No domain with matching uuid '%s'"), uuidstr); + goto cleanup; + } + + if (!virDomainObjIsActive(vm)) { + lxcError(dom->conn, dom, 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(dom->conn, path, stats); + else + lxcError(dom->conn, dom, VIR_ERR_INVALID_ARG, + _("Invalid path, '%s' is not a known interface"), path); + +cleanup: + if (vm) + virDomainObjUnlock(vm); + return ret; +} +#else +static int +lxcDomainInterfaceStats(virDomainPtr dom, + const char *path ATTRIBUTE_UNUSED, + struct _virDomainInterfaceStats *stats ATTRIBUTE_UNUSED) + lxcError(dom->conn, dom, VIR_ERR_NO_SUPPORT, "%s", __FUNCTION__); + return -1; +} +#endif + static int lxcDomainGetAutostart(virDomainPtr dom, int *autostart) { lxc_driver_t *driver = dom->conn->privateData; @@ -2325,7 +2385,7 @@ static virDriver lxcDriver = { NULL, /* domainMigratePerform */ NULL, /* domainMigrateFinish */ NULL, /* domainBlockStats */ - NULL, /* domainInterfaceStats */ + lxcDomainInterfaceStats, /* domainInterfaceStats */ NULL, /* domainBlockPeek */ NULL, /* domainMemoryPeek */ nodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */ -- GitLab