[libvirt] PATCH: Public API plumbing for virNodeDeviceCreateXML/Destroy

As previously discussed, Dave Allen's reworking the NPIV patches to do creation/deleation of vports via the node device APIs. Thus, this patch adds the 2 new APIs required for this approach. Daniel diff -r 2d1278bdf31f include/libvirt/libvirt.h --- a/include/libvirt/libvirt.h Fri Apr 24 11:01:11 2009 +0100 +++ b/include/libvirt/libvirt.h Fri Apr 24 13:06:12 2009 +0100 @@ -1124,6 +1124,12 @@ int virNodeDeviceDet int virNodeDeviceReAttach (virNodeDevicePtr dev); int virNodeDeviceReset (virNodeDevicePtr dev); +virNodeDevicePtr virNodeDeviceCreateXML (virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); + +int virNodeDeviceDestroy (virNodeDevicePtr dev); + /* * Domain Event Notification */ diff -r 2d1278bdf31f include/libvirt/libvirt.h.in --- a/include/libvirt/libvirt.h.in Fri Apr 24 11:01:11 2009 +0100 +++ b/include/libvirt/libvirt.h.in Fri Apr 24 13:06:12 2009 +0100 @@ -1124,6 +1124,12 @@ int virNodeDeviceDet int virNodeDeviceReAttach (virNodeDevicePtr dev); int virNodeDeviceReset (virNodeDevicePtr dev); +virNodeDevicePtr virNodeDeviceCreateXML (virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); + +int virNodeDeviceDestroy (virNodeDevicePtr dev); + /* * Domain Event Notification */ diff -r 2d1278bdf31f qemud/remote.c --- a/qemud/remote.c Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote.c Fri Apr 24 13:06:12 2009 +0100 @@ -4323,6 +4323,54 @@ remoteDispatchNodeDeviceReset (struct qe } +static int +remoteDispatchNodeDeviceCreateXml(struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, + remote_error *rerr, + remote_node_device_create_xml_args *args, + remote_node_device_create_xml_ret *ret) +{ + virNodeDevicePtr dev; + + dev = virNodeDeviceCreateXML (conn, args->xml_desc, args->flags); + if (dev == NULL) { + remoteDispatchConnError(rerr, conn); + return -1; + } + + make_nonnull_node_device (&ret->dev, dev); + virNodeDeviceFree(dev); + + return 0; +} + + +static int +remoteDispatchNodeDeviceDestroy(struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, + remote_error *rerr, + remote_node_device_destroy_args *args, + void *ret ATTRIBUTE_UNUSED) +{ + virNodeDevicePtr dev; + + dev = virNodeDeviceLookupByName(conn, args->name); + if (dev == NULL) { + remoteDispatchFormatError(rerr, "%s", _("node_device not found")); + return -1; + } + + if (virNodeDeviceDestroy(dev) == -1) { + remoteDispatchConnError(rerr, conn); + return -1; + } + + return 0; +} + + /************************** * Async Events **************************/ diff -r 2d1278bdf31f qemud/remote_dispatch_args.h --- a/qemud/remote_dispatch_args.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_args.h Fri Apr 24 13:06:12 2009 +0100 @@ -103,3 +103,5 @@ remote_node_device_re_attach_args val_remote_node_device_re_attach_args; remote_node_device_reset_args val_remote_node_device_reset_args; remote_domain_get_security_label_args val_remote_domain_get_security_label_args; + remote_node_device_create_xml_args val_remote_node_device_create_xml_args; + remote_node_device_destroy_args val_remote_node_device_destroy_args; diff -r 2d1278bdf31f qemud/remote_dispatch_prototypes.h --- a/qemud/remote_dispatch_prototypes.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_prototypes.h Fri Apr 24 13:06:12 2009 +0100 @@ -527,6 +527,20 @@ static int remoteDispatchNetworkUndefine remote_error *err, remote_network_undefine_args *args, void *ret); +static int remoteDispatchNodeDeviceCreateXml( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_node_device_create_xml_args *args, + remote_node_device_create_xml_ret *ret); +static int remoteDispatchNodeDeviceDestroy( + struct qemud_server *server, + struct qemud_client *client, + virConnectPtr conn, + remote_error *err, + remote_node_device_destroy_args *args, + void *ret); static int remoteDispatchNodeDeviceDettach( struct qemud_server *server, struct qemud_client *client, diff -r 2d1278bdf31f qemud/remote_dispatch_ret.h --- a/qemud/remote_dispatch_ret.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_ret.h Fri Apr 24 13:06:12 2009 +0100 @@ -88,3 +88,4 @@ remote_node_device_list_caps_ret val_remote_node_device_list_caps_ret; remote_domain_get_security_label_ret val_remote_domain_get_security_label_ret; remote_node_get_security_model_ret val_remote_node_get_security_model_ret; + remote_node_device_create_xml_ret val_remote_node_device_create_xml_ret; diff -r 2d1278bdf31f qemud/remote_dispatch_table.h --- a/qemud/remote_dispatch_table.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_table.h Fri Apr 24 13:06:12 2009 +0100 @@ -607,13 +607,23 @@ .args_filter = (xdrproc_t) xdr_remote_node_device_reset_args, .ret_filter = (xdrproc_t) xdr_void, }, -{ /* DomainGetSecurityLabel => 118 */ +{ /* DomainGetSecurityLabel => 121 */ .fn = (dispatch_fn) remoteDispatchDomainGetSecurityLabel, .args_filter = (xdrproc_t) xdr_remote_domain_get_security_label_args, .ret_filter = (xdrproc_t) xdr_remote_domain_get_security_label_ret, }, -{ /* NodeGetSecurityModel => 119 */ +{ /* NodeGetSecurityModel => 122 */ .fn = (dispatch_fn) remoteDispatchNodeGetSecurityModel, .args_filter = (xdrproc_t) xdr_void, .ret_filter = (xdrproc_t) xdr_remote_node_get_security_model_ret, }, +{ /* NodeDeviceCreateXml => 123 */ + .fn = (dispatch_fn) remoteDispatchNodeDeviceCreateXml, + .args_filter = (xdrproc_t) xdr_remote_node_device_create_xml_args, + .ret_filter = (xdrproc_t) xdr_remote_node_device_create_xml_ret, +}, +{ /* NodeDeviceDestroy => 124 */ + .fn = (dispatch_fn) remoteDispatchNodeDeviceDestroy, + .args_filter = (xdrproc_t) xdr_remote_node_device_destroy_args, + .ret_filter = (xdrproc_t) xdr_void, +}, diff -r 2d1278bdf31f qemud/remote_protocol.c --- a/qemud/remote_protocol.c Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_protocol.c Fri Apr 24 13:06:12 2009 +0100 @@ -2230,6 +2230,35 @@ xdr_remote_node_device_reset_args (XDR * } bool_t +xdr_remote_node_device_create_xml_args (XDR *xdrs, remote_node_device_create_xml_args *objp) +{ + + if (!xdr_remote_nonnull_string (xdrs, &objp->xml_desc)) + return FALSE; + if (!xdr_int (xdrs, &objp->flags)) + return FALSE; + return TRUE; +} + +bool_t +xdr_remote_node_device_create_xml_ret (XDR *xdrs, remote_node_device_create_xml_ret *objp) +{ + + if (!xdr_remote_nonnull_node_device (xdrs, &objp->dev)) + return FALSE; + return TRUE; +} + +bool_t +xdr_remote_node_device_destroy_args (XDR *xdrs, remote_node_device_destroy_args *objp) +{ + + if (!xdr_remote_nonnull_string (xdrs, &objp->name)) + return FALSE; + return TRUE; +} + +bool_t xdr_remote_domain_events_register_ret (XDR *xdrs, remote_domain_events_register_ret *objp) { diff -r 2d1278bdf31f qemud/remote_protocol.h --- a/qemud/remote_protocol.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_protocol.h Fri Apr 24 13:06:12 2009 +0100 @@ -1255,6 +1255,22 @@ struct remote_node_device_reset_args { }; typedef struct remote_node_device_reset_args remote_node_device_reset_args; +struct remote_node_device_create_xml_args { + remote_nonnull_string xml_desc; + int flags; +}; +typedef struct remote_node_device_create_xml_args remote_node_device_create_xml_args; + +struct remote_node_device_create_xml_ret { + remote_nonnull_node_device dev; +}; +typedef struct remote_node_device_create_xml_ret remote_node_device_create_xml_ret; + +struct remote_node_device_destroy_args { + remote_nonnull_string name; +}; +typedef struct remote_node_device_destroy_args remote_node_device_destroy_args; + struct remote_domain_events_register_ret { int cb_registered; }; @@ -1397,6 +1413,8 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_RESET = 120, REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL = 121, REMOTE_PROC_NODE_GET_SECURITY_MODEL = 122, + REMOTE_PROC_NODE_DEVICE_CREATE_XML = 123, + REMOTE_PROC_NODE_DEVICE_DESTROY = 124, }; typedef enum remote_procedure remote_procedure; @@ -1629,6 +1647,9 @@ extern bool_t xdr_remote_node_device_li extern bool_t xdr_remote_node_device_dettach_args (XDR *, remote_node_device_dettach_args*); extern bool_t xdr_remote_node_device_re_attach_args (XDR *, remote_node_device_re_attach_args*); extern bool_t xdr_remote_node_device_reset_args (XDR *, remote_node_device_reset_args*); +extern bool_t xdr_remote_node_device_create_xml_args (XDR *, remote_node_device_create_xml_args*); +extern bool_t xdr_remote_node_device_create_xml_ret (XDR *, remote_node_device_create_xml_ret*); +extern bool_t xdr_remote_node_device_destroy_args (XDR *, remote_node_device_destroy_args*); extern bool_t xdr_remote_domain_events_register_ret (XDR *, remote_domain_events_register_ret*); extern bool_t xdr_remote_domain_events_deregister_ret (XDR *, remote_domain_events_deregister_ret*); extern bool_t xdr_remote_domain_event_ret (XDR *, remote_domain_event_ret*); @@ -1840,6 +1861,9 @@ extern bool_t xdr_remote_node_device_lis extern bool_t xdr_remote_node_device_dettach_args (); extern bool_t xdr_remote_node_device_re_attach_args (); extern bool_t xdr_remote_node_device_reset_args (); +extern bool_t xdr_remote_node_device_create_xml_args (); +extern bool_t xdr_remote_node_device_create_xml_ret (); +extern bool_t xdr_remote_node_device_destroy_args (); extern bool_t xdr_remote_domain_events_register_ret (); extern bool_t xdr_remote_domain_events_deregister_ret (); extern bool_t xdr_remote_domain_event_ret (); diff -r 2d1278bdf31f qemud/remote_protocol.x --- a/qemud/remote_protocol.x Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_protocol.x Fri Apr 24 13:06:12 2009 +0100 @@ -1109,6 +1109,19 @@ struct remote_node_device_reset_args { remote_nonnull_string name; }; +struct remote_node_device_create_xml_args { + remote_nonnull_string xml_desc; + int flags; +}; + +struct remote_node_device_create_xml_ret { + remote_nonnull_node_device dev; +}; + +struct remote_node_device_destroy_args { + remote_nonnull_string name; +}; + /** * Events Register/Deregister: @@ -1270,7 +1283,10 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_RESET = 120, REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL = 121, - REMOTE_PROC_NODE_GET_SECURITY_MODEL = 122 + REMOTE_PROC_NODE_GET_SECURITY_MODEL = 122, + + REMOTE_PROC_NODE_DEVICE_CREATE_XML = 123, + REMOTE_PROC_NODE_DEVICE_DESTROY = 124 }; /* Custom RPC structure. */ diff -r 2d1278bdf31f src/driver.h --- a/src/driver.h Fri Apr 24 11:01:11 2009 +0100 +++ b/src/driver.h Fri Apr 24 13:06:12 2009 +0100 @@ -684,6 +684,11 @@ typedef int (*virDevMonDeviceListCaps)(v char **const names, int maxnames); +typedef virNodeDevicePtr (*virDrvNodeDeviceCreateXML)(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); +typedef int (*virDrvNodeDeviceDestroy)(virNodeDevicePtr dev); + /** * _virDeviceMonitor: * @@ -702,6 +707,8 @@ struct _virDeviceMonitor { virDevMonDeviceGetParent deviceGetParent; virDevMonDeviceNumOfCaps deviceNumOfCaps; virDevMonDeviceListCaps deviceListCaps; + virDrvNodeDeviceCreateXML deviceCreateXML; + virDrvNodeDeviceDestroy deviceDestroy; }; /* diff -r 2d1278bdf31f src/libvirt.c --- a/src/libvirt.c Fri Apr 24 11:01:11 2009 +0100 +++ b/src/libvirt.c Fri Apr 24 13:06:12 2009 +0100 @@ -7491,6 +7491,103 @@ error: } +/** + * virNodeDeviceCreateXML: + * @conn: pointer to the hypervisor connection + * @xmlDesc: string containing an XML description of the device to be created + * @flags: callers should always pass 0 + * + * Create a new device on the VM host machine, for example, virtual + * HBAs created using vport_create. + * + * Returns a node device object if successful, NULL in case of failure + */ +virNodeDevicePtr +virNodeDeviceCreateXML(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags) +{ + VIR_DEBUG("conn=%p, xmlDesc=%s, flags=%d", conn, xmlDesc, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return NULL; + } + + if (conn->flags & VIR_CONNECT_RO) { + virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (xmlDesc == NULL) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + goto error; + } + + if (conn->deviceMonitor->deviceCreateXML) { + virNodeDevicePtr dev = conn->deviceMonitor->deviceCreateXML(conn, xmlDesc, flags); + if (dev == NULL) + goto error; + return dev; + } + + virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(conn); + return NULL; +} + + +/** + * virNodeDeviceDestroy: + * @dev: a device object + * + * Destroy the device object. The virtual device is removed from the host operating system. + * This function may require privileged access + * + * Returns 0 in case of success and -1 in case of failure. + */ +int +virNodeDeviceDestroy(virNodeDevicePtr dev) +{ + int retval = 0; + + DEBUG("dev=%p", dev); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) { + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); + return (-1); + } + + if (dev->conn->flags & VIR_CONNECT_RO) { + virLibConnError(dev->conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (dev->conn->deviceMonitor->deviceDestroy) { + retval = dev->conn->deviceMonitor->deviceDestroy(dev); + if (retval < 0) { + goto error; + } + + return 0; + } + + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dev->conn); + return -1; +} + + /* * Domain Event Notification */ diff -r 2d1278bdf31f src/libvirt_public.syms --- a/src/libvirt_public.syms Fri Apr 24 11:01:11 2009 +0100 +++ b/src/libvirt_public.syms Fri Apr 24 13:06:12 2009 +0100 @@ -258,4 +258,10 @@ LIBVIRT_0.6.1 { virNodeGetSecurityModel; } LIBVIRT_0.6.0; +LIBVIRT_0.6.3 { + global: + virNodeDeviceCreateXML; + virNodeDeviceDestroy; +} LIBVIRT_0.6.1; + # .... define new API here using predicted next version number .... diff -r 2d1278bdf31f src/remote_internal.c --- a/src/remote_internal.c Fri Apr 24 11:01:11 2009 +0100 +++ b/src/remote_internal.c Fri Apr 24 13:06:12 2009 +0100 @@ -4987,6 +4987,59 @@ done: } +static virNodeDevicePtr +remoteNodeDeviceCreateXML(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags) +{ + remote_node_device_create_xml_args args; + remote_node_device_create_xml_ret ret; + virNodeDevicePtr dev = NULL; + struct private_data *priv = conn->privateData; + + remoteDriverLock(priv); + + memset(&ret, 0, sizeof ret); + args.xml_desc = (char *)xmlDesc; + args.flags = flags; + + if (call(conn, priv, 0, REMOTE_PROC_NODE_DEVICE_CREATE_XML, + (xdrproc_t) xdr_remote_node_device_create_xml_args, (char *) &args, + (xdrproc_t) xdr_remote_node_device_create_xml_ret, (char *) &ret) == -1) + goto done; + + dev = get_nonnull_node_device(conn, ret.dev); + xdr_free ((xdrproc_t) xdr_remote_node_device_create_xml_ret, (char *) &ret); + +done: + remoteDriverUnlock(priv); + return dev; +} + +static int +remoteNodeDeviceDestroy(virNodeDevicePtr dev) +{ + int rv = -1; + remote_node_device_destroy_args args; + struct private_data *priv = dev->conn->privateData; + + remoteDriverLock(priv); + + args.name = dev->name; + + if (call(dev->conn, priv, 0, REMOTE_PROC_NODE_DEVICE_RESET, + (xdrproc_t) xdr_remote_node_device_destroy_args, (char *) &args, + (xdrproc_t) xdr_void, (char *) NULL) == -1) + goto done; + + rv = 0; + +done: + remoteDriverUnlock(priv); + return rv; +} + + /*----------------------------------------------------------------------*/ static int @@ -6991,6 +7044,8 @@ static virDeviceMonitor dev_monitor = { .deviceGetParent = remoteNodeDeviceGetParent, .deviceNumOfCaps = remoteNodeDeviceNumOfCaps, .deviceListCaps = remoteNodeDeviceListCaps, + .deviceCreateXML = remoteNodeDeviceCreateXML, + .deviceDestroy = remoteNodeDeviceDestroy }; -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On Fri, Apr 24, 2009 at 01:08:30PM +0100, Daniel P. Berrange wrote:
As previously discussed, Dave Allen's reworking the NPIV patches to do creation/deleation of vports via the node device APIs. Thus, this patch adds the 2 new APIs required for this approach.
I would really prefer to see this API in 0.6.3, even if there is no backend implementation, this should ease our work and also allow other people with distinct node storage implementation to provide patches for this too. For this reason I would prefer to see the API go in as earlier as possible in an official release to allow people to work on those as needed.
diff -r 2d1278bdf31f include/libvirt/libvirt.h --- a/include/libvirt/libvirt.h Fri Apr 24 11:01:11 2009 +0100 +++ b/include/libvirt/libvirt.h Fri Apr 24 13:06:12 2009 +0100 @@ -1124,6 +1124,12 @@ int virNodeDeviceDet int virNodeDeviceReAttach (virNodeDevicePtr dev); int virNodeDeviceReset (virNodeDevicePtr dev);
+virNodeDevicePtr virNodeDeviceCreateXML (virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); + +int virNodeDeviceDestroy (virNodeDevicePtr dev); + /* * Domain Event Notification */
Okay this API looks fine to me. I think we can push it as part of 0.6.3,
diff -r 2d1278bdf31f qemud/remote.c --- a/qemud/remote.c Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote.c Fri Apr 24 13:06:12 2009 +0100 @@ -4323,6 +4323,54 @@ remoteDispatchNodeDeviceReset (struct qe
Okay this is directly dependant on the signature of the 2 functions.
diff -r 2d1278bdf31f qemud/remote_dispatch_args.h --- a/qemud/remote_dispatch_args.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_args.h Fri Apr 24 13:06:12 2009 +0100
same here
diff -r 2d1278bdf31f qemud/remote_dispatch_prototypes.h --- a/qemud/remote_dispatch_prototypes.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_prototypes.h Fri Apr 24 13:06:12 2009 +0100 @@ -527,6 +527,20 @@ static int remoteDispatchNetworkUndefine
and here
diff -r 2d1278bdf31f qemud/remote_dispatch_ret.h --- a/qemud/remote_dispatch_ret.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_ret.h Fri Apr 24 13:06:12 2009 +0100
and here
diff -r 2d1278bdf31f qemud/remote_dispatch_table.h --- a/qemud/remote_dispatch_table.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_table.h Fri Apr 24 13:06:12 2009 +0100 [...] -{ /* DomainGetSecurityLabel => 118 */ +{ /* DomainGetSecurityLabel => 121 */ [...] -{ /* NodeGetSecurityModel => 119 */ +{ /* NodeGetSecurityModel => 122 */
Any reason for the renumbering even though it seems harmless ? skipping generated stuff...
diff -r 2d1278bdf31f qemud/remote_protocol.x --- a/qemud/remote_protocol.x Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_protocol.x Fri Apr 24 13:06:12 2009 +0100 @@ -1109,6 +1109,19 @@ struct remote_node_device_reset_args { remote_nonnull_string name; };
+struct remote_node_device_create_xml_args { + remote_nonnull_string xml_desc; + int flags; +}; + +struct remote_node_device_create_xml_ret { + remote_nonnull_node_device dev; +}; + +struct remote_node_device_destroy_args { + remote_nonnull_string name; +}; +
/** * Events Register/Deregister: @@ -1270,7 +1283,10 @@ enum remote_procedure { REMOTE_PROC_NODE_DEVICE_RESET = 120,
REMOTE_PROC_DOMAIN_GET_SECURITY_LABEL = 121, - REMOTE_PROC_NODE_GET_SECURITY_MODEL = 122 + REMOTE_PROC_NODE_GET_SECURITY_MODEL = 122, + + REMOTE_PROC_NODE_DEVICE_CREATE_XML = 123, + REMOTE_PROC_NODE_DEVICE_DESTROY = 124 };
looks fine
diff -r 2d1278bdf31f src/driver.h --- a/src/driver.h Fri Apr 24 11:01:11 2009 +0100 +++ b/src/driver.h Fri Apr 24 13:06:12 2009 +0100 @@ -684,6 +684,11 @@ typedef int (*virDevMonDeviceListCaps)(v char **const names, int maxnames);
+typedef virNodeDevicePtr (*virDrvNodeDeviceCreateXML)(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags); +typedef int (*virDrvNodeDeviceDestroy)(virNodeDevicePtr dev); + /** * _virDeviceMonitor: * @@ -702,6 +707,8 @@ struct _virDeviceMonitor { virDevMonDeviceGetParent deviceGetParent; virDevMonDeviceNumOfCaps deviceNumOfCaps; virDevMonDeviceListCaps deviceListCaps; + virDrvNodeDeviceCreateXML deviceCreateXML; + virDrvNodeDeviceDestroy deviceDestroy; };
okay
diff -r 2d1278bdf31f src/libvirt.c --- a/src/libvirt.c Fri Apr 24 11:01:11 2009 +0100 +++ b/src/libvirt.c Fri Apr 24 13:06:12 2009 +0100 [...] +/** + * virNodeDeviceCreateXML: + * @conn: pointer to the hypervisor connection + * @xmlDesc: string containing an XML description of the device to be created + * @flags: callers should always pass 0 + * + * Create a new device on the VM host machine, for example, virtual + * HBAs created using vport_create. + * + * Returns a node device object if successful, NULL in case of failure + */ +virNodeDevicePtr +virNodeDeviceCreateXML(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags) +{ + VIR_DEBUG("conn=%p, xmlDesc=%s, flags=%d", conn, xmlDesc, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return NULL; + } + + if (conn->flags & VIR_CONNECT_RO) { + virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (xmlDesc == NULL) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + goto error; + } + + if (conn->deviceMonitor->deviceCreateXML) {
are we always 100% sure conn->deviceMonitor is non NULL ?
+ virNodeDevicePtr dev = conn->deviceMonitor->deviceCreateXML(conn, xmlDesc, flags); + if (dev == NULL) + goto error; + return dev; + } + + virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(conn); + return NULL; +} + + +/** + * virNodeDeviceDestroy: + * @dev: a device object + * + * Destroy the device object. The virtual device is removed from the host operating system. + * This function may require privileged access + * + * Returns 0 in case of success and -1 in case of failure. + */ +int +virNodeDeviceDestroy(virNodeDevicePtr dev) +{ + int retval = 0; + + DEBUG("dev=%p", dev); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) { + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); + return (-1); + } + + if (dev->conn->flags & VIR_CONNECT_RO) { + virLibConnError(dev->conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (dev->conn->deviceMonitor->deviceDestroy) { + retval = dev->conn->deviceMonitor->deviceDestroy(dev); + if (retval < 0) { + goto error; + } + + return 0; + } + + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dev->conn); + return -1; +} + +
okay looks fine
diff -r 2d1278bdf31f src/libvirt_public.syms --- a/src/libvirt_public.syms Fri Apr 24 11:01:11 2009 +0100 +++ b/src/libvirt_public.syms Fri Apr 24 13:06:12 2009 +0100 @@ -258,4 +258,10 @@ LIBVIRT_0.6.1 { virNodeGetSecurityModel; } LIBVIRT_0.6.0;
+LIBVIRT_0.6.3 { + global: + virNodeDeviceCreateXML; + virNodeDeviceDestroy; +} LIBVIRT_0.6.1; + # .... define new API here using predicted next version number ....
fine too
diff -r 2d1278bdf31f src/remote_internal.c --- a/src/remote_internal.c Fri Apr 24 11:01:11 2009 +0100 +++ b/src/remote_internal.c Fri Apr 24 13:06:12 2009 +0100
okay. ACK, fine for commit, though if you could double check the couple or questions raised, thanks ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On Fri, Apr 24, 2009 at 02:28:37PM +0200, Daniel Veillard wrote:
diff -r 2d1278bdf31f qemud/remote_dispatch_table.h --- a/qemud/remote_dispatch_table.h Fri Apr 24 11:01:11 2009 +0100 +++ b/qemud/remote_dispatch_table.h Fri Apr 24 13:06:12 2009 +0100 [...] -{ /* DomainGetSecurityLabel => 118 */ +{ /* DomainGetSecurityLabel => 121 */ [...] -{ /* NodeGetSecurityModel => 119 */ +{ /* NodeGetSecurityModel => 122 */
Any reason for the renumbering even though it seems harmless ?
That's a bug in the current code in CVS - result of a merge mistake. It is harmless because this is just a comment.
+/** + * virNodeDeviceCreateXML: + * @conn: pointer to the hypervisor connection + * @xmlDesc: string containing an XML description of the device to be created + * @flags: callers should always pass 0 + * + * Create a new device on the VM host machine, for example, virtual + * HBAs created using vport_create. + * + * Returns a node device object if successful, NULL in case of failure + */ +virNodeDevicePtr +virNodeDeviceCreateXML(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags) +{ + VIR_DEBUG("conn=%p, xmlDesc=%s, flags=%d", conn, xmlDesc, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECT(conn)) { + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__); + return NULL; + } + + if (conn->flags & VIR_CONNECT_RO) { + virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (xmlDesc == NULL) { + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__); + goto error; + } + + if (conn->deviceMonitor->deviceCreateXML) {
are we always 100% sure conn->deviceMonitor is non NULL ?
Yep, that needs an additional check 'conn->deviceMonitor != NULL'
+ virNodeDevicePtr dev = conn->deviceMonitor->deviceCreateXML(conn, xmlDesc, flags); + if (dev == NULL) + goto error; + return dev; + } + + virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(conn); + return NULL; +} + + +/** + * virNodeDeviceDestroy: + * @dev: a device object + * + * Destroy the device object. The virtual device is removed from the host operating system. + * This function may require privileged access + * + * Returns 0 in case of success and -1 in case of failure. + */ +int +virNodeDeviceDestroy(virNodeDevicePtr dev) +{ + int retval = 0; + + DEBUG("dev=%p", dev); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) { + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); + return (-1); + } + + if (dev->conn->flags & VIR_CONNECT_RO) { + virLibConnError(dev->conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__); + goto error; + } + + if (dev->conn->deviceMonitor->deviceDestroy) { + retval = dev->conn->deviceMonitor->deviceDestroy(dev); + if (retval < 0) { + goto error; + } + + return 0; + } + + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dev->conn); + return -1; +} + +
Likewise this needs a check for deviceMOnitor != NULL Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On Fri, Apr 24, 2009 at 01:33:47PM +0100, Daniel P. Berrange wrote:
On Fri, Apr 24, 2009 at 02:28:37PM +0200, Daniel Veillard wrote:
+ if (conn->deviceMonitor->deviceCreateXML) {
are we always 100% sure conn->deviceMonitor is non NULL ?
Yep, that needs an additional check 'conn->deviceMonitor != NULL'
okay
+ if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) { + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); + return (-1); + } [...] + if (dev->conn->deviceMonitor->deviceDestroy) { + retval = dev->conn->deviceMonitor->deviceDestroy(dev); + if (retval < 0) { + goto error; + } + + return 0; + } + + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + /* Copy to connection error object for back compatability */ + virSetConnError(dev->conn); + return -1; +} + +
Likewise this needs a check for deviceMOnitor != NULL
Ah, right I somehow expected that VIR_IS_CONNECTED_NODE_DEVICE would check this, just confusion :-) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Daniel Veillard wrote:
On Fri, Apr 24, 2009 at 01:08:30PM +0100, Daniel P. Berrange wrote:
As previously discussed, Dave Allen's reworking the NPIV patches to do creation/deleation of vports via the node device APIs. Thus, this patch adds the 2 new APIs required for this approach.
I would really prefer to see this API in 0.6.3, even if there is no backend implementation, this should ease our work and also allow other people with distinct node storage implementation to provide patches for this too. For this reason I would prefer to see the API go in as earlier as possible in an official release to allow people to work on those as needed.
For my part, I'm ok with having the API in 0.6.3, as it is not going to change as I work on the backend implementation. Dave
participants (3)
-
Daniel P. Berrange
-
Daniel Veillard
-
Dave Allan