[libvirt] [PATCH 2/4] Add support for reboot-timeout

Michal Privoznik mprivozn at redhat.com
Tue Sep 18 16:45:10 UTC 2012


On 18.09.2012 17:36, 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     |  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>


Milliseconds is a bit overkill (too fine) for me. But I can see where is
this coming from. So I can live with that.

> 
>      <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>
> +

Do we need 'enabled' and 'delay' at the same time? I mean, what if
'delay' would take [-1,65535] with -1 meaning its disabled?



>    <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) {

s/0xffff/65535/

> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("reboot-timeout delay value must "
> +                                 "be in range [0,65535] and not"));

unfinished sentence

> +                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)
> 

Take this as half ACK; I mean, the code is okay, but I am not sure about
XML. Does anybody have any suggestions?

Michal




More information about the libvir-list mailing list