On 09/19/12 19:22, Martin Kletzander wrote:
Whenever the guest machine fails to boot, new parameter
(reboot-timeout)
controls whether it should reboot and after how many ms it should do so.
Docs included.
---
docs/formatdomain.html.in | 11 ++++++++---
docs/schemas/domaincommon.rng | 24 ++++++++++++++++++------
src/conf/domain_conf.c | 34 ++++++++++++++++++++++++++++------
src/conf/domain_conf.h | 3 +++
4 files changed, 57 insertions(+), 15 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 51f897c..d021837 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -105,7 +105,7 @@
<boot dev='cdrom'/>
<bootmenu enable='yes'/>
<smbios mode='sysinfo'/>
- <bios useserial='yes'/>
+ <bios useserial='yes' reboot-timeout='0'/>
</os>
...</pre>
@@ -175,8 +175,13 @@
Serial Graphics Adapter which allows users to see BIOS messages
on a serial port. Therefore, one needs to have
<a href="#elementCharSerial">serial port</a> defined.
- <span class="since">Since 0.9.4</span>
- </dd>
+ <span class="since">Since 0.9.4</span>.
+ <span class="since">Since 0.10.2 (QEMU only)</span> there
is
+ another attribute, <code>reboot-timeout</code> that controls
+ whether and after how long the guest should start booting
+ again in case the boot fails (according to BIOS). The value is
+ in milliseconds with maximum of <code>65535</code> and special
+ value <code>-1</code> disables the reboot.
</dl>
<h4><a name="elementsOSBootloader">Host
bootloader</a></h4>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index aafb10c..ed25f58 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3190,12 +3190,19 @@
<define name="bios">
<element name="bios">
- <attribute name="useserial">
- <choice>
- <value>yes</value>
- <value>no</value>
- </choice>
- </attribute>
+ <optional>
+ <attribute name="useserial">
+ <choice>
+ <value>yes</value>
+ <value>no</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="reboot-timeout">
As DanPB pointed out, this should be changed to camel case.
+ <ref name="RebootTimeout"/>
+ </attribute>
+ </optional>
</element>
</define>
@@ -3469,6 +3476,11 @@
<param name='minInclusive'>-1</param>
</data>
</define>
+ <define name="RebootTimeout">
+ <data type="short">
+ <param name="minInclusive">-1</param>
+ </data>
+ </define>
<define name="PortNumber">
<data type="short">
<param name="minInclusive">-1</param>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 35814fb..4714312 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8136,7 +8136,7 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
{
xmlNodePtr *nodes = NULL;
int i, n;
- char *bootstr;
+ char *bootstr, *tmp;
char *useserial = NULL;
int ret = -1;
unsigned long deviceBoot, serialPorts;
@@ -8214,6 +8214,22 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
}
}
+ tmp = virXPathString("string(./os/bios[1]/@reboot-timeout)", ctxt);
+ if (tmp) {
+ /* that was really just for the check if it is there */
+ VIR_FREE(tmp);
+
+ if ((virXPathInt("string(./os/bios[1]/@reboot-timeout)",
Ew. Doing the XPath query twice seems like a waste to me. What about
using virStrToLong_i on the string instead of querying again?
+ ctxt, &def->os.bios.rt_delay) <
0) ||
+ def->os.bios.rt_delay < -1 || def->os.bios.rt_delay > 65535) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("invalid value for reboot-timeout, "
+ "must be in range [-1,65535]"));
+ goto cleanup;
+ }
+ def->os.bios.rt_set = true;
+ }
+
*bootCount = deviceBoot;
ret = 0;
@@ -13494,11 +13510,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virBufferAsprintf(buf, " <bootmenu
enable='%s'/>\n", enabled);
}
- if (def->os.bios.useserial) {
- const char *useserial = (def->os.bios.useserial ==
- VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes"
- : "no");
- virBufferAsprintf(buf, " <bios
useserial='%s'/>\n", useserial);
+ if (def->os.bios.useserial || def->os.bios.rt_set) {
+ virBufferAddLit(buf, " <bios");
+ if (def->os.bios.useserial)
+ virBufferAsprintf(buf, " useserial='%s'",
+ (def->os.bios.useserial ==
+ VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes"
+ : "no"));
+ if (def->os.bios.rt_set)
+ virBufferAsprintf(buf, " reboot-timeout='%d'",
def->os.bios.rt_delay);
+
+ virBufferAddLit(buf, "/>\n");
}
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 510406a..d719d57 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1420,6 +1420,9 @@ typedef struct _virDomainBIOSDef virDomainBIOSDef;
typedef virDomainBIOSDef *virDomainBIOSDefPtr;
struct _virDomainBIOSDef {
int useserial;
+ /* reboot-timeout parameters */
+ bool rt_set;
+ int rt_delay;
};
/* Operating system configuration data & machine / arch */
ACK if you don't do the xpath query twice and (carefully) rename the
element.
Peter