210 lines
8.7 KiB
Diff
210 lines
8.7 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# Date 1201267705 0
|
|
# Node ID 666573856c5928371435b72d907dd7f06965965f
|
|
# Parent b321ef006189e10d3b733747f508b1fb608810e9
|
|
(Re)introduce notion of crashed VM power state.
|
|
|
|
The crashed power state is necessary to allow both core-dumping a
|
|
crashed but preserved VM and renaming/restarting a crashed VM.
|
|
|
|
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
|
|
|
|
Index: xen-3.2.1-testing/docs/xen-api/vm-lifecycle.tex
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/docs/xen-api/vm-lifecycle.tex
|
|
+++ xen-3.2.1-testing/docs/xen-api/vm-lifecycle.tex
|
|
@@ -21,7 +21,10 @@
|
|
\end{figure}
|
|
|
|
Figure~\ref{fig-vm-lifecycle} shows the states that a VM can be in
|
|
-and the API calls that can be used to move the VM between these states.
|
|
+and the API calls that can be used to move the VM between these states. The crashed
|
|
+state indicates that the guest OS running within the VM has crashed. There is no
|
|
+API to explicitly move to the crashed state, however a hardShutdown will move the
|
|
+VM to the powered down state.
|
|
|
|
\section{VM boot parameters}
|
|
|
|
Index: xen-3.2.1-testing/docs/xen-api/vm_lifecycle.dot
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/docs/xen-api/vm_lifecycle.dot
|
|
+++ xen-3.2.1-testing/docs/xen-api/vm_lifecycle.dot
|
|
@@ -1,6 +1,6 @@
|
|
digraph g{
|
|
|
|
-node [shape=box]; "powered down" paused running suspended;
|
|
+node [shape=box]; "powered down" paused running suspended crashed;
|
|
|
|
"powered down" -> paused [label="start(paused=true)"];
|
|
"powered down" -> running [label="start(paused=false)"];
|
|
@@ -11,5 +11,7 @@ paused -> suspended [label="suspend"];
|
|
paused -> running [label="resume"];
|
|
running -> "powered down" [label="cleanShutdown /\nhardShutdown"];
|
|
running -> paused [label="pause"];
|
|
+running -> crashed [label="guest OS crash"]
|
|
+crashed -> "powered down" [label="hardShutdown"]
|
|
|
|
}
|
|
\ No newline at end of file
|
|
Index: xen-3.2.1-testing/docs/xen-api/xenapi-datamodel.tex
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/docs/xen-api/xenapi-datamodel.tex
|
|
+++ xen-3.2.1-testing/docs/xen-api/xenapi-datamodel.tex
|
|
@@ -156,6 +156,7 @@ The following enumeration types are used
|
|
\hspace{0.5cm}{\tt Paused} & Paused \\
|
|
\hspace{0.5cm}{\tt Running} & Running \\
|
|
\hspace{0.5cm}{\tt Suspended} & Suspended \\
|
|
+\hspace{0.5cm}{\tt Crashed} & Crashed \\
|
|
\hspace{0.5cm}{\tt Unknown} & Some other unknown state \\
|
|
\hline
|
|
\end{longtable}
|
|
Index: xen-3.2.1-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/libxen/include/xen/api/xen_vm_power_state.h
|
|
+++ xen-3.2.1-testing/tools/libxen/include/xen/api/xen_vm_power_state.h
|
|
@@ -46,6 +46,11 @@ enum xen_vm_power_state
|
|
XEN_VM_POWER_STATE_SUSPENDED,
|
|
|
|
/**
|
|
+ * Crashed
|
|
+ */
|
|
+ XEN_VM_POWER_STATE_CRASHED,
|
|
+
|
|
+ /**
|
|
* Some other unknown state
|
|
*/
|
|
XEN_VM_POWER_STATE_UNKNOWN
|
|
Index: xen-3.2.1-testing/tools/libxen/src/xen_vm_power_state.c
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/libxen/src/xen_vm_power_state.c
|
|
+++ xen-3.2.1-testing/tools/libxen/src/xen_vm_power_state.c
|
|
@@ -32,6 +32,7 @@ static const char *lookup_table[] =
|
|
"Paused",
|
|
"Running",
|
|
"Suspended",
|
|
+ "Crashed",
|
|
"Unknown"
|
|
};
|
|
|
|
Index: xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendAPIConstants.py
|
|
+++ xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py
|
|
@@ -25,6 +25,7 @@ XEN_API_VM_POWER_STATE = [
|
|
'Running',
|
|
'Suspended',
|
|
'Halted',
|
|
+ 'Crashed',
|
|
'Unknown'
|
|
]
|
|
|
|
@@ -33,7 +34,8 @@ XEN_API_VM_POWER_STATE_PAUSED = 1
|
|
XEN_API_VM_POWER_STATE_RUNNING = 2
|
|
XEN_API_VM_POWER_STATE_SUSPENDED = 3
|
|
XEN_API_VM_POWER_STATE_SHUTTINGDOWN = 4
|
|
-XEN_API_VM_POWER_STATE_UNKNOWN = 5
|
|
+XEN_API_VM_POWER_STATE_CRASHED = 5
|
|
+XEN_API_VM_POWER_STATE_UNKNOWN = 6
|
|
|
|
XEN_API_ON_NORMAL_EXIT = [
|
|
'destroy',
|
|
Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py
|
|
+++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py
|
|
@@ -61,6 +61,7 @@ DOM_STATES = [
|
|
'running',
|
|
'suspended',
|
|
'shutdown',
|
|
+ 'crashed',
|
|
'unknown',
|
|
]
|
|
|
|
@@ -69,6 +70,7 @@ DOM_STATE_PAUSED = XEN_API_VM_POWER_STAT
|
|
DOM_STATE_RUNNING = XEN_API_VM_POWER_STATE_RUNNING
|
|
DOM_STATE_SUSPENDED = XEN_API_VM_POWER_STATE_SUSPENDED
|
|
DOM_STATE_SHUTDOWN = XEN_API_VM_POWER_STATE_SHUTTINGDOWN
|
|
+DOM_STATE_CRASHED = XEN_API_VM_POWER_STATE_CRASHED
|
|
DOM_STATE_UNKNOWN = XEN_API_VM_POWER_STATE_UNKNOWN
|
|
|
|
DOM_STATES_OLD = [
|
|
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomain.py
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomain.py
|
|
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomain.py
|
|
@@ -43,6 +43,7 @@ from xen.xend.XendConstants import XS_VM
|
|
from xen.xend.XendConstants import DOM_STATE_HALTED, DOM_STATE_PAUSED
|
|
from xen.xend.XendConstants import DOM_STATE_RUNNING, DOM_STATE_SUSPENDED
|
|
from xen.xend.XendConstants import DOM_STATE_SHUTDOWN, DOM_STATE_UNKNOWN
|
|
+from xen.xend.XendConstants import DOM_STATE_CRASHED
|
|
from xen.xend.XendConstants import TRIGGER_TYPE
|
|
from xen.xend.XendDevices import XendDevices
|
|
from xen.xend.XendAPIConstants import *
|
|
@@ -69,6 +70,7 @@ POWER_STATE_NAMES = dict([(x, XEN_API_VM
|
|
DOM_STATE_RUNNING,
|
|
DOM_STATE_SUSPENDED,
|
|
DOM_STATE_SHUTDOWN,
|
|
+ DOM_STATE_CRASHED,
|
|
DOM_STATE_UNKNOWN]])
|
|
POWER_STATE_ALL = 'all'
|
|
|
|
@@ -1191,13 +1193,14 @@ class XendDomain:
|
|
if dominfo.getDomid() == DOM0_ID:
|
|
raise XendError("Cannot pause privileged domain %s" % domid)
|
|
ds = dominfo._stateGet()
|
|
- if ds not in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
|
|
+ if ds not in (DOM_STATE_RUNNING, DOM_STATE_PAUSED, DOM_STATE_CRASHED):
|
|
raise VMBadState("Domain '%s' is not started" % domid,
|
|
POWER_STATE_NAMES[DOM_STATE_RUNNING],
|
|
POWER_STATE_NAMES[ds])
|
|
log.info("Domain %s (%d) paused.", dominfo.getName(),
|
|
int(dominfo.getDomid()))
|
|
- dominfo.pause()
|
|
+ if ds == DOM_STATE_RUNNING:
|
|
+ dominfo.pause()
|
|
if state:
|
|
return ds
|
|
except XendInvalidDomain:
|
|
@@ -1216,7 +1219,7 @@ class XendDomain:
|
|
|
|
if dominfo.getDomid() == DOM0_ID:
|
|
raise XendError("Cannot dump core for privileged domain %s" % domid)
|
|
- if dominfo._stateGet() not in (DOM_STATE_PAUSED, DOM_STATE_RUNNING):
|
|
+ if dominfo._stateGet() not in (DOM_STATE_PAUSED, DOM_STATE_RUNNING, DOM_STATE_CRASHED):
|
|
raise VMBadState("Domain '%s' is not started" % domid,
|
|
POWER_STATE_NAMES[DOM_STATE_PAUSED],
|
|
POWER_STATE_NAMES[dominfo._stateGet()])
|
|
Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
===================================================================
|
|
--- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
|
+++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py
|
|
@@ -414,7 +414,7 @@ class XendDomainInfo:
|
|
"""
|
|
from xen.xend import XendDomain
|
|
|
|
- if self._stateGet() in (XEN_API_VM_POWER_STATE_HALTED, XEN_API_VM_POWER_STATE_SUSPENDED):
|
|
+ if self._stateGet() in (XEN_API_VM_POWER_STATE_HALTED, XEN_API_VM_POWER_STATE_SUSPENDED, XEN_API_VM_POWER_STATE_CRASHED):
|
|
try:
|
|
XendTask.log_progress(0, 30, self._constructDomain)
|
|
XendTask.log_progress(31, 60, self._initDomain)
|
|
@@ -648,7 +648,7 @@ class XendDomainInfo:
|
|
return rc
|
|
|
|
def getDeviceSxprs(self, deviceClass):
|
|
- if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
|
|
+ if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED, DOM_STATE_CRASHED):
|
|
return self.getDeviceController(deviceClass).sxprs()
|
|
else:
|
|
sxprs = []
|
|
@@ -2258,6 +2258,9 @@ class XendDomainInfo:
|
|
return XEN_API_VM_POWER_STATE_SUSPENDED
|
|
else:
|
|
return XEN_API_VM_POWER_STATE_HALTED
|
|
+ elif info['crashed']:
|
|
+ # Crashed
|
|
+ return XEN_API_VM_POWER_STATE_CRASHED
|
|
else:
|
|
# We are either RUNNING or PAUSED
|
|
if info['paused']:
|