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 | 9 +++++++++ docs/schemas/domaincommon.rng | 20 ++++++++++++++++++++ src/conf/domain_conf.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 15 +++++++++++++++ 4 files changed, 84 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 51f897c..b4050cf 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -106,6 +106,7 @@ <bootmenu enable='yes'/> <smbios mode='sysinfo'/> <bios useserial='yes'/> + <reboot-timeout enabled='yes' delay='0'/> </os> ...</pre> @@ -177,6 +178,14 @@ <a href="#elementCharSerial">serial port</a> defined. <span class="since">Since 0.9.4</span> </dd> + <dt><code>reboot-timeout</code></dt> + <dd>This element controls whether and after how long the guest should + start booting again in case the boot fails (according to BIOS). The + feature depends on mandatory parameter <code>enabled</enabled> with + values <code>yes</code> and <code>no</code>. When enabled, value of + the second parameter <code>delay</code> (in milliseconds) controls how + long before the boot starts again. Maximum delay is <code>65535</code> + milliseconds. <span class="since">QEMU since 0.10.2.</span></dd> </dl> <h4><a name="elementsOSBootloader">Host bootloader</a></h4> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index aafb10c..af3d856 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -264,6 +264,9 @@ <optional> <ref name="bios"/> </optional> + <optional> + <ref name="reboot-timeout"/> + </optional> </interleave> </element> </define> @@ -3199,6 +3202,23 @@ </element> </define> + <define name="reboot-timeout"> + <element name="reboot-timeout"> + <attribute name="enabled"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + <optional> + <attribute name="delay"> + <ref name="unsignedShort"/> + </attribute> + </optional> + <empty/> + </element> + </define> + <define name="address"> <element name="address"> <choice> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 35814fb..98a39bb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -107,6 +107,11 @@ VIR_ENUM_IMPL(virDomainBootMenu, VIR_DOMAIN_BOOT_MENU_LAST, "yes", "no") +VIR_ENUM_IMPL(virDomainRebootTimeout, VIR_DOMAIN_REBOOT_TIMEOUT_LAST, + "default", + "yes", + "no") + VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, "acpi", "apic", @@ -9788,6 +9793,32 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, def->os.smbios_mode = VIR_DOMAIN_SMBIOS_NONE; /* not present */ } + tmp = virXPathString("string(./os/reboot-timeout/@enabled)", ctxt); + if (tmp) { + int num = virDomainRebootTimeoutTypeFromString(tmp); + + if (num < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown value for reboot-timeout " + "enabled parameter '%s'"), tmp); + goto error; + } + + VIR_FREE(tmp); + def->os.rebootTimeout.enabled = num; + + if (num == VIR_DOMAIN_REBOOT_TIMEOUT_ENABLED) { + if (virXPathInt("string(./os/reboot-timeout/@delay)", ctxt, &num) < 0 || + num < 0 || num > 0xffff) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("reboot-timeout delay value must " + "be in range [0,65535] and not")); + goto error; + } + def->os.rebootTimeout.delay = num; + } + } + /* Extract custom metadata */ if ((node = virXPathNode("./metadata[1]", ctxt)) != NULL) { def->metadata = xmlCopyNode(node, 1); @@ -13514,6 +13545,15 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAsprintf(buf, " <smbios mode='%s'/>\n", mode); } + if (def->os.rebootTimeout.enabled) { + virBufferAsprintf(buf, " <reboot-timeout enabled='%s'", + virDomainRebootTimeoutTypeToString(def->os.rebootTimeout.enabled)); + if (def->os.rebootTimeout.enabled == VIR_DOMAIN_REBOOT_TIMEOUT_ENABLED) + virBufferAsprintf(buf, " delay='%d'", + def->os.rebootTimeout.delay); + virBufferAddLit(buf, "/>\n"); + } + virBufferAddLit(buf, " </os>\n"); if (def->features) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 510406a..c831d6d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1363,6 +1363,14 @@ enum virDomainBootMenu { VIR_DOMAIN_BOOT_MENU_LAST }; +enum virDomainRebootTimeout { + VIR_DOMAIN_REBOOT_TIMEOUT_DEFAULT = 0, + VIR_DOMAIN_REBOOT_TIMEOUT_ENABLED, + VIR_DOMAIN_REBOOT_TIMEOUT_DISABLED, + + VIR_DOMAIN_REBOOT_TIMEOUT_LAST +}; + enum virDomainFeature { VIR_DOMAIN_FEATURE_ACPI, VIR_DOMAIN_FEATURE_APIC, @@ -1444,6 +1452,12 @@ struct _virDomainOSDef { char *bootloaderArgs; int smbios_mode; + struct { + /* enum virDomainRebootTimeout */ + int enabled; + int delay; + } rebootTimeout; + virDomainBIOSDef bios; }; @@ -2134,6 +2148,7 @@ VIR_ENUM_DECL(virDomainTaint) VIR_ENUM_DECL(virDomainVirt) VIR_ENUM_DECL(virDomainBoot) VIR_ENUM_DECL(virDomainBootMenu) +VIR_ENUM_DECL(virDomainRebootTimeout) VIR_ENUM_DECL(virDomainFeature) VIR_ENUM_DECL(virDomainApicEoi) VIR_ENUM_DECL(virDomainLifecycle) -- 1.7.12 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list