[pve-devel] [PATCH 1/4] Add CT suspend/resume support via PVE2 API

Daniel Hunsaker danhunsaker at gmail.com
Thu Oct 9 01:02:05 CEST 2014


From: Dan Hunsaker <danhunsaker at gmail.com>

Suspend/resume support for VMs has been in the PVE2 API for some time,
but even though vzctl supports suspend/resume (what they call checkpoint/
restore), the API doesn't yet support suspend/resume for CTs.  This patch
adds that support.

Signed-off-by: Dan Hunsaker <danhunsaker at gmail.com>
---
 PVE/API2/OpenVZ.pm | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 PVE/OpenVZ.pm      | 26 ++++++++++++++-
 2 files changed, 121 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/OpenVZ.pm b/PVE/API2/OpenVZ.pm
index 184ebdf..955611d 100644
--- a/PVE/API2/OpenVZ.pm
+++ b/PVE/API2/OpenVZ.pm
@@ -1459,6 +1459,102 @@ __PACKAGE__->register_method({
     }});
 
 __PACKAGE__->register_method({
+    name => 'vm_suspend',
+    path => '{vmid}/status/suspend',
+    method => 'POST',
+    protected => 1,
+    proxyto => 'node',
+    description => "Suspend the container.",
+    permissions => {
+        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
+    },
+    parameters => {
+        additionalProperties => 0,
+        properties => {
+            node => get_standard_option('pve-node'),
+            vmid => get_standard_option('pve-vmid'),
+        },
+    },
+    returns => {
+        type => 'string',
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $rpcenv = PVE::RPCEnvironment::get();
+
+        my $authuser = $rpcenv->get_user();
+
+        my $node = extract_param($param, 'node');
+
+        my $vmid = extract_param($param, 'vmid');
+
+        die "CT $vmid not running\n" if !PVE::OpenVZ::check_running($vmid);
+
+        my $realcmd = sub {
+            my $upid = shift;
+
+            syslog('info', "suspend CT $vmid: $upid\n");
+
+            PVE::OpenVZ::vm_suspend($vmid);
+
+            return;
+        };
+
+        my $upid = $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd);
+
+        return $upid;
+    }});
+
+__PACKAGE__->register_method({
+    name => 'vm_resume',
+    path => '{vmid}/status/resume',
+    method => 'POST',
+    protected => 1,
+    proxyto => 'node',
+    description => "Resume the container.",
+    permissions => {
+        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
+    },
+    parameters => {
+        additionalProperties => 0,
+        properties => {
+            node => get_standard_option('pve-node'),
+            vmid => get_standard_option('pve-vmid'),
+        },
+    },
+    returns => {
+        type => 'string',
+    },
+    code => sub {
+        my ($param) = @_;
+
+        my $rpcenv = PVE::RPCEnvironment::get();
+
+        my $authuser = $rpcenv->get_user();
+
+        my $node = extract_param($param, 'node');
+
+        my $vmid = extract_param($param, 'vmid');
+
+        die "CT $vmid already running\n" if PVE::OpenVZ::check_running($vmid);
+
+        my $realcmd = sub {
+            my $upid = shift;
+
+            syslog('info', "resume CT $vmid: $upid\n");
+
+            PVE::OpenVZ::vm_resume($vmid);
+
+            return;
+        };
+
+        my $upid = $rpcenv->fork_worker('vzresume', $vmid, $authuser, $realcmd);
+
+        return $upid;
+    }});
+
+__PACKAGE__->register_method({
     name => 'migrate_vm', 
     path => '{vmid}/migrate',
     method => 'POST',
diff --git a/PVE/OpenVZ.pm b/PVE/OpenVZ.pm
index aa6f502..2577561 100644
--- a/PVE/OpenVZ.pm
+++ b/PVE/OpenVZ.pm
@@ -6,7 +6,7 @@ use File::stat qw();
 use POSIX qw (LONG_MAX);
 use IO::Dir;
 use IO::File;
-use PVE::Tools qw(extract_param $IPV6RE $IPV4RE);
+use PVE::Tools qw(run_command extract_param $IPV6RE $IPV4RE);
 use PVE::ProcFSTools;
 use PVE::Cluster qw(cfs_register_file cfs_read_file);
 use PVE::SafeSyslog;
@@ -1220,6 +1220,30 @@ sub lock_container {
     return $res;
 }
 
+sub vm_suspend {
+    my ($vmid) = @_;
+
+    my $cmd = ['vzctl', 'chkpnt', $vmid];
+
+    eval { run_command($cmd); };
+    if (my $err = $@) {
+        syslog("err", "CT $vmid suspend failed - $err");
+        die $err;
+    }
+}
+
+sub vm_resume {
+    my ($vmid) = @_;
+
+    my $cmd = ['vzctl', 'restore', $vmid];
+
+    eval { run_command($cmd); };
+    if (my $err = $@) {
+        syslog("err", "CT $vmid resume failed - $err");
+        die $err;
+    }
+}
+
 sub replacepw {
     my ($file, $epw) = @_;
 
-- 
1.9.1




More information about the pve-devel mailing list