mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
ch: use monitor socket fd to send restore request
Instead of curl, use low-level socket connections to make restore api request to CH. This will enable passing new net FDs to CH while restoring domains with network configuration. Signed-off-by: Purna Pavan Chandra <paekkaladevi@linux.microsoft.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
4919f3a120
commit
fd34fbed79
@ -993,9 +993,19 @@ virCHMonitorSaveVM(virCHMonitor *mon, const char *to)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
virCHMonitorRestoreVM(virCHMonitor *mon, const char *from)
|
virCHMonitorBuildRestoreJson(const char *from,
|
||||||
|
char **jsonstr)
|
||||||
{
|
{
|
||||||
return virCHMonitorSaveRestoreVM(mon, from, false);
|
g_autoptr(virJSONValue) restore_json = virJSONValueNewObject();
|
||||||
|
|
||||||
|
g_autofree char *path_url = g_strdup_printf("file://%s", from);
|
||||||
|
if (virJSONValueObjectAppendString(restore_json, "source_url", path_url))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!(*jsonstr = virJSONValueToString(restore_json, false)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -115,7 +115,6 @@ int virCHMonitorRebootVM(virCHMonitor *mon);
|
|||||||
int virCHMonitorSuspendVM(virCHMonitor *mon);
|
int virCHMonitorSuspendVM(virCHMonitor *mon);
|
||||||
int virCHMonitorResumeVM(virCHMonitor *mon);
|
int virCHMonitorResumeVM(virCHMonitor *mon);
|
||||||
int virCHMonitorSaveVM(virCHMonitor *mon, const char *to);
|
int virCHMonitorSaveVM(virCHMonitor *mon, const char *to);
|
||||||
int virCHMonitorRestoreVM(virCHMonitor *mon, const char *from);
|
|
||||||
int virCHMonitorGetInfo(virCHMonitor *mon, virJSONValue **info);
|
int virCHMonitorGetInfo(virCHMonitor *mon, virJSONValue **info);
|
||||||
|
|
||||||
void virCHMonitorCPUInfoFree(virCHMonitorCPUInfo *cpus);
|
void virCHMonitorCPUInfoFree(virCHMonitorCPUInfo *cpus);
|
||||||
@ -130,3 +129,5 @@ int
|
|||||||
virCHMonitorBuildNetJson(virDomainNetDef *netdef,
|
virCHMonitorBuildNetJson(virDomainNetDef *netdef,
|
||||||
int netindex,
|
int netindex,
|
||||||
char **jsonstr);
|
char **jsonstr);
|
||||||
|
int virCHMonitorBuildRestoreJson(const char *from,
|
||||||
|
char **jsonstr);
|
||||||
|
@ -913,6 +913,12 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
|
|||||||
{
|
{
|
||||||
virCHDomainObjPrivate *priv = vm->privateData;
|
virCHDomainObjPrivate *priv = vm->privateData;
|
||||||
g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(priv->driver);
|
g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(priv->driver);
|
||||||
|
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_auto(virBuffer) http_headers = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_autofree char *payload = NULL;
|
||||||
|
g_autofree char *response = NULL;
|
||||||
|
VIR_AUTOCLOSE mon_sockfd = -1;
|
||||||
|
size_t payload_len;
|
||||||
|
|
||||||
if (!priv->monitor) {
|
if (!priv->monitor) {
|
||||||
/* Get the first monitor connection if not already */
|
/* Get the first monitor connection if not already */
|
||||||
@ -927,12 +933,6 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
|
|||||||
vm->def->id = vm->pid;
|
vm->def->id = vm->pid;
|
||||||
priv->machineName = virCHDomainGetMachineName(vm);
|
priv->machineName = virCHDomainGetMachineName(vm);
|
||||||
|
|
||||||
if (virCHMonitorRestoreVM(priv->monitor, from) < 0) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("failed to restore domain"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pass 0, NULL as restore only works without networking support */
|
/* Pass 0, NULL as restore only works without networking support */
|
||||||
if (virDomainCgroupSetupCgroup("ch", vm,
|
if (virDomainCgroupSetupCgroup("ch", vm,
|
||||||
0, NULL, /* nnicindexes, nicindexes */
|
0, NULL, /* nnicindexes, nicindexes */
|
||||||
@ -943,6 +943,34 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
|
|||||||
priv->machineName) < 0)
|
priv->machineName) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (virCHMonitorBuildRestoreJson(from, &payload) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("failed to restore domain"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
virBufferAddLit(&http_headers, "PUT /api/v1/vm.restore HTTP/1.1\r\n");
|
||||||
|
virBufferAddLit(&http_headers, "Host: localhost\r\n");
|
||||||
|
virBufferAddLit(&http_headers, "Content-Type: application/json\r\n");
|
||||||
|
virBufferAsprintf(&buf, "%s", virBufferCurrentContent(&http_headers));
|
||||||
|
virBufferAsprintf(&buf, "Content-Length: %ld\r\n\r\n", strlen(payload));
|
||||||
|
virBufferAsprintf(&buf, "%s", payload);
|
||||||
|
payload_len = virBufferUse(&buf);
|
||||||
|
payload = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
|
if ((mon_sockfd = chMonitorSocketConnect(priv->monitor)) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (virSocketSendMsgWithFDs(mon_sockfd, payload, payload_len, NULL, 0) < 0) {
|
||||||
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Failed to send restore request to CH"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore is a synchronous operation in CH. so, pass false to wait until there's a response */
|
||||||
|
if (chSocketProcessHttpResponse(mon_sockfd, false) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (virCHProcessSetup(vm) < 0)
|
if (virCHProcessSetup(vm) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user