Add support for reboot-timeout

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.
This commit is contained in:
Martin Kletzander 2012-09-18 12:30:52 +02:00
parent ede89aab64
commit c33a922faa
4 changed files with 56 additions and 15 deletions

View File

@ -105,7 +105,7 @@
<boot dev='cdrom'/>
<bootmenu enable='yes'/>
<smbios mode='sysinfo'/>
<bios useserial='yes'/>
<bios useserial='yes' rebootTimeout='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>rebootTimeout</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>

View File

@ -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="rebootTimeout">
<ref name="rebootTimeoutDelay"/>
</attribute>
</optional>
</element>
</define>
@ -3469,6 +3476,11 @@
<param name='minInclusive'>-1</param>
</data>
</define>
<define name="rebootTimeoutDelay">
<data type="short">
<param name="minInclusive">-1</param>
</data>
</define>
<define name="PortNumber">
<data type="short">
<param name="minInclusive">-1</param>

View File

@ -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,10 +8214,25 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
}
}
tmp = virXPathString("string(./os/bios[1]/@rebootTimeout)", ctxt);
if (tmp) {
/* that was really just for the check if it is there */
if (virStrToLong_i(tmp, NULL, 0, &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 rebootTimeout, "
"must be in range [-1,65535]"));
goto cleanup;
}
def->os.bios.rt_set = true;
}
*bootCount = deviceBoot;
ret = 0;
cleanup:
VIR_FREE(tmp);
VIR_FREE(useserial);
VIR_FREE(nodes);
return ret;
@ -13494,11 +13509,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, " rebootTimeout='%d'", def->os.bios.rt_delay);
virBufferAddLit(buf, "/>\n");
}
}

View File

@ -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 */