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

Dietmar Maurer dietmar at proxmox.com
Sat Oct 4 09:11:14 CEST 2014


Thank for that patch, looks good.

I wonder if we should migrate the saved state when we migrate the container?

> -----Original Message-----
> From: pve-devel [mailto:pve-devel-bounces at pve.proxmox.com] On Behalf Of
> Daniel Hunsaker
> Sent: Freitag, 03. Oktober 2014 20:59
> To: pve-devel at pve.proxmox.com
> Subject: [pve-devel] [PATCH 1/4] Add CT suspend/resume support via PVE2 API
> 
> 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..5d8c0c6 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..fcfb0c2 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
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel





More information about the pve-devel mailing list