[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libvir] Autostarting guests and networks



Hey,
	We need some way to have libvirtd automatically start guests and
networks.

	We had said we should have autostart directories containing config
files of guests/networks which should be autostarted. One problem I see
with that is that we'd need a new API to define autostart configs.

	So, I suggest we add an "autostart" flag to the toplevel element of the
configs.

	We could discuss this one at length and I, for one, don't like using
the XML format as an API like this, but ... comments?

Cheers,
Mark.
Index: libvirt/qemud/conf.c
===================================================================
--- libvirt.orig/qemud/conf.c
+++ libvirt/qemud/conf.c
@@ -555,6 +555,14 @@ static struct qemud_vm_def *qemudParseXM
     prop = NULL;
 
 
+    /* Extract autostart attribute */
+    obj = xmlXPathEval(BAD_CAST "/domain/@autostart='true'", ctxt);
+    if (obj && obj->type == XPATH_BOOLEAN && obj->boolval) {
+        def->autostart = 1;
+    }
+    xmlXPathFreeObject(obj);
+
+
     /* Extract domain name */
     obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
     if ((obj == NULL) || (obj->type != XPATH_STRING) ||
@@ -1459,6 +1467,14 @@ static struct qemud_network_def *qemudPa
     }
 
 
+    /* Extract autostart attribute */
+    obj = xmlXPathEval(BAD_CAST "/network/@autostart='true'", ctxt);
+    if (obj && obj->type == XPATH_BOOLEAN && obj->boolval) {
+        def->autostart = 1;
+    }
+    xmlXPathFreeObject(obj);
+
+
     /* Extract network name */
     obj = xmlXPathEval(BAD_CAST "string(/network/name[1])", ctxt);
     if ((obj == NULL) || (obj->type != XPATH_STRING) ||
@@ -1665,11 +1681,44 @@ int qemudScanConfigDir(struct qemud_serv
     return 0;
 }
 
+static
+void qemudAutostartConfigs(struct qemud_server *server) {
+    struct qemud_network *network;
+    struct qemud_vm *vm;
+
+    network = server->inactivenetworks;
+    while (network != NULL) {
+        struct qemud_network *next = network->next;
+
+        if (network->def->autostart &&
+            qemudNetworkStart(server, network))
+            qemudLog(QEMUD_ERR, "Failed to autostart network '%s'",
+                     network->def->name);
+
+        network = next;
+    }
+
+    vm = server->inactivevms;
+    while (vm != NULL) {
+        struct qemud_vm *next = vm->next;
+
+        if (vm->def->autostart &&
+            qemudDomainStart(server, vm))
+            qemudLog(QEMUD_ERR, "Failed to autostart VM '%s'",
+                     vm->def->name);
+
+        vm = next;
+    }
+}
+
 /* Scan for all guest and network config files */
 int qemudScanConfigs(struct qemud_server *server) {
     if (qemudScanConfigDir(server, server->configDir, 1) < 0)
         return -1;
-    return qemudScanConfigDir(server, server->networkConfigDir, 0);
+    if (qemudScanConfigDir(server, server->networkConfigDir, 0) < 0)
+        return -1;
+    qemudAutostartConfigs(server);
+    return 0;
 }
 
 /* Simple grow-on-demand string buffer */
@@ -1751,13 +1800,17 @@ char *qemudGenerateXML(struct qemud_serv
         goto cleanup;
     }
 
-    if (vm->id >= 0 && live) {
-        if (qemudBufferPrintf(&buf, "<domain type='%s' id='%d'>\n", type, vm->id) < 0)
+    if (qemudBufferPrintf(&buf, "<domain type='%s'", type) < 0)
+        goto no_memory;
+
+    if (vm->id >= 0 && live && qemudBufferPrintf(&buf, " id='%d'", vm->id) < 0)
+        goto no_memory;
+
+    if (def->autostart && qemudBufferAdd(&buf, " autostart='true'") < 0)
             goto no_memory;
-    } else {
-        if (qemudBufferPrintf(&buf, "<domain type='%s'>\n", type) < 0)
+
+    if (qemudBufferAdd(&buf, ">\n") < 0)
             goto no_memory;
-    }
 
     if (qemudBufferPrintf(&buf, "  <name>%s</name>\n", def->name) < 0)
         goto no_memory;
@@ -1967,7 +2020,13 @@ char *qemudGenerateNetworkXML(struct qem
     buf.used = 0;
     buf.data = malloc(buf.len);
 
-    if (qemudBufferPrintf(&buf, "<network>\n") < 0)
+    if (qemudBufferAdd(&buf, "<network") < 0)
+        goto no_memory;
+
+    if (def->autostart && qemudBufferAdd(&buf, " autostart='true'") < 0)
+        goto no_memory;
+
+    if (qemudBufferAdd(&buf, ">\n") < 0)
         goto no_memory;
 
     if (qemudBufferPrintf(&buf, "  <name>%s</name>\n", def->name) < 0)
Index: libvirt/qemud/internal.h
===================================================================
--- libvirt.orig/qemud/internal.h
+++ libvirt/qemud/internal.h
@@ -176,6 +176,8 @@ struct qemud_vm_def {
     unsigned char uuid[QEMUD_UUID_RAW_LEN];
     char name[QEMUD_MAX_NAME_LEN];
 
+    unsigned int autostart : 1;
+
     int memory;
     int maxmem;
     int vcpus;
@@ -226,6 +228,8 @@ struct qemud_network_def {
     unsigned char uuid[QEMUD_UUID_RAW_LEN];
     char name[QEMUD_MAX_NAME_LEN];
 
+    unsigned int autostart : 1;
+
     char bridge[BR_IFNAME_MAXLEN];
     int disableSTP;
     int forwardDelay;

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]