a new name</dd>
</dl>
+ <p>
+ on_crash supports these additional
+ actions <span class="since">since 0.8.4</span>.
+ </p>
+
+ <dl>
+ <dt><code>coredump-destroy</code></dt>
+ <dd>The crashed domain's core will be dumped, and then the
+ domain will be terminated completely and all resources
+ released</dd>
+ <dt><code>coredump-restart</code></dt>
+ <dd>The crashed domain's core will be dumped, and then the
+ domain will be restarted with the same configuration</dd>
+ </dl>
+
<h3><a name="elementsFeatures">Hypervisor features</a></h3>
<p>
</optional>
<optional>
<element name="on_crash">
- <ref name="offOptions"/>
+ <ref name="crashOptions"/>
</element>
</optional>
</interleave>
<value>rename-restart</value>
</choice>
</define>
+ <!--
+ Options when a domain crashes:
+ destroy: The domain is cleaned up
+ restart: A new domain is started in place of the old one
+ preserve: The domain will remain in memory until it is destroyed manually
+ rename-restart: a variant of the previous one but where the old domain is
+ renamed before being saved to allow a restart
+ coredump-destroy: The crashed domain's core will be dumped, and then the
+ domain will be terminated completely and all resources
+ released
+ coredump-restart: The crashed domain's core will be dumped, and then the
+ domain will be restarted with the same configuration
+ -->
+ <define name="crashOptions">
+ <choice>
+ <value>destroy</value>
+ <value>restart</value>
+ <value>preserve</value>
+ <value>rename-restart</value>
+ <value>coredump-destroy</value>
+ <value>coredump-restart</value>
+ </choice>
+ </define>
<!--
Specific setup for a qemu emulated character device. Note: this
definition doesn't fully specify the constraints on this node.
"rename-restart",
"preserve")
+VIR_ENUM_IMPL(virDomainLifecycleCrash, VIR_DOMAIN_LIFECYCLE_CRASH_LAST,
+ "destroy",
+ "restart",
+ "rename-restart",
+ "preserve",
+ "coredump-destroy",
+ "coredump-restart")
+
VIR_ENUM_IMPL(virDomainDevice, VIR_DOMAIN_DEVICE_LAST,
"disk",
"filesystem",
static int virDomainLifecycleParseXML(xmlXPathContextPtr ctxt,
const char *xpath,
int *val,
- int defaultVal)
+ int defaultVal,
+ virLifecycleFromStringFunc convFunc)
{
char *tmp = virXPathString(xpath, ctxt);
if (tmp == NULL) {
*val = defaultVal;
} else {
- *val = virDomainLifecycleTypeFromString(tmp);
+ *val = convFunc(tmp);
if (*val < 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("unknown lifecycle action %s"), tmp);
}
if (virDomainLifecycleParseXML(ctxt, "string(./on_reboot[1])",
- &def->onReboot, VIR_DOMAIN_LIFECYCLE_RESTART) < 0)
+ &def->onReboot, VIR_DOMAIN_LIFECYCLE_RESTART,
+ virDomainLifecycleTypeFromString) < 0)
goto error;
if (virDomainLifecycleParseXML(ctxt, "string(./on_poweroff[1])",
- &def->onPoweroff, VIR_DOMAIN_LIFECYCLE_DESTROY) < 0)
+ &def->onPoweroff, VIR_DOMAIN_LIFECYCLE_DESTROY,
+ virDomainLifecycleTypeFromString) < 0)
goto error;
if (virDomainLifecycleParseXML(ctxt, "string(./on_crash[1])",
- &def->onCrash, VIR_DOMAIN_LIFECYCLE_DESTROY) < 0)
+ &def->onCrash,
+ VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY,
+ virDomainLifecycleCrashTypeFromString) < 0)
goto error;
tmp = virXPathString("string(./clock/@offset)", ctxt);
static int
virDomainLifecycleDefFormat(virBufferPtr buf,
int type,
- const char *name)
+ const char *name,
+ virLifecycleToStringFunc convFunc)
{
- const char *typeStr = virDomainLifecycleTypeToString(type);
+ const char *typeStr = convFunc(type);
if (!typeStr) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected lifecycle type %d"), type);
}
if (virDomainLifecycleDefFormat(&buf, def->onPoweroff,
- "on_poweroff") < 0)
+ "on_poweroff",
+ virDomainLifecycleTypeToString) < 0)
goto cleanup;
if (virDomainLifecycleDefFormat(&buf, def->onReboot,
- "on_reboot") < 0)
+ "on_reboot",
+ virDomainLifecycleTypeToString) < 0)
goto cleanup;
if (virDomainLifecycleDefFormat(&buf, def->onCrash,
- "on_crash") < 0)
+ "on_crash",
+ virDomainLifecycleCrashTypeToString) < 0)
goto cleanup;
virBufferAddLit(&buf, " <devices>\n");
VIR_DOMAIN_LIFECYCLE_LAST
};
+enum virDomainLifecycleCrashAction {
+ VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY,
+ VIR_DOMAIN_LIFECYCLE_CRASH_RESTART,
+ VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME,
+ VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE,
+ VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY,
+ VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART,
+
+ VIR_DOMAIN_LIFECYCLE_CRASH_LAST
+};
+
/* Operating system configuration data & machine / arch */
typedef struct _virDomainOSDef virDomainOSDef;
typedef virDomainOSDef *virDomainOSDefPtr;
virDomainDiskDefPathIterator iter,
void *opaque);
+typedef const char* (*virLifecycleToStringFunc)(int type);
+typedef int (*virLifecycleFromStringFunc)(const char *type);
+
VIR_ENUM_DECL(virDomainVirt)
VIR_ENUM_DECL(virDomainBoot)
VIR_ENUM_DECL(virDomainFeature)
VIR_ENUM_DECL(virDomainLifecycle)
+VIR_ENUM_DECL(virDomainLifecycleCrash)
VIR_ENUM_DECL(virDomainDevice)
VIR_ENUM_DECL(virDomainDeviceAddress)
VIR_ENUM_DECL(virDomainDeviceAddressMode)
tmp = sexpr_node(root, "domain/on_crash");
if (tmp != NULL) {
- if ((def->onCrash = virDomainLifecycleTypeFromString(tmp)) < 0) {
+ if ((def->onCrash = virDomainLifecycleCrashTypeFromString(tmp)) < 0) {
virXendError(VIR_ERR_INTERNAL_ERROR,
_("unknown lifecycle type %s"), tmp);
goto error;
}
virBufferVSprintf(&buf, "(on_reboot '%s')", tmp);
- if (!(tmp = virDomainLifecycleTypeToString(def->onCrash))) {
+ if (!(tmp = virDomainLifecycleCrashTypeToString(def->onCrash))) {
virXendError(VIR_ERR_INTERNAL_ERROR,
_("unexpected lifecycle value %d"), def->onCrash);
goto error;
if (xenXMConfigGetString(conf, "on_crash", &str, "restart") < 0)
goto cleanup;
- if ((def->onCrash = virDomainLifecycleTypeFromString(str)) < 0) {
+ if ((def->onCrash = virDomainLifecycleCrashTypeFromString(str)) < 0) {
xenXMError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %s for on_crash"), str);
goto cleanup;
goto no_memory;
- if (!(lifecycle = virDomainLifecycleTypeToString(def->onCrash))) {
+ if (!(lifecycle = virDomainLifecycleCrashTypeToString(def->onCrash))) {
xenXMError(VIR_ERR_INTERNAL_ERROR,
_("unexpected lifecycle action %d"), def->onCrash);
goto cleanup;
enum xen_on_crash_behaviour
-actionCrashLibvirt2XenapiEnum(enum virDomainLifecycleAction action)
+actionCrashLibvirt2XenapiEnum(enum virDomainLifecycleCrashAction action)
{
enum xen_on_crash_behaviour num = XEN_ON_CRASH_BEHAVIOUR_RESTART;
- if (action == VIR_DOMAIN_LIFECYCLE_DESTROY)
+ if (action == VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY)
num = XEN_ON_CRASH_BEHAVIOUR_DESTROY;
- else if (action == VIR_DOMAIN_LIFECYCLE_RESTART)
+ else if (action == VIR_DOMAIN_LIFECYCLE_CRASH_RESTART)
num = XEN_ON_CRASH_BEHAVIOUR_RESTART;
- else if (action == VIR_DOMAIN_LIFECYCLE_PRESERVE)
+ else if (action == VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE)
num = XEN_ON_CRASH_BEHAVIOUR_PRESERVE;
- else if (action == VIR_DOMAIN_LIFECYCLE_RESTART_RENAME)
+ else if (action == VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME)
num = XEN_ON_CRASH_BEHAVIOUR_RENAME_RESTART;
+ else if (action == VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY)
+ num = XEN_ON_CRASH_BEHAVIOUR_COREDUMP_AND_DESTROY;
+ else if (action == VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART)
+ num = XEN_ON_CRASH_BEHAVIOUR_COREDUMP_AND_RESTART;
return num;
}
}
-enum virDomainLifecycleAction
+enum virDomainLifecycleCrashAction
xenapiCrashExitEnum2virDomainLifecycle(enum xen_on_crash_behaviour action)
{
- enum virDomainLifecycleAction num = VIR_DOMAIN_LIFECYCLE_RESTART;
+ enum virDomainLifecycleCrashAction num = VIR_DOMAIN_LIFECYCLE_CRASH__RESTART;
if (action == XEN_ON_CRASH_BEHAVIOUR_DESTROY)
- num = VIR_DOMAIN_LIFECYCLE_DESTROY;
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY;
else if (action == XEN_ON_CRASH_BEHAVIOUR_RESTART)
- num = VIR_DOMAIN_LIFECYCLE_RESTART;
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_RESTART;
else if (action == XEN_ON_CRASH_BEHAVIOUR_PRESERVE)
- num = VIR_DOMAIN_LIFECYCLE_PRESERVE;
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE;
else if (action == XEN_ON_CRASH_BEHAVIOUR_RENAME_RESTART)
- num = VIR_DOMAIN_LIFECYCLE_RESTART_RENAME;
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME;
+ else if (action == XEN_ON_CRASH_BEHAVIOUR_COREDUMP_AND_DESTROY)
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY;
+ else if (action == XEN_ON_CRASH_BEHAVIOUR_COREDUMP_AND_RESTART)
+ num = VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART;
return num;
}
actionShutdownLibvirt2XenapiEnum(enum virDomainLifecycleAction action);
enum xen_on_crash_behaviour
-actionCrashLibvirt2XenapiEnum(enum virDomainLifecycleAction action);
+actionCrashLibvirt2XenapiEnum(enum virDomainLifecycleCrashAction action);
char *
createXenAPIBootOrderString(int nboot, int *bootDevs);
enum virDomainLifecycleAction
xenapiNormalExitEnum2virDomainLifecycle(enum xen_on_normal_exit action);
-enum virDomainLifecycleAction
+enum virDomainLifecycleCrashAction
xenapiCrashExitEnum2virDomainLifecycle(enum xen_on_crash_behaviour action);
void getCpuBitMapfromString(char *mask, unsigned char *cpumap, int maplen);