[pve-devel] [PATCH qemu-server 3/7] migrate : prepare : add create_vm for external migration

David Limbeck d.limbeck at proxmox.com
Wed Nov 7 16:26:45 CET 2018


comments inline

On 10/29/18 4:38 PM, Alexandre Derumier wrote:
> Create vm on target cluster with same options.
> Disks are created with same size and same options than source
> ---
>   PVE/QemuMigrate.pm | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++----
>   1 file changed, 77 insertions(+), 5 deletions(-)
>
> diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
> index e9e9075..ce43fc9 100644
> --- a/PVE/QemuMigrate.pm
> +++ b/PVE/QemuMigrate.pm
> @@ -227,6 +227,83 @@ sub prepare {
>   	}
>       }
>   
> +    # test ssh connection
> +    my $cmd = [ @{$self->{rem_ssh}}, '/bin/true' ];
> +    eval { $self->cmd_quiet($cmd); };
> +    die "Can't connect to destination address using public key\n" if $@;
> +
> +    $self->{migration_external} = 1 if $self->{opts}->{migration_type} && $self->{opts}->{migration_type} eq 'external';
> +
> +    if($self->{migration_external}) {
> +
> +	#get remote nextvmid
> +	eval {
> +	    my $cmd = [@{$self->{rem_ssh}}, 'qm', 'nextvmid'];
> +	    PVE::Tools::run_command($cmd, outfunc => sub {
> +		my $line = shift;
> +		if ($line =~ m/^(\d+)/) {
> +		    $self->{opts}->{targetvmid} = $line;
> +		}
> +	    });
> +	};
> +        if (my $err = $@) {
> +            $self->log('err', $err);
> +            $self->{errors} = 1;
> +            die $err;
> +        }
> +
> +	die "can't find the next free vmid on remote cluster" if !$self->{opts}->{targetvmid};
missing '\n'
> +
> +	#create vm
> +	my $cmd = [@{$self->{rem_ssh}}, 'qm', 'create', $self->{opts}->{targetvmid}];
> +
> +	foreach my $opt (keys %{$conf}) {
> +	    next if $opt =~ m/^(pending|snapshots|digest|parent)/;
> +	    next if $opt =~ m/^(ide|scsi|virtio)(\d+)/;
> +	    die "can't migrate unused disk. please remove it before migrate" if $opt =~ m/^(unused)(\d+)/;
missing '\n'
> +	    push @$cmd , "-$opt", $conf->{$opt};
> +	}
> +
> +	PVE::QemuServer::foreach_drive($conf, sub {
> +	    my ($ds, $drive) = @_;
> +
> +	    if (PVE::QemuServer::drive_is_cdrom($drive, 1)) {
> +		push @$cmd , "-$ds", $conf->{$ds};
> +		return;
> +	    }
> +
> +	    my $volid = $drive->{file};
> +	    return if !$volid;
> +
> +	    my ($sid, $volname) = PVE::Storage::parse_volume_id($volid, 1);
> +	    return if !$sid;
> +	    my $size = PVE::Storage::volume_size_info($self->{storecfg}, $volid, 5);
> +	    die "can't get size" if !$size;
missing '\n'
> +	    $size = $size/1024/1024/1024;
> +	    my $targetsid = $self->{opts}->{targetstorage} ? $self->{opts}->{targetstorage} : $sid;
> +
> +	    my $data = { %$drive };
> +	    delete $data->{$_} for qw(index interface file size);
> +	    my $drive_conf = "$targetsid:$size";
> +            foreach my $drive_opt (keys %{$data}) {
> +		$drive_conf .= ",$drive_opt=$data->{$drive_opt}";
> +	    }
> +
> +	    push @$cmd , "-$ds", $drive_conf;
> +	});
> +
> +	push @$cmd , '-lock', 'migrate';
> +
> +	eval{ PVE::Tools::run_command($cmd, outfunc => sub {}, errfunc => sub {}) };
> +	if (my $err = $@) {
> +	    $self->log('err', $err);
> +	    $self->{errors} = 1;
> +	    die $err;
> +	}
> +
> +	return 1;
> +    }
> +
>       my $vollist = PVE::QemuServer::get_vm_volumes($conf);
>   
>       my $need_activate = [];
> @@ -253,11 +330,6 @@ sub prepare {
>       # activate volumes
>       PVE::Storage::activate_volumes($self->{storecfg}, $need_activate);
>   
> -    # test ssh connection
> -    my $cmd = [ @{$self->{rem_ssh}}, '/bin/true' ];
> -    eval { $self->cmd_quiet($cmd); };
> -    die "Can't connect to destination address using public key\n" if $@;
> -
>       return $running;
>   }
>   




More information about the pve-devel mailing list