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

Daniel P. Berrange berrange at redhat.com
Fri Apr 24 12:08:30 UTC 2009


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 :|




More information about the libvir-list mailing list