mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Add xm save -c/--checkpoint option
xm save --checkpoint leaves the domain running after creating the snapshot. Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
This commit is contained in:
1 parent
e5d4e1285c
commit
1066e48e86
3 files changed
+33
-12
No files matched your search
@@ -54,7 +54,7 @@ def read_exact(fd, size, errmsg):
|
||||
return buf
|
||||
|
||||
|
||||
def save(fd, dominfo, network, live, dst):
|
||||
def save(fd, dominfo, network, live, dst, checkpoint=False):
|
||||
write_exact(fd, SIGNATURE, "could not write guest state file: signature")
|
||||
|
||||
config = sxp.to_string(dominfo.sxpr())
|
||||
@@ -121,9 +121,11 @@ def save(fd, dominfo, network, live, dst):
|
||||
os.close(qemu_fd)
|
||||
os.remove("/tmp/xen.qemu-dm.%d" % dominfo.getDomid())
|
||||
|
||||
dominfo.destroyDomain()
|
||||
dominfo.testDeviceComplete()
|
||||
|
||||
if checkpoint:
|
||||
dominfo.resumeDomain()
|
||||
else:
|
||||
dominfo.destroyDomain()
|
||||
dominfo.testDeviceComplete()
|
||||
try:
|
||||
dominfo.setName(domain_name)
|
||||
except VmError:
|
||||
|
||||
@@ -1172,7 +1172,7 @@ class XendDomain:
|
||||
XendCheckpoint.save(sock.fileno(), dominfo, True, live, dst)
|
||||
sock.close()
|
||||
|
||||
def domain_save(self, domid, dst):
|
||||
def domain_save(self, domid, dst, checkpoint):
|
||||
"""Start saving a domain to file.
|
||||
|
||||
@param domid: Domain ID or Name
|
||||
@@ -1196,8 +1196,8 @@ class XendDomain:
|
||||
oflags |= os.O_LARGEFILE
|
||||
fd = os.open(dst, oflags)
|
||||
try:
|
||||
# For now we don't support 'live checkpoint'
|
||||
XendCheckpoint.save(fd, dominfo, False, False, dst)
|
||||
XendCheckpoint.save(fd, dominfo, False, False, dst,
|
||||
checkpoint=checkpoint)
|
||||
finally:
|
||||
os.close(fd)
|
||||
except OSError, ex:
|
||||
|
||||
@@ -102,7 +102,7 @@ SUBCOMMAND_HELP = {
|
||||
'reboot' : ('<Domain> [-wa]', 'Reboot a domain.'),
|
||||
'restore' : ('<CheckpointFile> [-p]',
|
||||
'Restore a domain from a saved state.'),
|
||||
'save' : ('<Domain> <CheckpointFile>',
|
||||
'save' : ('[-c] <Domain> <CheckpointFile>',
|
||||
'Save a domain state to restore later.'),
|
||||
'shutdown' : ('<Domain> [-waRH]', 'Shutdown a domain.'),
|
||||
'top' : ('', 'Monitor a host and the domains in real time.'),
|
||||
@@ -232,6 +232,9 @@ SUBCOMMAND_OPTIONS = {
|
||||
'resume': (
|
||||
('-p', '--paused', 'Do not unpause domain after resuming it'),
|
||||
),
|
||||
'save': (
|
||||
('-c', '--checkpoint', 'Leave domain running after creating snapshot'),
|
||||
),
|
||||
'restore': (
|
||||
('-p', '--paused', 'Do not unpause domain after restoring it'),
|
||||
),
|
||||
@@ -604,21 +607,37 @@ def xm_shell(args):
|
||||
#########################################################################
|
||||
|
||||
def xm_save(args):
|
||||
arg_check(args, "save", 2)
|
||||
arg_check(args, "save", 2, 3)
|
||||
|
||||
try:
|
||||
dominfo = parse_doms_info(server.xend.domain(args[0]))
|
||||
(options, params) = getopt.gnu_getopt(args, 'c', ['checkpoint'])
|
||||
except getopt.GetoptError, opterr:
|
||||
err(opterr)
|
||||
sys.exit(1)
|
||||
|
||||
checkpoint = False
|
||||
for (k, v) in options:
|
||||
if k in ['-c', '--checkpoint']:
|
||||
checkpoint = True
|
||||
|
||||
if len(params) != 2:
|
||||
err("Wrong number of parameters")
|
||||
usage('save')
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
dominfo = parse_doms_info(server.xend.domain(params[0]))
|
||||
except xmlrpclib.Fault, ex:
|
||||
raise ex
|
||||
|
||||
domid = dominfo['domid']
|
||||
savefile = os.path.abspath(args[1])
|
||||
savefile = os.path.abspath(params[1])
|
||||
|
||||
if not os.access(os.path.dirname(savefile), os.W_OK):
|
||||
err("xm save: Unable to create file %s" % savefile)
|
||||
sys.exit(1)
|
||||
|
||||
server.xend.domain.save(domid, savefile)
|
||||
server.xend.domain.save(domid, savefile, checkpoint)
|
||||
|
||||
def xm_restore(args):
|
||||
arg_check(args, "restore", 1, 2)
|
||||
|
||||