[libvirt] [PATCH 0/5] implement .connectGetAllDomainStats

Nikolay Shirokovskiy (5): vz: provide block stats for all domain stats vz: add net group to all domain stats vz: add vcpu group to all domain stats vz: add balloon group to all domain stats vz: add state group to all domain stats src/vz/vz_driver.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_sdk.c | 8 ++ 2 files changed, 374 insertions(+) -- 1.8.3.1

--- src/vz/vz_driver.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_sdk.c | 8 +++ 2 files changed, 197 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 08f7961..6d173ef 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3508,6 +3508,194 @@ vzDomainGetJobStats(virDomainPtr domain, return ret; } +#define VZ_ADD_STAT_PARAM_UUL(group, field, counter) \ +do { \ + if (stat.field != -1) { \ + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, \ + group ".%zu." counter, i); \ + if (virTypedParamsAddULLong(&record->params, \ + &record->nparams, \ + maxparams, \ + param_name, \ + stat.field) < 0) \ + return -1; \ + } \ +} while (0) + +static int +vzDomainGetBlockStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + vzDomObjPtr privdom = dom->privateData; + size_t i; + char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; + + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "block.count", + dom->def->ndisks) < 0) + return -1; + + for (i = 0; i < dom->def->ndisks; i++) { + virDomainBlockStatsStruct stat; + virDomainDiskDefPtr disk = dom->def->disks[i]; + + if (prlsdkGetBlockStats(privdom->stats, disk, &stat) < 0) + return -1; + + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.name", i); + if (virTypedParamsAddString(&record->params, + &record->nparams, + maxparams, + param_name, + disk->dst) < 0) + return -1; + + if (virStorageSourceIsLocalStorage(disk->src) && disk->src->path) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.path", i); + if (virTypedParamsAddString(&record->params, + &record->nparams, + maxparams, + param_name, + disk->src->path) < 0) + return -1; + } + + VZ_ADD_STAT_PARAM_UUL("block", rd_req, "rd.reqs"); + VZ_ADD_STAT_PARAM_UUL("block", rd_bytes, "rd.bytes"); + VZ_ADD_STAT_PARAM_UUL("block", wr_req, "wr.reqs"); + VZ_ADD_STAT_PARAM_UUL("block", wr_bytes, "wr.bytes"); + + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.capacity", i); + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + param_name, + disk->src->capacity) < 0) + return -1; + } + + } + + return 0; +} + +static virDomainStatsRecordPtr +vzDomainGetAllStats(virConnectPtr conn, + virDomainObjPtr dom) +{ + virDomainStatsRecordPtr stat; + int maxparams = 0; + + if (VIR_ALLOC(stat) < 0) + return NULL; + + if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0) + goto error; + + if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid))) + goto error; + + return stat; + + error: + virTypedParamsFree(stat->params, stat->nparams); + virObjectUnref(stat->dom); + VIR_FREE(stat); + return NULL; +} + +static int +vzConnectGetAllDomainStats(virConnectPtr conn, + virDomainPtr *domains, + unsigned int ndomains, + unsigned int stats, + virDomainStatsRecordPtr **retStats, + unsigned int flags) +{ + vzConnPtr privconn = conn->privateData; + vzDriverPtr driver = privconn->driver; + unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT | + VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE); + unsigned int supported = VIR_DOMAIN_STATS_STATE | + VIR_DOMAIN_STATS_VCPU | + VIR_DOMAIN_STATS_INTERFACE | + VIR_DOMAIN_STATS_BALLOON | + VIR_DOMAIN_STATS_BLOCK; + virDomainObjPtr *doms = NULL; + size_t ndoms; + virDomainStatsRecordPtr *tmpstats = NULL; + int nstats = 0; + int ret = -1; + size_t i; + + virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT | + VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE | + VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1); + + if (virConnectGetAllDomainStatsEnsureACL(conn) < 0) + return -1; + + if (!stats) { + stats = supported; + } else if ((flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS) && + (stats & ~supported)) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("Stats types bits 0x%x are not supported by this daemon"), + stats & ~supported); + return -1; + } + + if (ndomains) { + if (virDomainObjListConvert(driver->domains, conn, domains, ndomains, &doms, + &ndoms, virConnectGetAllDomainStatsCheckACL, + lflags, true) < 0) + return -1; + } else { + if (virDomainObjListCollect(driver->domains, conn, &doms, &ndoms, + virConnectGetAllDomainStatsCheckACL, + lflags) < 0) + return -1; + } + + if (VIR_ALLOC_N(tmpstats, ndoms + 1) < 0) + goto cleanup; + + for (i = 0; i < ndoms; i++) { + virDomainStatsRecordPtr tmp; + virDomainObjPtr dom = doms[i]; + + virObjectLock(dom); + tmp = vzDomainGetAllStats(conn, dom); + virObjectUnlock(dom); + + if (!tmp) + goto cleanup; + + tmpstats[nstats++] = tmp; + } + + *retStats = tmpstats; + tmpstats = NULL; + ret = nstats; + + cleanup: + virDomainStatsRecordListFree(tmpstats); + virObjectListFreeCount(doms, ndoms); + + return ret; +} + +#undef VZ_ADD_STAT_PARAM_UUL + static virHypervisorDriver vzHypervisorDriver = { .name = "vz", .connectOpen = vzConnectOpen, /* 0.10.0 */ @@ -3603,6 +3791,7 @@ static virHypervisorDriver vzHypervisorDriver = { .domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 2.0.0 */ .domainGetJobInfo = vzDomainGetJobInfo, /* 2.2.0 */ .domainGetJobStats = vzDomainGetJobStats, /* 2.2.0 */ + .connectGetAllDomainStats = vzConnectGetAllDomainStats, /* 3.0.0 */ }; static virConnectDriver vzConnectDriver = { diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index d13c86a..9566daf 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -592,6 +592,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver, char *buf = NULL; PRL_RESULT pret; PRL_UINT32 emulatedType; + PRL_UINT32 size; virDomainDeviceDriveAddressPtr address; int busIdx, devIdx; int ret = -1; @@ -650,6 +651,13 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (virDomainDiskSetDriver(disk, "vz") < 0) goto cleanup; + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + pret = PrlVmDevHd_GetDiskSize(prldisk, &size); + prlsdkCheckRetGoto(pret, cleanup); + /* from MiB to bytes */ + disk->src->capacity = ((unsigned long long)size) << 20; + } + ret = 0; cleanup: -- 1.8.3.1

12-Dec-16 10:56, Nikolay Shirokovskiy пишет:
--- src/vz/vz_driver.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_sdk.c | 8 +++ 2 files changed, 197 insertions(+)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 08f7961..6d173ef 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3508,6 +3508,194 @@ vzDomainGetJobStats(virDomainPtr domain, return ret; }
+#define VZ_ADD_STAT_PARAM_UUL(group, field, counter) \ +do { \ + if (stat.field != -1) { \ + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, \ + group ".%zu." counter, i); \ + if (virTypedParamsAddULLong(&record->params, \ + &record->nparams, \ + maxparams, \ + param_name, \ + stat.field) < 0) \ + return -1; \ + } \ +} while (0) + +static int +vzDomainGetBlockStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + vzDomObjPtr privdom = dom->privateData; + size_t i; + char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; + + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "block.count", + dom->def->ndisks) < 0) + return -1; + + for (i = 0; i < dom->def->ndisks; i++) { + virDomainBlockStatsStruct stat; + virDomainDiskDefPtr disk = dom->def->disks[i]; + + if (prlsdkGetBlockStats(privdom->stats, disk, &stat) < 0) + return -1;
This needs to be adapted to the latest HEAD as this function got additional parameter. I can do this while pushing.
+ + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.name", i); + if (virTypedParamsAddString(&record->params, + &record->nparams, + maxparams, + param_name, + disk->dst) < 0) + return -1; + + if (virStorageSourceIsLocalStorage(disk->src) && disk->src->path) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.path", i); + if (virTypedParamsAddString(&record->params, + &record->nparams, + maxparams, + param_name, + disk->src->path) < 0) + return -1; + } + + VZ_ADD_STAT_PARAM_UUL("block", rd_req, "rd.reqs"); + VZ_ADD_STAT_PARAM_UUL("block", rd_bytes, "rd.bytes"); + VZ_ADD_STAT_PARAM_UUL("block", wr_req, "wr.reqs"); + VZ_ADD_STAT_PARAM_UUL("block", wr_bytes, "wr.bytes"); + + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, + "block.%zu.capacity", i); + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + param_name, + disk->src->capacity) < 0) + return -1; + } + + } + + return 0; +} + +static virDomainStatsRecordPtr +vzDomainGetAllStats(virConnectPtr conn, + virDomainObjPtr dom) +{ + virDomainStatsRecordPtr stat; + int maxparams = 0; + + if (VIR_ALLOC(stat) < 0) + return NULL; + + if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0) + goto error; + + if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid))) + goto error; + + return stat; + + error: + virTypedParamsFree(stat->params, stat->nparams); + virObjectUnref(stat->dom); + VIR_FREE(stat); + return NULL; +} + +static int +vzConnectGetAllDomainStats(virConnectPtr conn, + virDomainPtr *domains, + unsigned int ndomains, + unsigned int stats, + virDomainStatsRecordPtr **retStats, + unsigned int flags) +{ + vzConnPtr privconn = conn->privateData; + vzDriverPtr driver = privconn->driver; + unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT | + VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE); + unsigned int supported = VIR_DOMAIN_STATS_STATE | + VIR_DOMAIN_STATS_VCPU | + VIR_DOMAIN_STATS_INTERFACE | + VIR_DOMAIN_STATS_BALLOON | + VIR_DOMAIN_STATS_BLOCK; + virDomainObjPtr *doms = NULL; + size_t ndoms; + virDomainStatsRecordPtr *tmpstats = NULL; + int nstats = 0; + int ret = -1; + size_t i; + + virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE | + VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT | + VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE | + VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1); + + if (virConnectGetAllDomainStatsEnsureACL(conn) < 0) + return -1; + + if (!stats) { + stats = supported; + } else if ((flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS) && + (stats & ~supported)) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("Stats types bits 0x%x are not supported by this daemon"), + stats & ~supported); + return -1; + } + + if (ndomains) { + if (virDomainObjListConvert(driver->domains, conn, domains, ndomains, &doms, + &ndoms, virConnectGetAllDomainStatsCheckACL, + lflags, true) < 0) + return -1; + } else { + if (virDomainObjListCollect(driver->domains, conn, &doms, &ndoms, + virConnectGetAllDomainStatsCheckACL, + lflags) < 0) + return -1; + } + + if (VIR_ALLOC_N(tmpstats, ndoms + 1) < 0) + goto cleanup; + + for (i = 0; i < ndoms; i++) { + virDomainStatsRecordPtr tmp; + virDomainObjPtr dom = doms[i]; + + virObjectLock(dom); + tmp = vzDomainGetAllStats(conn, dom); + virObjectUnlock(dom); + + if (!tmp) + goto cleanup; + + tmpstats[nstats++] = tmp; + } + + *retStats = tmpstats; + tmpstats = NULL; + ret = nstats; + + cleanup: + virDomainStatsRecordListFree(tmpstats); + virObjectListFreeCount(doms, ndoms); + + return ret; +} + +#undef VZ_ADD_STAT_PARAM_UUL + static virHypervisorDriver vzHypervisorDriver = { .name = "vz", .connectOpen = vzConnectOpen, /* 0.10.0 */ @@ -3603,6 +3791,7 @@ static virHypervisorDriver vzHypervisorDriver = { .domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 2.0.0 */ .domainGetJobInfo = vzDomainGetJobInfo, /* 2.2.0 */ .domainGetJobStats = vzDomainGetJobStats, /* 2.2.0 */ + .connectGetAllDomainStats = vzConnectGetAllDomainStats, /* 3.0.0 */ };
This will be updated too.
static virConnectDriver vzConnectDriver = { diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index d13c86a..9566daf 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -592,6 +592,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver, char *buf = NULL; PRL_RESULT pret; PRL_UINT32 emulatedType; + PRL_UINT32 size; virDomainDeviceDriveAddressPtr address; int busIdx, devIdx; int ret = -1; @@ -650,6 +651,13 @@ prlsdkGetDiskInfo(vzDriverPtr driver, if (virDomainDiskSetDriver(disk, "vz") < 0) goto cleanup;
+ if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + pret = PrlVmDevHd_GetDiskSize(prldisk, &size); + prlsdkCheckRetGoto(pret, cleanup); + /* from MiB to bytes */ + disk->src->capacity = ((unsigned long long)size) << 20; + } + ret = 0;
cleanup:
ACK

--- src/vz/vz_driver.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 6d173ef..c282858 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3586,6 +3586,47 @@ vzDomainGetBlockStats(virDomainObjPtr dom, return 0; } +static int +vzDomainGetNetStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + vzDomObjPtr privdom = dom->privateData; + size_t i; + char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; + + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "net.count", + dom->def->nnets) < 0) + return -1; + + for (i = 0; i < dom->def->nnets; i++) { + virDomainInterfaceStatsStruct stat; + virDomainNetDefPtr net = dom->def->nets[i]; + + if (prlsdkGetNetStats(privdom->stats, privdom->sdkdom, net->ifname, + &stat) < 0) + return -1; + + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, "net.%zu.name", i); + if (virTypedParamsAddString(&record->params, + &record->nparams, + maxparams, + param_name, + net->ifname) < 0) + return -1; + + VZ_ADD_STAT_PARAM_UUL("net", rx_bytes, "rx.bytes"); + VZ_ADD_STAT_PARAM_UUL("net", rx_packets, "rx.pkts"); + VZ_ADD_STAT_PARAM_UUL("net", tx_bytes, "tx.bytes"); + VZ_ADD_STAT_PARAM_UUL("net", tx_packets, "tx.pkts"); + } + + return 0; +} + static virDomainStatsRecordPtr vzDomainGetAllStats(virConnectPtr conn, virDomainObjPtr dom) @@ -3599,6 +3640,9 @@ vzDomainGetAllStats(virConnectPtr conn, if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0) goto error; + if (vzDomainGetNetStats(dom, stat, &maxparams) < 0) + goto error; + if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid))) goto error; -- 1.8.3.1

--- src/vz/vz_driver.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index c282858..a0a61eb 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3627,6 +3627,57 @@ vzDomainGetNetStats(virDomainObjPtr dom, return 0; } +static int +vzDomainGetVCPUStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + vzDomObjPtr privdom = dom->privateData; + size_t i; + char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; + + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "vcpu.current", + virDomainDefGetVcpus(dom->def)) < 0) + return -1; + + if (virTypedParamsAddUInt(&record->params, + &record->nparams, + maxparams, + "vcpu.maximum", + virDomainDefGetVcpusMax(dom->def)) < 0) + return -1; + + for (i = 0; i < virDomainDefGetVcpusMax(dom->def); i++) { + int state = dom->def->vcpus[i]->online ? VIR_VCPU_RUNNING : + VIR_VCPU_OFFLINE; + unsigned long long time; + + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, "vcpu.%zu.state", i); + if (virTypedParamsAddInt(&record->params, + &record->nparams, + maxparams, + param_name, + state) < 0) + return -1; + + if (prlsdkGetVcpuStats(privdom->stats, i, &time) < 0) + return -1; + + snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH, "vcpu.%zu.time", i); + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + param_name, + time) < 0) + return -1; + } + + return 0; +} + static virDomainStatsRecordPtr vzDomainGetAllStats(virConnectPtr conn, virDomainObjPtr dom) @@ -3643,6 +3694,9 @@ vzDomainGetAllStats(virConnectPtr conn, if (vzDomainGetNetStats(dom, stat, &maxparams) < 0) goto error; + if (vzDomainGetVCPUStats(dom, stat, &maxparams) < 0) + goto error; + if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid))) goto error; -- 1.8.3.1

--- src/vz/vz_driver.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index a0a61eb..01c1a96 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3678,6 +3678,57 @@ vzDomainGetVCPUStats(virDomainObjPtr dom, return 0; } +static int +vzDomainGetBalloonStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + vzDomObjPtr privdom = dom->privateData; + virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR]; + size_t i; + int n; + + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + "balloon.maximum", + virDomainDefGetMemoryTotal(dom->def)) < 0) + return -1; + + if (virTypedParamsAddULLong(&record->params, + &record->nparams, + maxparams, + "balloon.current", + virDomainDefGetMemoryTotal(dom->def)) < 0) + return -1; + + n = prlsdkGetMemoryStats(privdom->stats, stats, VIR_DOMAIN_MEMORY_STAT_NR); + if (n < 0) + return -1; + +#define STORE_MEM_RECORD(TAG, NAME) \ + if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ ##TAG) \ + if (virTypedParamsAddULLong(&record->params, \ + &record->nparams, \ + maxparams, \ + "balloon." NAME, \ + stats[i].val) < 0) \ + return -1; + + for (i = 0; i < n; i++) { + STORE_MEM_RECORD(SWAP_IN, "swap_in") + STORE_MEM_RECORD(SWAP_OUT, "swap_out") + STORE_MEM_RECORD(MAJOR_FAULT, "major_fault") + STORE_MEM_RECORD(MINOR_FAULT, "minor_fault") + STORE_MEM_RECORD(AVAILABLE, "available") + STORE_MEM_RECORD(UNUSED, "unused") + } + +#undef STORE_MEM_RECORD + + return 0; +} + static virDomainStatsRecordPtr vzDomainGetAllStats(virConnectPtr conn, virDomainObjPtr dom) @@ -3697,6 +3748,9 @@ vzDomainGetAllStats(virConnectPtr conn, if (vzDomainGetVCPUStats(dom, stat, &maxparams) < 0) goto error; + if (vzDomainGetBalloonStats(dom, stat, &maxparams) < 0) + goto error; + if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid))) goto error; -- 1.8.3.1

--- src/vz/vz_driver.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 01c1a96..d9bd2cd 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3729,6 +3729,28 @@ vzDomainGetBalloonStats(virDomainObjPtr dom, return 0; } +static int +vzDomainGetStateStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + if (virTypedParamsAddInt(&record->params, + &record->nparams, + maxparams, + "state.state", + dom->state.state) < 0) + return -1; + + if (virTypedParamsAddInt(&record->params, + &record->nparams, + maxparams, + "state.reason", + dom->state.reason) < 0) + return -1; + + return 0; +} + static virDomainStatsRecordPtr vzDomainGetAllStats(virConnectPtr conn, virDomainObjPtr dom) @@ -3739,6 +3761,9 @@ vzDomainGetAllStats(virConnectPtr conn, if (VIR_ALLOC(stat) < 0) return NULL; + if (vzDomainGetStateStats(dom, stat, &maxparams) < 0) + goto error; + if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0) goto error; -- 1.8.3.1

12-Dec-16 10:56, Nikolay Shirokovskiy пишет:
--- src/vz/vz_driver.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 01c1a96..d9bd2cd 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -3729,6 +3729,28 @@ vzDomainGetBalloonStats(virDomainObjPtr dom, return 0; }
+static int +vzDomainGetStateStats(virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams) +{ + if (virTypedParamsAddInt(&record->params, + &record->nparams, + maxparams, + "state.state", + dom->state.state) < 0) + return -1; + + if (virTypedParamsAddInt(&record->params, + &record->nparams, + maxparams, + "state.reason", + dom->state.reason) < 0) + return -1; + + return 0; +} + static virDomainStatsRecordPtr vzDomainGetAllStats(virConnectPtr conn, virDomainObjPtr dom) @@ -3739,6 +3761,9 @@ vzDomainGetAllStats(virConnectPtr conn, if (VIR_ALLOC(stat) < 0) return NULL;
+ if (vzDomainGetStateStats(dom, stat, &maxparams) < 0) + goto error; + if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0) goto error;
ACK for patches 2-5 also. Maxim

12-Dec-16 10:56, Nikolay Shirokovskiy пишет:
Nikolay Shirokovskiy (5): vz: provide block stats for all domain stats vz: add net group to all domain stats vz: add vcpu group to all domain stats vz: add balloon group to all domain stats vz: add state group to all domain stats
src/vz/vz_driver.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_sdk.c | 8 ++ 2 files changed, 374 insertions(+)
Pushed now. Thanks, Maxim
participants (2)
-
Maxim Nestratov
-
Nikolay Shirokovskiy