[libvirt] [PATCH 1/5] Public API to allow defining new domain using OVA file

Ata E Husain Bohra ata.husain at hotmail.com
Sun Jan 6 07:33:51 UTC 2013


Appends a new API to libvirt public driver that supports
defining a new domain using OVA format.

API expects following inputs:
1. connection pointer.
2. path to OVA package (single file format).
3. Storage pool name where new domain needs to be created.

API returns pointers to newly created domain that is not powered ON.

Libvirt driver sanitizes the inputs and calls hypervisor specific
driver callbacks to abstract OVA install implementation.
---
 include/libvirt/libvirt.h.in |    3 +++
 src/driver.h                 |    5 ++++
 src/libvirt.c                |   58 ++++++++++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms      |    5 ++++
 4 files changed, 71 insertions(+)

diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 09c89c5..ea342bc 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -1919,6 +1919,9 @@ int                     virDomainMemoryPeek (virDomainPtr dom,
  */
 virDomainPtr            virDomainDefineXML      (virConnectPtr conn,
                                                  const char *xml);
+virDomainPtr            virDomainDefineOVA      (virConnectPtr conn,
+                                                 const char *ovapath,
+                                                 const char *poolname);
 int                     virDomainUndefine       (virDomainPtr domain);
 
 typedef enum {
diff --git a/src/driver.h b/src/driver.h
index 01c95cf..08382a0 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -274,6 +274,10 @@ typedef int
 typedef virDomainPtr
         (*virDrvDomainDefineXML)        (virConnectPtr conn,
                                          const char *xml);
+typedef virDomainPtr
+        (*virDrvDomainDefineOVA)        (virConnectPtr conn,
+                                         const char *ovapath,
+                                         const char *poolname);
 typedef int
         (*virDrvDomainUndefine)         (virDomainPtr dom);
 typedef int
@@ -1008,6 +1012,7 @@ struct _virDriver {
     virDrvDomainCreate                  domainCreate;
     virDrvDomainCreateWithFlags         domainCreateWithFlags;
     virDrvDomainDefineXML               domainDefineXML;
+    virDrvDomainDefineOVA               domainDefineOVA;
     virDrvDomainUndefine                domainUndefine;
     virDrvDomainUndefineFlags           domainUndefineFlags;
     virDrvDomainAttachDevice            domainAttachDevice;
diff --git a/src/libvirt.c b/src/libvirt.c
index 6d1da12..bdc21b4 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1988,6 +1988,8 @@ error:
     return NULL;
 }
 
+
+
 /**
  * virDomainCreateLinux:
  * @conn: pointer to the hypervisor connection
@@ -8334,6 +8336,62 @@ error:
 }
 
 /**
+ * virDomainDefineOVA:
+ * @conn: pointer to the hypervisor connection
+ * @ovapath: OVA file path
+ * @poolname: storage pool where domain needs to be created
+ *
+ * OVA stands for Open Virtualuzation Archive and consist of
+ * three important components:
+ * 1. XML descriptor: defines the virtual machine hardware description,
+ *                    network connectivity etc.
+ * 2. Virtual disk (may be compressed or optimized).
+ * 3. Manifest file.
+ *
+ * Define a new domain but does not start it.
+ * This function may require privileged access to the hypervisor.
+ *
+ * Returns a new domain object or NULL in case of failure
+ */
+virDomainPtr
+virDomainDefineOVA(virConnectPtr conn, const char *ovapath,
+                   const char *poolname)
+{
+    VIR_DEBUG("conn=%p, ovaPath=%s, poolname=%s",
+      conn, ovapath, poolname);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECT(conn)) {
+        virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
+        virDispatchError(NULL);
+        return NULL;
+    }
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibConnError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+    virCheckNonNullArgGoto(ovapath, error);
+    virCheckNonNullArgGoto(poolname, error);
+
+    if (conn->driver->domainDefineOVA) {
+        virDomainPtr ret;
+        ret = conn->driver->domainDefineOVA(
+                        conn, ovapath, poolname);
+        if (!ret)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return NULL;
+
+}
+
+/**
  * virDomainCreate:
  * @domain: pointer to a defined domain
  *
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 2107519..1af48c9 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -585,4 +585,9 @@ LIBVIRT_1.0.2 {
         virDomainOpenChannel;
 } LIBVIRT_1.0.1;
 
+LIBVIRT_1.0.3 {
+    global:
+        virDomainDefineOVA;
+} LIBVIRT_1.0.2;
+
 # .... define new API here using predicted next version number ....
-- 
1.7.9.5




More information about the libvir-list mailing list