mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
qemu_agent: Add qemuAgentGetLoadAvg()
With qemu guest agent 9.3 we are able to get the load averages with a new command. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
c52c449fd4
commit
1669d91ead
@ -2568,3 +2568,49 @@ int qemuAgentGetDisks(qemuAgent *agent,
|
||||
g_free(*disks);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuAgentGetLoadAvg(qemuAgent *agent,
|
||||
double *load1m,
|
||||
double *load5m,
|
||||
double *load15m,
|
||||
bool report_unsupported)
|
||||
{
|
||||
g_autoptr(virJSONValue) cmd = NULL;
|
||||
g_autoptr(virJSONValue) reply = NULL;
|
||||
virJSONValue *data = NULL;
|
||||
int rc;
|
||||
|
||||
if (!(cmd = qemuAgentMakeCommand("guest-get-load", NULL)))
|
||||
return -1;
|
||||
|
||||
if ((rc = qemuAgentCommandFull(agent, cmd, &reply, agent->timeout,
|
||||
report_unsupported)) < 0)
|
||||
return rc;
|
||||
|
||||
if (!(data = virJSONValueObjectGetObject(reply, "return"))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("qemu agent didn't return an array of loads"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define GET_NUMBER_PARAM(param_) \
|
||||
do { \
|
||||
if (param_ && \
|
||||
virJSONValueObjectGetNumberDouble(data, #param_, param_) < 0) { \
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, \
|
||||
_("parameter '%1$s' is missing in reply of guest-get-load"), \
|
||||
#param_); \
|
||||
return -1; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
GET_NUMBER_PARAM(load1m);
|
||||
GET_NUMBER_PARAM(load5m);
|
||||
GET_NUMBER_PARAM(load15m);
|
||||
|
||||
#undef GET_NUMBER_PARAM
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -195,3 +195,9 @@ int qemuAgentSSHRemoveAuthorizedKeys(qemuAgent *agent,
|
||||
int qemuAgentGetDisks(qemuAgent *mon,
|
||||
qemuAgentDiskInfo ***disks,
|
||||
bool report_unsupported);
|
||||
|
||||
int qemuAgentGetLoadAvg(qemuAgent *agent,
|
||||
double *load1m,
|
||||
double *load5m,
|
||||
double *load15m,
|
||||
bool report_unsupported);
|
||||
|
@ -1356,6 +1356,58 @@ testQemuAgentTimezone(const void *data)
|
||||
virTypedParamsFree(params, nparams);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static const char testQemuAgentGetLoadAvgResponse[] =
|
||||
"{"
|
||||
" \"return\": {"
|
||||
" \"load15m\": 0.03564453125,"
|
||||
" \"load5m\": 0.064453125,"
|
||||
" \"load1m\": 0.00390625"
|
||||
" }"
|
||||
"}";
|
||||
|
||||
static int
|
||||
testQemuAgentGetLoadAvg(const void *data)
|
||||
{
|
||||
virDomainXMLOption *xmlopt = (virDomainXMLOption *)data;
|
||||
g_autoptr(qemuMonitorTest) test = qemuMonitorTestNewAgent(xmlopt);
|
||||
double load1m = 0;
|
||||
double load5m = 0;
|
||||
double load15m = 0;
|
||||
|
||||
if (!test)
|
||||
return -1;
|
||||
|
||||
if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
|
||||
return -1;
|
||||
|
||||
if (qemuMonitorTestAddItem(test, "guest-get-load",
|
||||
testQemuAgentGetLoadAvgResponse) < 0)
|
||||
return -1;
|
||||
|
||||
if (qemuAgentGetLoadAvg(qemuMonitorTestGetAgent(test),
|
||||
&load1m, &load5m, &load15m, true) < 0)
|
||||
return -1;
|
||||
|
||||
#define VALIDATE_LOAD(value_, expected_) \
|
||||
do { \
|
||||
if (value_ != expected_) { \
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, \
|
||||
"Expected " #value_ " '%.11f', got '%.11f'", \
|
||||
expected_, value_); \
|
||||
return -1; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
VALIDATE_LOAD(load1m, 0.00390625);
|
||||
VALIDATE_LOAD(load5m, 0.064453125);
|
||||
VALIDATE_LOAD(load15m, 0.03564453125);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
mymain(void)
|
||||
{
|
||||
@ -1392,6 +1444,7 @@ mymain(void)
|
||||
DO_TEST(Timezone);
|
||||
DO_TEST(SSHKeys);
|
||||
DO_TEST(GetDisks);
|
||||
DO_TEST(GetLoadAvg);
|
||||
|
||||
DO_TEST(Timeout); /* Timeout should always be called last */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user