]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
bhyve: domainCreateXML
authorWojciech Macek <wma@semihalf.com>
Thu, 10 Apr 2014 09:06:38 +0000 (11:06 +0200)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Sun, 20 Apr 2014 07:16:44 +0000 (11:16 +0400)
Implement bhyveDomainCreateXML function.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
src/bhyve/bhyve_driver.c

index fd8c248435c83a5ef79e5bcf0b183d86250f785d..0cafe4cc41d94eda29e252b6d0dc8dbc2874e883 100644 (file)
@@ -732,6 +732,65 @@ bhyveDomainCreate(virDomainPtr dom)
     return bhyveDomainCreateWithFlags(dom, 0);
 }
 
+static virDomainPtr
+bhyveDomainCreateXML(virConnectPtr conn,
+                     const char *xml,
+                     unsigned int flags)
+{
+    bhyveConnPtr privconn = conn->privateData;
+    virDomainPtr dom = NULL;
+    virDomainDefPtr def = NULL;
+    virDomainObjPtr vm = NULL;
+    virCapsPtr caps = NULL;
+    unsigned int start_flags = 0;
+
+    virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
+
+    if (flags & VIR_DOMAIN_START_AUTODESTROY)
+        start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY;
+
+    caps = bhyveDriverGetCapabilities(privconn);
+    if (!caps)
+        return NULL;
+
+    if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,
+                                       1 << VIR_DOMAIN_VIRT_BHYVE,
+                                       VIR_DOMAIN_XML_INACTIVE)) == NULL)
+        goto cleanup;
+
+    if (virDomainCreateXMLEnsureACL(conn, def) < 0)
+        goto cleanup;
+
+    if (!(vm = virDomainObjListAdd(privconn->domains, def,
+                                   privconn->xmlopt,
+                                   VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL)))
+        goto cleanup;
+    def = NULL;
+
+    if (virBhyveProcessStart(conn, privconn, vm,
+                             VIR_DOMAIN_RUNNING_BOOTED,
+                             start_flags) < 0) {
+        /* If domain is not persistent, remove its data */
+        if (!vm->persistent) {
+            virDomainObjListRemove(privconn->domains, vm);
+            vm = NULL;
+        }
+        goto cleanup;
+    }
+
+    dom = virGetDomain(conn, vm->def->name, vm->def->uuid);
+    if (dom)
+        dom->id = vm->def->id;
+
+ cleanup:
+    virObjectUnref(caps);
+    virDomainDefFree(def);
+    if (vm)
+        virObjectUnlock(vm);
+
+    return dom;
+}
+
 static int
 bhyveDomainDestroy(virDomainPtr dom)
 {
@@ -1124,6 +1183,7 @@ static virDriver bhyveDriver = {
     .connectNumOfDefinedDomains = bhyveConnectNumOfDefinedDomains, /* 1.2.2 */
     .domainCreate = bhyveDomainCreate, /* 1.2.2 */
     .domainCreateWithFlags = bhyveDomainCreateWithFlags, /* 1.2.3 */
+    .domainCreateXML = bhyveDomainCreateXML, /* 1.2.4 */
     .domainDestroy = bhyveDomainDestroy, /* 1.2.2 */
     .domainLookupByUUID = bhyveDomainLookupByUUID, /* 1.2.2 */
     .domainLookupByName = bhyveDomainLookupByName, /* 1.2.2 */