From 9a12606bb5caf3e213ce1564445d88325592e642 Mon Sep 17 00:00:00 2001 From: AlexChen Date: Tue, 19 Oct 2021 14:50:32 +0800 Subject: [PATCH] Hotpatch: introduce DomainHotpatchManage API Signed-off-by: Hao Wang Signed-off-by: Bihong Yu Signed-off-by: AlexChen --- include/libvirt/libvirt-domain.h | 18 ++++++++++ scripts/check-aclrules.py | 1 + src/driver-hypervisor.h | 8 +++++ src/libvirt-domain.c | 58 ++++++++++++++++++++++++++++++++ src/libvirt_public.syms | 4 +++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 20 ++++++++++- 7 files changed, 109 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 90cb652db1..f91061724b 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4991,4 +4991,22 @@ int virDomainBackupBegin(virDomainPtr domain, char *virDomainBackupGetXMLDesc(virDomainPtr domain, unsigned int flags); +typedef enum { + VIR_DOMAIN_HOTPATCH_NONE = 0, /* No action */ + VIR_DOMAIN_HOTPATCH_APPLY, /* Apply hotpatch */ + VIR_DOMAIN_HOTPATCH_UNAPPLY, /* Unapply hotpatch */ + VIR_DOMAIN_HOTPATCH_QUERY, /* Query hotpatch */ + +# ifdef VIR_ENUM_SENTINELS + VIR_DOMAIN_HOTPATCH_LAST +# endif +} virDomainHotpatchAction; + +char * +virDomainHotpatchManage(virDomainPtr domain, + int action, + const char *patch, + const char *id, + unsigned int flags); + #endif /* LIBVIRT_DOMAIN_H */ diff --git a/scripts/check-aclrules.py b/scripts/check-aclrules.py index a1fa473174..e196f81de9 100755 --- a/scripts/check-aclrules.py +++ b/scripts/check-aclrules.py @@ -53,6 +53,7 @@ whitelist = { "connectURIProbe": True, "localOnly": True, "domainQemuAttach": True, + "domainHotpatchManage": True, } # XXX this vzDomainMigrateConfirm3Params looks diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index bce023017d..afc21a0b3f 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1387,6 +1387,13 @@ typedef char * (*virDrvDomainBackupGetXMLDesc)(virDomainPtr domain, unsigned int flags); +typedef char * +(*virDrvDomainHotpatchManage)(virDomainPtr domain, + int action, + const char *patch, + const char *id, + unsigned int flags); + typedef struct _virHypervisorDriver virHypervisorDriver; typedef virHypervisorDriver *virHypervisorDriverPtr; @@ -1650,4 +1657,5 @@ struct _virHypervisorDriver { virDrvDomainAgentSetResponseTimeout domainAgentSetResponseTimeout; virDrvDomainBackupBegin domainBackupBegin; virDrvDomainBackupGetXMLDesc domainBackupGetXMLDesc; + virDrvDomainHotpatchManage domainHotpatchManage; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index a12809c2d5..068ab52f54 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -12733,3 +12733,61 @@ virDomainBackupGetXMLDesc(virDomainPtr domain, virDispatchError(conn); return NULL; } + +/** + * virDomainHotpatchManage: + * @domain: a domain object + * @action: the action type from virDomainHotpatchAction + * @patch: the target hotpatch file + * @id: the patch id of the target hotpatch + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * Manage hotpatch for the current domain according to @action. + * + * If the @action is set to VIR_DOMAIN_HOTPATCH_APPLY, apply hotpatch + * @patch to the current domain. + * + * If the @action is set to VIR_DOMAIN_HOTPATCH_UNAPPLY, unapply the + * hotpatch which is matched with @id from the current domain. + * + * If the @action is set to VIR_DOMAIN_HOTPATCH_QUERY, query infomations + * of the applied hotpatch of the current domain. + * + * Returns success messages in case of success, NULL otherwise. + */ +char * +virDomainHotpatchManage(virDomainPtr domain, + int action, + const char *patch, + const char *id, + unsigned int flags) +{ + virConnectPtr conn; + + virResetLastError(); + + virCheckDomainReturn(domain, NULL); + conn = domain->conn; + + virCheckReadOnlyGoto(conn->flags, error); + + if (action == VIR_DOMAIN_HOTPATCH_APPLY) + virCheckNonNullArgGoto(patch, error); + + if (action == VIR_DOMAIN_HOTPATCH_UNAPPLY) + virCheckNonNullArgGoto(id, error); + + if (conn->driver->domainHotpatchManage) { + char *ret; + ret = conn->driver->domainHotpatchManage(domain, action, patch, id, flags); + if (!ret) + goto error; + + return ret; + } + + virReportUnsupportedError(); + error: + virDispatchError(conn); + return NULL; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 539d2e3943..0ad0b9e489 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -873,4 +873,8 @@ LIBVIRT_6.0.0 { virDomainBackupGetXMLDesc; } LIBVIRT_5.10.0; +LIBVIRT_6.2.0 { + global: + virDomainHotpatchManage; +} LIBVIRT_6.0.0; # .... define new API here using predicted next version number .... diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 7bae0c2514..1202d44017 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8684,6 +8684,7 @@ static virHypervisorDriver hypervisor_driver = { .domainAgentSetResponseTimeout = remoteDomainAgentSetResponseTimeout, /* 5.10.0 */ .domainBackupBegin = remoteDomainBackupBegin, /* 6.0.0 */ .domainBackupGetXMLDesc = remoteDomainBackupGetXMLDesc, /* 6.0.0 */ + .domainHotpatchManage = remoteDomainHotpatchManage, /* 6.2.0 */ }; static virNetworkDriver network_driver = { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 8b05082b61..ee13075ce1 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -3771,6 +3771,18 @@ struct remote_domain_backup_get_xml_desc_ret { remote_nonnull_string xml; }; +struct remote_domain_hotpatch_manage_args { + remote_nonnull_domain dom; + int action; + remote_string patch; + remote_string id; + unsigned int flags; +}; + +struct remote_domain_hotpatch_manage_ret { + remote_string info; +}; + /*----- Protocol. -----*/ /* Define the program number, protocol version and procedure numbers here. */ @@ -6668,5 +6680,11 @@ enum remote_procedure { * @priority: high * @acl: domain:read */ - REMOTE_PROC_DOMAIN_BACKUP_GET_XML_DESC = 422 + REMOTE_PROC_DOMAIN_BACKUP_GET_XML_DESC = 422, + + /** + * @generate: both + * @acl: domain:read + */ + REMOTE_PROC_DOMAIN_HOTPATCH_MANAGE = 800 }; -- 2.27.0