]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/API2/Qemu.pm
api/create: print correct error message if cleanup fails
[qemu-server.git] / PVE / API2 / Qemu.pm
index 52f4a5fd518e0a1d630ff4966648a2a5d7357171..148ea1ace506865b3e9072b0442c8f5ebf24cda2 100644 (file)
@@ -130,7 +130,7 @@ my $check_storage_access_clone = sub {
 # Note: $pool is only needed when creating a VM, because pool permissions
 # are automatically inherited if VM already exists inside a pool.
 my $create_disks = sub {
-    my ($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
+    my ($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
 
     my $vollist = [];
 
@@ -175,7 +175,7 @@ my $create_disks = sub {
 
            my $volid;
            if ($ds eq 'efidisk0') {
-               ($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt);
+               ($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt, $arch);
            } else {
                $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size);
            }
@@ -585,9 +585,11 @@ __PACKAGE__->register_method({
 
                my $conf = $param;
 
+               my ($arch, undef) = PVE::QemuServer::get_basic_machine_info($conf);
+
                eval {
 
-                   $vollist = &$create_disks($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $param, $storage);
+                   $vollist = &$create_disks($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $param, $storage);
 
                    if (!$conf->{bootdisk}) {
                        my $firstdisk = PVE::QemuServer::resolve_first_disk($conf);
@@ -599,7 +601,7 @@ __PACKAGE__->register_method({
                        $conf->{smbios1} = PVE::QemuServer::generate_smbios1_uuid();
                    }
 
-                   if (!defined($conf->{vmgenid}) || $conf->{vmgenid} eq '1') {
+                   if ((!defined($conf->{vmgenid}) || $conf->{vmgenid} eq '1') && $arch ne 'aarch64') {
                        $conf->{vmgenid} = PVE::QemuServer::generate_uuid();
                    }
 
@@ -646,8 +648,7 @@ __PACKAGE__->register_method({
                if (my $err = $@) {
                    eval {
                        my $conffile = PVE::QemuConfig->config_file($vmid);
-                       unlink($conffile)
-                           or die "failed to remove config file: $@\n";
+                       unlink($conffile) or die "failed to remove config file: $!\n";
                    };
                    warn $@ if $@;
                    die $err;
@@ -1178,6 +1179,8 @@ my $update_vm_api  = sub {
                $conf = PVE::QemuConfig->load_config($vmid); # update/reload
                next if defined($conf->{pending}->{$opt}) && ($param->{$opt} eq $conf->{pending}->{$opt}); # skip if nothing changed
 
+               my ($arch, undef) = PVE::QemuServer::get_basic_machine_info($conf);
+
                if (PVE::QemuServer::is_valid_drivename($opt)) {
                    my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt});
                    # FIXME: cloudinit: CDROM or Disk?
@@ -1189,7 +1192,7 @@ my $update_vm_api  = sub {
                    PVE::QemuServer::vmconfig_register_unused_drive($storecfg, $vmid, $conf, PVE::QemuServer::parse_drive($opt, $conf->{pending}->{$opt}))
                        if defined($conf->{pending}->{$opt});
 
-                   &$create_disks($rpcenv, $authuser, $conf->{pending}, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
+                   &$create_disks($rpcenv, $authuser, $conf->{pending}, $arch, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
                } else {
                    $conf->{pending}->{$opt} = $param->{$opt};
                }
@@ -1521,6 +1524,7 @@ __PACKAGE__->register_method({
        my $websocket = $param->{websocket};
 
        my $conf = PVE::QemuConfig->load_config($vmid, $node); # check if VM exists
+       my $use_serial = ($conf->{vga} && ($conf->{vga} =~ m/^serial\d+$/));
 
        my $authpath = "/vms/$vmid";
 
@@ -1529,13 +1533,14 @@ __PACKAGE__->register_method({
        $sslcert = PVE::Tools::file_get_contents("/etc/pve/pve-root-ca.pem", 8192)
            if !$sslcert;
 
-       my ($remip, $family);
+       my $family;
        my $remcmd = [];
 
        if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
-           ($remip, $family) = PVE::Cluster::remote_node_ip($node);
+           (undef, $family) = PVE::Cluster::remote_node_ip($node);
+           my $sshinfo = PVE::Cluster::get_ssh_info($node);
            # NOTE: kvm VNC traffic is already TLS encrypted or is known unsecure
-           $remcmd = ['/usr/bin/ssh', '-e', 'none', '-T', '-o', 'BatchMode=yes', $remip];
+           $remcmd = PVE::Cluster::ssh_info_to_command($sshinfo, $use_serial ? '-t' : '-T');
        } else {
            $family = PVE::Tools::get_host_address_family($node);
        }
@@ -1551,8 +1556,7 @@ __PACKAGE__->register_method({
 
            my $cmd;
 
-           if ($conf->{vga} && ($conf->{vga} =~ m/^serial\d+$/)) {
-
+           if ($use_serial) {
 
                my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid, '-iface', $conf->{vga}, '-escape', '0' ];
 
@@ -1669,19 +1673,20 @@ __PACKAGE__->register_method({
 
        my $ticket = PVE::AccessControl::assemble_vnc_ticket($authuser, $authpath);
 
-       my ($remip, $family);
+       my $family;
+       my $remcmd = [];
 
        if ($node ne 'localhost' && $node ne PVE::INotify::nodename()) {
-           ($remip, $family) = PVE::Cluster::remote_node_ip($node);
+           (undef, $family) = PVE::Cluster::remote_node_ip($node);
+           my $sshinfo = PVE::Cluster::get_ssh_info($node);
+           $remcmd = PVE::Cluster::ssh_info_to_command($sshinfo, '-t');
+           push @$remcmd, '--';
        } else {
            $family = PVE::Tools::get_host_address_family($node);
        }
 
        my $port = PVE::Tools::next_vnc_port($family);
 
-       my $remcmd = $remip ?
-           ['/usr/bin/ssh', '-e', 'none', '-t', $remip, '--'] : [];
-
        my $termcmd = [ '/usr/sbin/qm', 'terminal', $vmid, '-escape', '0'];
        push @$termcmd, '-iface', $serial if $serial;