From nobody Mon Feb 9 20:30:23 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linux.microsoft.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1710151530566516.1577984340004; Mon, 11 Mar 2024 03:05:30 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5C56A1EDE; Mon, 11 Mar 2024 06:05:29 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id E3EB81EA2; Mon, 11 Mar 2024 05:46:02 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id E0EAD1A3F; Mon, 11 Mar 2024 05:44:16 -0400 (EDT) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lists.libvirt.org (Postfix) with ESMTP id 5B5C41A89 for ; Mon, 11 Mar 2024 05:44:14 -0400 (EDT) Received: from paekkaladevi-dev-u22.gi4irqh5pfqublruu4yyku2wof.phxx.internal.cloudapp.net (unknown [20.125.125.171]) by linux.microsoft.com (Postfix) with ESMTPSA id 0524B20B74C2; Mon, 11 Mar 2024 02:44:07 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 0524B20B74C2 From: Purna Pavan Chandra Aekkaladevi To: devel@lists.libvirt.org Subject: [PATCH 01/11] ch_driver: Support Save, Restore VM actions from monitor Date: Mon, 11 Mar 2024 09:43:57 +0000 Message-Id: <20240311094407.12217-2-paekkaladevi@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> References: <20240311094407.12217-1-paekkaladevi@linux.microsoft.com> MIME-Version: 1.0 Message-ID-Hash: HR3TAENZYQZD6TRQWBZTO6QZVER7YDQ4 X-Message-ID-Hash: HR3TAENZYQZD6TRQWBZTO6QZVER7YDQ4 X-MailFrom: paekkaladevi@linux.microsoft.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: prapal@linux.microsoft.com, paekkaladevi@microsoft.com, liuwe@microsoft.com, kumarpraveen@linux.microsoft.com, Purna Pavan Chandra Aekkaladevi X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1710151532034100001 Implement folowing API calls from CH monitor * vmm.snapshot -> to save a domain * vmm.restore -> to restore saved domain Signed-off-by: Purna Pavan Chandra Aekkaladevi --- src/ch/ch_monitor.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_monitor.h | 4 +++ 2 files changed, 91 insertions(+) diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index fefbf7e67a..facbff002e 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -457,6 +457,22 @@ virCHMonitorBuildVMJson(virCHDriver *driver, virDomain= Def *vmdef, return 0; } =20 +static int +virCHMonitorBuildKeyValueStringJson(char **jsonstr, + const char *key, + const char *value) +{ + g_autoptr(virJSONValue) content =3D virJSONValueNewObject(); + + if (virJSONValueObjectAppendString(content, key, value) < 0) + return -1; + + if (!(*jsonstr =3D virJSONValueToString(content, false))) + return -1; + + return 0; +} + static int chMonitorCreateSocket(const char *socket_path) { @@ -896,6 +912,77 @@ virCHMonitorResumeVM(virCHMonitor *mon) return virCHMonitorPutNoContent(mon, URL_VM_RESUME); } =20 +static int +virCHMonitorSaveRestoreVM(virCHMonitor *mon, const char *path, bool save) +{ + g_autofree char *url =3D NULL; + int responseCode =3D 0; + int ret =3D -1; + g_autofree char *payload =3D NULL; + g_autofree char *path_url =3D NULL; + struct curl_slist *headers =3D NULL; + struct curl_data data =3D {0}; + + if (save) + url =3D g_strdup_printf("%s/%s", URL_ROOT, URL_VM_SAVE); + else + url =3D g_strdup_printf("%s/%s", URL_ROOT, URL_VM_RESTORE); + + headers =3D curl_slist_append(headers, "Accept: application/json"); + headers =3D curl_slist_append(headers, "Content-Type: application/json= "); + + path_url =3D g_strdup_printf("file://%s", path); + if (save) { + if (virCHMonitorBuildKeyValueStringJson(&payload, "destination_url= ", path_url) !=3D 0) + return -1; + } else { + if (virCHMonitorBuildKeyValueStringJson(&payload, "source_url", pa= th_url) !=3D 0) + return -1; + } + + VIR_WITH_OBJECT_LOCK_GUARD(mon) { + /* reset all options of a libcurl session handle at first */ + curl_easy_reset(mon->handle); + + curl_easy_setopt(mon->handle, CURLOPT_UNIX_SOCKET_PATH, mon->socke= tpath); + curl_easy_setopt(mon->handle, CURLOPT_URL, url); + curl_easy_setopt(mon->handle, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_easy_setopt(mon->handle, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(mon->handle, CURLOPT_POSTFIELDS, payload); + curl_easy_setopt(mon->handle, CURLOPT_WRITEFUNCTION, curl_callback= ); + curl_easy_setopt(mon->handle, CURLOPT_WRITEDATA, (void *)&data); + + responseCode =3D virCHMonitorCurlPerform(mon->handle); + } + + if (responseCode =3D=3D 200 || responseCode =3D=3D 204) { + ret =3D 0; + } else { + data.content =3D g_realloc(data.content, data.size + 1); + data.content[data.size] =3D 0; + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + data.content); + g_free(data.content); + } + + /* reset the libcurl handle to avoid leaking a stack pointer to data */ + curl_easy_reset(mon->handle); + curl_slist_free_all(headers); + return ret; +} + +int +virCHMonitorSaveVM(virCHMonitor *mon, const char *to) +{ + return virCHMonitorSaveRestoreVM(mon, to, true); +} + +int +virCHMonitorRestoreVM(virCHMonitor *mon, const char *from) +{ + return virCHMonitorSaveRestoreVM(mon, from, false); +} + /** * virCHMonitorGetInfo: * @mon: Pointer to the monitor diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h index 47b4e7abbd..3e0befe5d0 100644 --- a/src/ch/ch_monitor.h +++ b/src/ch/ch_monitor.h @@ -37,6 +37,8 @@ #define URL_VM_Suspend "vm.pause" #define URL_VM_RESUME "vm.resume" #define URL_VM_INFO "vm.info" +#define URL_VM_SAVE "vm.snapshot" +#define URL_VM_RESTORE "vm.restore" =20 #define VIRCH_THREAD_NAME_LEN 16 =20 @@ -110,6 +112,8 @@ int virCHMonitorShutdownVM(virCHMonitor *mon); int virCHMonitorRebootVM(virCHMonitor *mon); int virCHMonitorSuspendVM(virCHMonitor *mon); int virCHMonitorResumeVM(virCHMonitor *mon); +int virCHMonitorSaveVM(virCHMonitor *mon, const char *to); +int virCHMonitorRestoreVM(virCHMonitor *mon, const char *from); int virCHMonitorGetInfo(virCHMonitor *mon, virJSONValue **info); =20 void virCHMonitorCPUInfoFree(virCHMonitorCPUInfo *cpus); --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org