<p dir="ltr">I know I'd like to try it.  The potential issue is when migrating between nodes with different kernel versions/modules/configurations.  It would probably be useful to detect those cases (as best we can), and either issue a warning, or automatically switch to an offline migration, shutting down and starting up before and after migration, respectively.  If such detection isn't feasible, perhaps online migrations of CTs are something we shouldn't worry about.  We can only control the environment to a certain extent.</p>
<p dir="ltr">On the other hand, a failed online migration ought to lead sysadmins to attempt offline migration before giving up, so maybe we just let the migration fail and let the sysadmin adapt their course of action accordingly.  Just some thoughts on it.</p>
<div class="gmail_quote">On Oct 4, 2014 1:11 AM, "Dietmar Maurer" <<a href="mailto:dietmar@proxmox.com">dietmar@proxmox.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thank for that patch, looks good.<br>
<br>
I wonder if we should migrate the saved state when we migrate the container?<br>
<br>
> -----Original Message-----<br>
> From: pve-devel [mailto:<a href="mailto:pve-devel-bounces@pve.proxmox.com">pve-devel-bounces@pve.proxmox.com</a>] On Behalf Of<br>
> Daniel Hunsaker<br>
> Sent: Freitag, 03. Oktober 2014 20:59<br>
> To: <a href="mailto:pve-devel@pve.proxmox.com">pve-devel@pve.proxmox.com</a><br>
> Subject: [pve-devel] [PATCH 1/4] Add CT suspend/resume support via PVE2 API<br>
><br>
> From: Dan Hunsaker <<a href="mailto:danhunsaker@gmail.com">danhunsaker@gmail.com</a>><br>
><br>
> Suspend/resume support for VMs has been in the PVE2 API for some time, but<br>
> even though vzctl supports suspend/resume (what they call checkpoint/ restore),<br>
> the API doesn't yet support suspend/resume for CTs.  This patch adds that<br>
> support.<br>
><br>
> Signed-off-by: Dan Hunsaker <<a href="mailto:danhunsaker@gmail.com">danhunsaker@gmail.com</a>><br>
> ---<br>
>  PVE/API2/OpenVZ.pm | 96<br>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
>  PVE/OpenVZ.pm      | 26 ++++++++++++++-<br>
>  2 files changed, 121 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/PVE/API2/OpenVZ.pm b/PVE/API2/OpenVZ.pm index<br>
> 184ebdf..5d8c0c6 100644<br>
> --- a/PVE/API2/OpenVZ.pm<br>
> +++ b/PVE/API2/OpenVZ.pm<br>
> @@ -1459,6 +1459,102 @@ __PACKAGE__->register_method({<br>
>      }});<br>
><br>
>  __PACKAGE__->register_method({<br>
> +       name => 'vm_suspend',<br>
> +       path => '{vmid}/status/suspend',<br>
> +       method => 'POST',<br>
> +       protected => 1,<br>
> +       proxyto => 'node',<br>
> +       description => "Suspend the container.",<br>
> +       permissions => {<br>
> +               check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],<br>
> +       },<br>
> +       parameters => {<br>
> +               additionalProperties => 0,<br>
> +               properties => {<br>
> +                       node => get_standard_option('pve-node'),<br>
> +                       vmid => get_standard_option('pve-vmid'),<br>
> +               },<br>
> +       },<br>
> +       returns => {<br>
> +               type => 'string',<br>
> +       },<br>
> +       code => sub {<br>
> +               my ($param) = @_;<br>
> +<br>
> +               my $rpcenv = PVE::RPCEnvironment::get();<br>
> +<br>
> +               my $authuser = $rpcenv->get_user();<br>
> +<br>
> +               my $node = extract_param($param, 'node');<br>
> +<br>
> +               my $vmid = extract_param($param, 'vmid');<br>
> +<br>
> +               die "CT $vmid not running\n" if<br>
> + !PVE::OpenVZ::check_running($vmid);<br>
> +<br>
> +               my $realcmd = sub {<br>
> +                       my $upid = shift;<br>
> +<br>
> +                       syslog('info', "suspend CT $vmid: $upid\n");<br>
> +<br>
> +                       PVE::OpenVZ::vm_suspend($vmid);<br>
> +<br>
> +                       return;<br>
> +               };<br>
> +<br>
> +               my $upid = $rpcenv->fork_worker('vzsuspend', $vmid,<br>
> + $authuser, $realcmd);<br>
> +<br>
> +               return $upid;<br>
> +       }});<br>
> +<br>
> +__PACKAGE__->register_method({<br>
> +       name => 'vm_resume',<br>
> +       path => '{vmid}/status/resume',<br>
> +       method => 'POST',<br>
> +       protected => 1,<br>
> +       proxyto => 'node',<br>
> +       description => "Resume the container.",<br>
> +       permissions => {<br>
> +               check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],<br>
> +       },<br>
> +       parameters => {<br>
> +               additionalProperties => 0,<br>
> +               properties => {<br>
> +                       node => get_standard_option('pve-node'),<br>
> +                       vmid => get_standard_option('pve-vmid'),<br>
> +               },<br>
> +       },<br>
> +       returns => {<br>
> +               type => 'string',<br>
> +       },<br>
> +       code => sub {<br>
> +               my ($param) = @_;<br>
> +<br>
> +               my $rpcenv = PVE::RPCEnvironment::get();<br>
> +<br>
> +               my $authuser = $rpcenv->get_user();<br>
> +<br>
> +               my $node = extract_param($param, 'node');<br>
> +<br>
> +               my $vmid = extract_param($param, 'vmid');<br>
> +<br>
> +               die "CT $vmid already running\n" if<br>
> + PVE::OpenVZ::check_running($vmid);<br>
> +<br>
> +               my $realcmd = sub {<br>
> +                       my $upid = shift;<br>
> +<br>
> +                       syslog('info', "resume CT $vmid: $upid\n");<br>
> +<br>
> +                       PVE::OpenVZ::vm_resume($vmid);<br>
> +<br>
> +                       return;<br>
> +               };<br>
> +<br>
> +               my $upid = $rpcenv->fork_worker('vzresume', $vmid,<br>
> + $authuser, $realcmd);<br>
> +<br>
> +               return $upid;<br>
> +       }});<br>
> +<br>
> +__PACKAGE__->register_method({<br>
>      name => 'migrate_vm',<br>
>      path => '{vmid}/migrate',<br>
>      method => 'POST',<br>
> diff --git a/PVE/OpenVZ.pm b/PVE/OpenVZ.pm index aa6f502..fcfb0c2 100644<br>
> --- a/PVE/OpenVZ.pm<br>
> +++ b/PVE/OpenVZ.pm<br>
> @@ -6,7 +6,7 @@ use File::stat qw();<br>
>  use POSIX qw (LONG_MAX);<br>
>  use IO::Dir;<br>
>  use IO::File;<br>
> -use PVE::Tools qw(extract_param $IPV6RE $IPV4RE);<br>
> +use PVE::Tools qw(run_command extract_param $IPV6RE $IPV4RE);<br>
>  use PVE::ProcFSTools;<br>
>  use PVE::Cluster qw(cfs_register_file cfs_read_file);  use PVE::SafeSyslog; @@ -<br>
> 1220,6 +1220,30 @@ sub lock_container {<br>
>      return $res;<br>
>  }<br>
><br>
> +sub vm_suspend {<br>
> +    my ($vmid) = @_;<br>
> +<br>
> +    my $cmd = ['vzctl', 'chkpnt', $vmid];<br>
> +<br>
> +    eval { run_command($cmd); };<br>
> +    if (my $err = $@) {<br>
> +        syslog("err", "CT $vmid suspend failed - $err");<br>
> +        die $err;<br>
> +    }<br>
> +}<br>
> +<br>
> +sub vm_resume {<br>
> +    my ($vmid) = @_;<br>
> +<br>
> +    my $cmd = ['vzctl', 'restore', $vmid];<br>
> +<br>
> +    eval { run_command($cmd); };<br>
> +    if (my $err = $@) {<br>
> +        syslog("err", "CT $vmid resume failed - $err");<br>
> +        die $err;<br>
> +    }<br>
> +}<br>
> +<br>
>  sub replacepw {<br>
>      my ($file, $epw) = @_;<br>
><br>
> --<br>
> 1.9.1<br>
><br>
> _______________________________________________<br>
> pve-devel mailing list<br>
> <a href="mailto:pve-devel@pve.proxmox.com">pve-devel@pve.proxmox.com</a><br>
> <a href="http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel" target="_blank">http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel</a><br>
<br>
<br>
</blockquote></div>