[libvirt] [libvirt-python PATCH 0/2] Provide coverage for the AMD SEV APIs

Add support for the recently introduced AMD SEV APIs Erik Skultety (2): Add support for virDomainGetLaunchSecurityInfo Add support for virNodeGetSEVInfo generator.py | 2 ++ libvirt-override-api.xml | 12 ++++++++ libvirt-override.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) -- 2.14.4

Libvirt recently introduced support for getting launch security parameters, most notably AMD SEV VM memory measurement. This API can't be generated as it's using typed parameters which we need to allocate. Signed-off-by: Erik Skultety <eskultet@redhat.com> --- generator.py | 1 + libvirt-override-api.xml | 6 ++++++ libvirt-override.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/generator.py b/generator.py index b7d96a1..643d1b4 100755 --- a/generator.py +++ b/generator.py @@ -489,6 +489,7 @@ skip_impl = ( 'virDomainSetPerfEvents', 'virDomainGetGuestVcpus', 'virConnectBaselineHypervisorCPU', + 'virDomainGetLaunchSecurityInfo', ) lxc_skip_impl = ( diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 36d3577..7137237 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -728,5 +728,11 @@ <arg name='xmlCPUs' type='const char **' info='array of XML descriptions of CPUs'/> <arg name='flags' type='unsigned int' info='bitwise-OR of virConnectBaselineCPUFlags'/> </function> + <function name='virDomainGetLaunchSecurityInfo' file='python'> + <info>Get launch security info for a domain</info> + <return type='char *' info='None in case of error, returns a dictionary of params'/> + <arg name='domain' type='virDomainPtr' info='pointer to domain object'/> + <arg name='flags' type='int' info='unused, always pass 0'/> + </function> </symbols> </api> diff --git a/libvirt-override.c b/libvirt-override.c index 2f2c4ff..5de8693 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -9763,6 +9763,42 @@ libvirt_virConnectBaselineHypervisorCPU(PyObject *self ATTRIBUTE_UNUSED, #endif /* LIBVIR_CHECK_VERSION(4, 4, 0) */ +#if LIBVIR_CHECK_VERSION(4, 5, 0) +static PyObject * +libvirt_virDomainGetLaunchSecurityInfo(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ + PyObject *pyobj_dom = NULL; + PyObject *ret = NULL; + + virDomainPtr dom = NULL; + virTypedParameterPtr params = NULL; + int nparams = 0; + unsigned int flags = 0; + int i_retval; + + if (!PyArg_ParseTuple(args, (char *)"OI:virDomainGetLaunchSecurityInfo", + &pyobj_dom, &flags)) + return NULL; + dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); + + LIBVIRT_BEGIN_ALLOW_THREADS; + i_retval = virDomainGetLaunchSecurityInfo(dom, params, nparams, flags); + LIBVIRT_END_ALLOW_THREADS; + + if (i_retval < 0) { + ret = VIR_PY_NONE; + goto cleanup; + } + + ret = getPyVirTypedParameter(params, nparams); + cleanup: + virTypedParamsFree(params, nparams); + return ret; +} +#endif /* LIBVIR_CHECK_VERSION(4, 5, 0) */ + + /************************************************************************ * * * The registration stuff * @@ -9999,6 +10035,9 @@ static PyMethodDef libvirtMethods[] = { #if LIBVIR_CHECK_VERSION(4, 4, 0) {(char *) "virConnectBaselineHypervisorCPU", libvirt_virConnectBaselineHypervisorCPU, METH_VARARGS, NULL}, #endif /* LIBVIR_CHECK_VERSION(4, 4, 0) */ +#if LIBVIR_CHECK_VERSION(4, 5, 0) + {(char *) "virDomainGetLaunchSecurityInfo", libvirt_virDomainGetLaunchSecurityInfo, METH_VARARGS, NULL}, +#endif /* LIBVIR_CHECK_VERSION(4, 5, 0) */ {NULL, NULL, 0, NULL} }; -- 2.14.4

On Tue, Jun 12, 2018 at 04:23:37PM +0200, Erik Skultety wrote:
Libvirt recently introduced support for getting launch security parameters, most notably AMD SEV VM memory measurement. This API can't be generated as it's using typed parameters which we need to allocate.
Signed-off-by: Erik Skultety <eskultet@redhat.com> --- generator.py | 1 + libvirt-override-api.xml | 6 ++++++ libvirt-override.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+)
diff --git a/generator.py b/generator.py index b7d96a1..643d1b4 100755 --- a/generator.py +++ b/generator.py @@ -489,6 +489,7 @@ skip_impl = ( 'virDomainSetPerfEvents', 'virDomainGetGuestVcpus', 'virConnectBaselineHypervisorCPU', + 'virDomainGetLaunchSecurityInfo', )
lxc_skip_impl = ( diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 36d3577..7137237 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -728,5 +728,11 @@ <arg name='xmlCPUs' type='const char **' info='array of XML descriptions of CPUs'/> <arg name='flags' type='unsigned int' info='bitwise-OR of virConnectBaselineCPUFlags'/> </function> + <function name='virDomainGetLaunchSecurityInfo' file='python'> + <info>Get launch security info for a domain</info> + <return type='char *' info='None in case of error, returns a dictionary of params'/>
Indentation is off.
+ <arg name='domain' type='virDomainPtr' info='pointer to domain object'/> + <arg name='flags' type='int' info='unused, always pass 0'/>
Here too.
+ </function> </symbols> </api> diff --git a/libvirt-override.c b/libvirt-override.c index 2f2c4ff..5de8693 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -9763,6 +9763,42 @@ libvirt_virConnectBaselineHypervisorCPU(PyObject *self ATTRIBUTE_UNUSED, #endif /* LIBVIR_CHECK_VERSION(4, 4, 0) */
+#if LIBVIR_CHECK_VERSION(4, 5, 0) +static PyObject * +libvirt_virDomainGetLaunchSecurityInfo(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ + PyObject *pyobj_dom = NULL; + PyObject *ret = NULL; + + virDomainPtr dom = NULL; + virTypedParameterPtr params = NULL; + int nparams = 0; + unsigned int flags = 0; + int i_retval; + + if (!PyArg_ParseTuple(args, (char *)"OI:virDomainGetLaunchSecurityInfo", + &pyobj_dom, &flags)) + return NULL; + dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); + + LIBVIRT_BEGIN_ALLOW_THREADS; + i_retval = virDomainGetLaunchSecurityInfo(dom, params, nparams, flags);
libvirt-override.c:9786:52: warning: passing argument 2 of ‘virDomainGetLaunchSecurityInfo’ from incompatible pointer type [-Wincompatible-pointer-types] i_retval = virDomainGetLaunchSecurityInfo(dom, params, nparams, flags); ^~~~~~ Are you sure you tried bulding it against git libvirt? Jano

On Wed, Jun 13, 2018 at 09:02:12AM +0200, Ján Tomko wrote:
On Tue, Jun 12, 2018 at 04:23:37PM +0200, Erik Skultety wrote:
Libvirt recently introduced support for getting launch security parameters, most notably AMD SEV VM memory measurement. This API can't be generated as it's using typed parameters which we need to allocate.
Signed-off-by: Erik Skultety <eskultet@redhat.com> --- generator.py | 1 + libvirt-override-api.xml | 6 ++++++ libvirt-override.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+)
diff --git a/generator.py b/generator.py index b7d96a1..643d1b4 100755 --- a/generator.py +++ b/generator.py @@ -489,6 +489,7 @@ skip_impl = ( 'virDomainSetPerfEvents', 'virDomainGetGuestVcpus', 'virConnectBaselineHypervisorCPU', + 'virDomainGetLaunchSecurityInfo', )
lxc_skip_impl = ( diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 36d3577..7137237 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -728,5 +728,11 @@ <arg name='xmlCPUs' type='const char **' info='array of XML descriptions of CPUs'/> <arg name='flags' type='unsigned int' info='bitwise-OR of virConnectBaselineCPUFlags'/> </function> + <function name='virDomainGetLaunchSecurityInfo' file='python'> + <info>Get launch security info for a domain</info> + <return type='char *' info='None in case of error, returns a dictionary of params'/>
Indentation is off.
+ <arg name='domain' type='virDomainPtr' info='pointer to domain object'/> + <arg name='flags' type='int' info='unused, always pass 0'/>
Here too.
+ </function> </symbols> </api> diff --git a/libvirt-override.c b/libvirt-override.c index 2f2c4ff..5de8693 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -9763,6 +9763,42 @@ libvirt_virConnectBaselineHypervisorCPU(PyObject *self ATTRIBUTE_UNUSED, #endif /* LIBVIR_CHECK_VERSION(4, 4, 0) */
+#if LIBVIR_CHECK_VERSION(4, 5, 0) +static PyObject * +libvirt_virDomainGetLaunchSecurityInfo(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ + PyObject *pyobj_dom = NULL; + PyObject *ret = NULL; + + virDomainPtr dom = NULL; + virTypedParameterPtr params = NULL; + int nparams = 0; + unsigned int flags = 0; + int i_retval; + + if (!PyArg_ParseTuple(args, (char *)"OI:virDomainGetLaunchSecurityInfo", + &pyobj_dom, &flags)) + return NULL; + dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); + + LIBVIRT_BEGIN_ALLOW_THREADS; + i_retval = virDomainGetLaunchSecurityInfo(dom, params, nparams, flags);
libvirt-override.c:9786:52: warning: passing argument 2 of ‘virDomainGetLaunchSecurityInfo’ from incompatible pointer type [-Wincompatible-pointer-types] i_retval = virDomainGetLaunchSecurityInfo(dom, params, nparams, flags); ^~~~~~
Are you sure you tried bulding it against git libvirt?
Sigh...I didn't have a freshly generated libvirt-api.xml in libvirt repo, so python ignored it, I'll respin shortly Erik

This binding allows to query the AMD's SEV firmware for various platform specific things, like a PDH certificate and a certificate chain to establish a trusted connection with the firmware. Because the API uses typed params, it's exempted from generation. Signed-off-by: Erik Skultety <eskultet@redhat.com> --- generator.py | 1 + libvirt-override-api.xml | 6 ++++++ libvirt-override.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/generator.py b/generator.py index 643d1b4..353adab 100755 --- a/generator.py +++ b/generator.py @@ -490,6 +490,7 @@ skip_impl = ( 'virDomainGetGuestVcpus', 'virConnectBaselineHypervisorCPU', 'virDomainGetLaunchSecurityInfo', + 'virNodeGetSEVInfo', ) lxc_skip_impl = ( diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 7137237..7f7ae58 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -734,5 +734,11 @@ <arg name='domain' type='virDomainPtr' info='pointer to domain object'/> <arg name='flags' type='int' info='unused, always pass 0'/> </function> + <function name='virNodeGetSEVInfo' file='python'> + <info>Get platform specific information from the SEV firmware</info> + <return type='char *' info='None in case of error, returns a dictionary of params'/> + <arg name='conn' type='virConnectPtr' info='pointer to hypervisor connection'/> + <arg name='flags' type='int' info='unused, always pass 0'/> + </function> </symbols> </api> diff --git a/libvirt-override.c b/libvirt-override.c index 5de8693..a0584a7 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -9796,6 +9796,40 @@ libvirt_virDomainGetLaunchSecurityInfo(PyObject *self ATTRIBUTE_UNUSED, virTypedParamsFree(params, nparams); return ret; } + + +static PyObject * +libvirt_virNodeGetSEVInfo(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ + PyObject *pyobj_conn = NULL; + PyObject *ret = NULL; + + virConnectPtr conn = NULL; + virTypedParameterPtr params = NULL; + int nparams = 0; + unsigned int flags = 0; + int i_retval; + + if (!PyArg_ParseTuple(args, (char *)"OI:virNodeGetSEVInfo", + &pyobj_conn, &flags)) + return NULL; + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + i_retval = virNodeGetSEVInfo(conn, params, nparams, flags); + LIBVIRT_END_ALLOW_THREADS; + + if (i_retval < 0) { + ret = VIR_PY_NONE; + goto cleanup; + } + + ret = getPyVirTypedParameter(params, nparams); + cleanup: + virTypedParamsFree(params, nparams); + return ret; +} #endif /* LIBVIR_CHECK_VERSION(4, 5, 0) */ -- 2.14.4
participants (2)
-
Erik Skultety
-
Ján Tomko