|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 14/14] livepatch: Add python bindings for livepatch operations
On Wed, Aug 21, 2019 at 08:19:31AM +0000, Pawel Wieczorkiewicz wrote:
> Extend the XC python bindings library to support also all common
> livepatch operations and actions.
>
> Add the python bindings for the following operations:
> - status (pyxc_livepatch_status):
> Requires a payload name as an input.
> Returns a status dict containing a state string and a return code
> integer.
> - action (pyxc_livepatch_action):
> Requires a payload name and an action id as an input. Timeout and
> flags are optional parameters.
> Returns a return code integer.
> - upload (pyxc_livepatch_upload):
> Requires a payload name and a module's filename as an input.
> Returns a return code integer.
> - list (pyxc_livepatch_list):
> Takes no parameters.
> Returns a list of dicts containing each payload's:
> * name as a string
> * state as a string
> * return code as an integer
> * list of metadata key=value strings
>
> Each functions throws an exception error based on the errno value
> received from its corresponding libxc function call.
>
> Signed-off-by: Pawel Wieczorkiewicz <wipawel@xxxxxxxxx>
> Reviewed-by: Martin Mazein <amazein@xxxxxxxxx>
> Reviewed-by: Andra-Irina Paraschiv <andraprs@xxxxxxxxxx>
> Reviewed-by: Leonard Foerster <foersleo@xxxxxxxxx>
> Reviewed-by: Norbert Manthey <nmanthey@xxxxxxxxx>
> ---
> tools/python/xen/lowlevel/xc/xc.c | 273
> ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 273 insertions(+)
>
> diff --git a/tools/python/xen/lowlevel/xc/xc.c
> b/tools/python/xen/lowlevel/xc/xc.c
> index 7f0358ba9c..368739b996 100644
> --- a/tools/python/xen/lowlevel/xc/xc.c
> +++ b/tools/python/xen/lowlevel/xc/xc.c
(...)
> +static PyObject *pyxc_livepatch_list(XcObject *self)
> +{
> + PyObject *list;
> + unsigned int nr, done, left, i;
> + xen_livepatch_status_t *info = NULL;
> + char *name = NULL;
> + char *metadata = NULL;
> + uint32_t *len = NULL;
> + uint32_t *metadata_len = NULL;
> + uint64_t name_total_size, metadata_total_size;
> + off_t name_off, metadata_off;
> + int rc;
> +
> + rc = xc_livepatch_list_get_sizes(self->xc_handle, &nr,
> + &name_total_size, &metadata_total_size);
> + if ( rc )
> + goto error;
> +
> + if ( nr == 0 )
> + return PyList_New(0);
> +
> + rc = ENOMEM;
> + info = malloc(nr * sizeof(*info));
> + if ( !info )
> + goto error;
> +
> + name = malloc(name_total_size * sizeof(*name));
> + if ( !name )
> + goto error;
> +
> + len = malloc(nr * sizeof(*len));
> + if ( !len )
> + goto error;
> +
> + metadata = malloc(metadata_total_size * sizeof(*metadata));
> + if ( !metadata )
> + goto error;
> +
> + metadata_len = malloc(nr * sizeof(*metadata_len));
> + if ( !metadata_len )
> + goto error;
> +
> + rc = xc_livepatch_list(self->xc_handle, nr, 0, info,
> + name, len, name_total_size,
> + metadata, metadata_len, metadata_total_size,
> + &done, &left);
> + if ( rc )
> + goto error;
> +
> + list = PyList_New(0);
Previous remark stays:
Better use PyList_New(done) and later PyList_SetItem() instead of
PyList_Append().
> + name_off = metadata_off = 0;
> + for ( i = 0; i < done; i++ )
> + {
> + PyObject *info_dict, *metadata_list;
> + char *name_str, *metadata_str;
> +
> + name_str = name + name_off;
> + metadata_str = metadata + metadata_off;
> +
> + metadata_list = PyList_New(0);
> + for ( char *s = metadata_str; s < metadata_str + metadata_len[i]; s
> += strlen(s) + 1 )
> + {
> + PyObject *field = Py_BuildValue("s", s);
> + if ( field == NULL )
> + {
> + Py_DECREF(list);
> + Py_DECREF(metadata_list);
> + rc = EFAULT;
> + goto error;
> + }
> +
> + PyList_Append(metadata_list, field);
> + Py_DECREF(field);
> + }
> +
> + info_dict = Py_BuildValue(
> + "{s:s,s:i,s:i,s:N}",
> + "name", name_str,
> + "state", info[i].state,
> + "rc", info[i].rc,
> + "metadata", metadata_list);
> +
> + if ( info_dict == NULL )
> + {
> + Py_DECREF(list);
> + Py_DECREF(metadata_list);
> + rc = EFAULT;
> + goto error;
> + }
> + PyList_Append(list, info_dict);
> + Py_DECREF(info_dict);
> +
> + name_off += len[i];
> + metadata_off += metadata_len[i];
> + }
> +
> +error:
> + free(info);
> + free(name);
> + free(len);
> + free(metadata);
> + free(metadata_len);
> + return rc ? pyxc_error_to_exception(self->xc_handle) : list;
> +}
> +
> static PyMethodDef pyxc_methods[] = {
> { "domain_create",
> (PyCFunction)pyxc_domain_create,
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |