[pve-devel] r5163 - in qemu-server/pve2: . PVE PVE/API2/Qemu
svn-commits at proxmox.com
svn-commits at proxmox.com
Thu Sep 16 13:45:00 CEST 2010
Author: dietmar
Date: 2010-09-16 11:45:00 +0000 (Thu, 16 Sep 2010)
New Revision: 5163
Modified:
qemu-server/pve2/ChangeLog
qemu-server/pve2/PVE/API2/Qemu/Config.pm
qemu-server/pve2/PVE/API2/Qemu/Status.pm
qemu-server/pve2/PVE/QemuServer.pm
qemu-server/pve2/nqm
Log:
* PVE/QemuServer.pm (parse_options_new): removed - no longer needed
Modified: qemu-server/pve2/ChangeLog
===================================================================
--- qemu-server/pve2/ChangeLog 2010-09-15 12:20:24 UTC (rev 5162)
+++ qemu-server/pve2/ChangeLog 2010-09-16 11:45:00 UTC (rev 5163)
@@ -1,3 +1,7 @@
+2010-09-16 Proxmox Support Team <support at proxmox.com>
+
+ * PVE/QemuServer.pm (parse_options_new): removed - no longer needed
+
2010-09-14 Proxmox Support Team <support at proxmox.com>
* PVE/API2/Qemu.pm: new index class
Modified: qemu-server/pve2/PVE/API2/Qemu/Config.pm
===================================================================
--- qemu-server/pve2/PVE/API2/Qemu/Config.pm 2010-09-15 12:20:24 UTC (rev 5162)
+++ qemu-server/pve2/PVE/API2/Qemu/Config.pm 2010-09-16 11:45:00 UTC (rev 5163)
@@ -34,6 +34,16 @@
use base qw(PVE::RESTHandler);
+my $resolve_cdrom_alias = sub {
+ my $param = shift;
+
+ if (my $value = $param->{cdrom}) {
+ $value .= ",media=cdrom" if $value !~ m/media=/;
+ $param->{ide2} = $value;
+ delete $param->{cdrom};
+ }
+};
+
__PACKAGE__->register_method ({
name => 'index',
path => '',
@@ -117,10 +127,20 @@
my $storecfg = read_file('storagecfg');
- my $opts = PVE::QemuServer::parse_options_new($storecfg, $param->{vmid}, $param, 1);
+ &$resolve_cdrom_alias($param);
- PVE::QemuServer::add_random_macs ($opts);
+ foreach my $opt (keys %$param) {
+ if (PVE::QemuServer::valid_drivename($opt)) {
+ my $drive = PVE::QemuServer::parse_drive ($opt, $param->{$opt});
+ raise_param_exc({ $opt => "unable to parse drive options" }) if !$drive;
+ PVE::QemuServer::cleanup_drive_path($opt, $storecfg, $drive);
+ $param->{$opt} = PVE::QemuServer::print_drive ($vmid, $drive);
+ }
+ }
+
+ PVE::QemuServer::add_random_macs ($param);
+
#fixme: ? syslog ('info', "VM $vmid creating new virtual machine");
my $vollist = [];
@@ -131,23 +151,23 @@
die "unable to create vm $vmid: config file already exists\n"
if -f $filename;
- $vollist = PVE::QemuServer::create_disks ($storecfg, $vmid, $opts);
+ $vollist = PVE::QemuServer::create_disks ($storecfg, $vmid, $param);
# try to be smart about bootdisk
my @disks = PVE::QemuServer::disknames();
my $firstdisk;
foreach my $ds (reverse @disks) {
- next if !$opts->{$ds};
- my $disk = PVE::QemuServer::parse_drive ($ds, $opts->{$ds});
+ next if !$param->{$ds};
+ my $disk = PVE::QemuServer::parse_drive ($ds, $param->{$ds});
next if PVE::QemuServer::drive_is_cdrom ($disk);
$firstdisk = $ds;
}
- if (!$opts->{bootdisk} && $firstdisk) {
- $opts->{bootdisk} = $firstdisk;
+ if (!$param->{bootdisk} && $firstdisk) {
+ $param->{bootdisk} = $firstdisk;
}
- PVE::QemuServer::create_conf_nolock($vmid, $opts);
+ PVE::QemuServer::create_conf_nolock($vmid, $param);
};
eval { PVE::QemuServer::lock_config ($vmid, $createfn); };
@@ -212,14 +232,47 @@
my $storecfg = read_file('storagecfg');
- my $opts = PVE::QemuServer::parse_options_new($storecfg, $param->{vmid}, $param, 1);
+ &$resolve_cdrom_alias($param);
+ my $eject = {};
+ my $cdchange = {};
+
+ foreach my $opt (keys %$param) {
+ if (PVE::QemuServer::valid_drivename($opt)) {
+ my $drive = PVE::QemuServer::parse_drive ($opt, $param->{$opt});
+ raise_param_exc({ $opt => "unable to parse drive options" }) if !$drive;
+ if ($drive->{file} eq 'eject') {
+ $eject->{$opt} = 1;
+ delete $param->{$opt};
+ next;
+ }
+
+ PVE::QemuServer::cleanup_drive_path($opt, $storecfg, $drive);
+ $param->{$opt} = PVE::QemuServer::print_drive ($vmid, $drive);
+
+ if (PVE::QemuServer::drive_is_cdrom ($drive)) {
+ $cdchange->{$opt} = PVE::QemuServer::get_iso_path ($storecfg, $vmid, $drive->{file});
+ }
+ }
+ }
+
+ PVE::QemuServer::add_random_macs ($param);
+
my $updatefn = sub {
my $conf = PVE::QemuServer::load_config ($vmid);
PVE::QemuServer::check_lock($conf) if !$skiplock;
+ foreach my $opt (keys %$eject) {
+ if ($conf->{$opt}) {
+ my $drive = PVE::QemuServer::parse_drive($opt, $conf->{$opt});
+ $cdchange->{$opt} = undef if PVE::QemuServer::drive_is_cdrom($drive);
+ } else {
+ raise_param_exc({ $opt => "eject failed - drive does not exist." });
+ }
+ }
+
my $unset = {};
foreach my $opt (PVE::Tools::split_list($delete)) {
@@ -229,21 +282,28 @@
}
next if !defined ($conf->{$opt});
if (PVE::QemuServer::valid_drivename($opt)) {
- my $disk = $conf->{diskinfo}->{$opt};
- if ($disk && !PVE::QemuServer::drive_is_cdrom ($disk)) {
- PVE::QemuServer::unlink_image($storecfg, $vmid, $disk->{file});
+ my $drive = PVE::QemuServer::parse_drive($opt, $conf->{$opt});
+ if (PVE::QemuServer::drive_is_cdrom ($drive)) {
+ $cdchange->{$opt} = undef;
+ } else {
+ PVE::QemuServer::unlink_image($storecfg, $vmid, $drive->{file});
}
}
$unset->{$opt} = 1;
}
- PVE::QemuServer::add_random_macs ($opts);
+ PVE::QemuServer::create_disks ($storecfg, $vmid, $param);
- PVE::QemuServer::create_disks ($storecfg, $vmid, $opts);
+ PVE::QemuServer::change_config_nolock ($vmid, $param, $unset, 1);
- PVE::QemuServer::change_config_nolock ($vmid, $opts, $unset, 1);
+ return if !PVE::QemuServer::check_running ($vmid);
- # return if !PVE::QemuServer::check_running ($vmid);
+ foreach my $opt (keys %$cdchange) {
+ my $qdn = PVE::QemuServer::qemu_drive_name ($opt, 'cdrom');
+ my $path = $cdchange->{$opt};
+ PVE::QemuServer::vm_monitor_command ($vmid, "eject $qdn", 0);
+ PVE::QemuServer::vm_monitor_command ($vmid, "change $qdn \"$path\"", 0) if $path;
+ }
};
PVE::QemuServer::lock_config ($vmid, $updatefn);
Modified: qemu-server/pve2/PVE/API2/Qemu/Status.pm
===================================================================
--- qemu-server/pve2/PVE/API2/Qemu/Status.pm 2010-09-15 12:20:24 UTC (rev 5162)
+++ qemu-server/pve2/PVE/API2/Qemu/Status.pm 2010-09-16 11:45:00 UTC (rev 5163)
@@ -87,7 +87,7 @@
type => 'string',
enum => [qw(start stop reset shutdown cad suspend resume vncticket) ],
},
- ticket => get_standard_option('pve-vncticket'),
+ ticket => get_standard_option('pve-vncticket', { optional => 1 }),
},
},
returns => { type => 'null'},
Modified: qemu-server/pve2/PVE/QemuServer.pm
===================================================================
--- qemu-server/pve2/PVE/QemuServer.pm 2010-09-15 12:20:24 UTC (rev 5162)
+++ qemu-server/pve2/PVE/QemuServer.pm 2010-09-16 11:45:00 UTC (rev 5163)
@@ -685,6 +685,25 @@
raise_param_exc({ $opt => "unexpected media type ($vtype != $etype)" });
}
+sub cleanup_drive_path {
+ my ($opt, $storecfg, $drive) = @_;
+
+ # try to convert filesystem paths to volume IDs
+
+ if (($drive->{file} !~ m/^(cdrom|none)$/) &&
+ ($drive->{file} !~ m|^/dev/.+|) &&
+ ($drive->{file} !~ m/^([^:]+):(.+)$/) &&
+ ($drive->{file} !~ m/^\d+$/)) {
+ my ($vtype, $volid) = PVE::Storage::path_to_volume_id($storecfg, $drive->{file});
+ raise_param_exc({ $opt => "unable to associate path '$drive->{file}' to any storage"}) if !$vtype;
+ $drive->{media} = 'cdrom' if !$drive->{media} && $vtype eq 'iso';
+ verify_media_type($opt, $vtype, $drive->{media});
+ $drive->{file} = $volid;
+ }
+
+ $drive->{media} = 'cdrom' if !$drive->{media} && $drive->{file} =~ m/^(cdrom|none)$/;
+}
+
# fixme: remove
sub parse_options {
my ($self, $vmid, $create) = @_;
@@ -712,8 +731,7 @@
if ($@) {
die "unable to parse value for '$opt' : $@";
} else {
- my $fmt = $confdesc->{$opt}->{format};
- if ($fmt && $fmt eq 'pve-qm-drive') {
+ if (valid_drivename($opt)) {
my $drive = parse_drive ($opt, $value);
if (($drive->{file} !~ m/^(undef|delete|cdrom|none)$/) &&
($drive->{file} !~ m|^/dev/.+|) &&
@@ -747,50 +765,6 @@
return $settings;
}
-# fixme: should we return the parse value?
-sub parse_options_new {
- my ($storecfg, $vmid, $param, $create) = @_;
-
- my $settings = {};
-
- foreach my $opt (keys %$param) {
- my $value = $param->{$opt};
-
- if (!defined($value)) {
- raise_param_exc({ $opt => "got undefined value" });
- }
-
- if ($opt eq 'cdrom') {
- $opt = 'ide2';
- $value .= ",media=cdrom" if $value !~ m/media=/;
- }
-
- my $v;
- eval { $v = check_type($opt, $value); };
- raise_param_exc({ $opt => $@ }) if $@;
- my $fmt = $confdesc->{$opt}->{format};
- if ($fmt && $fmt eq 'pve-qm-drive') {
- my $drive = parse_drive ($opt, $value);
- if (($drive->{file} !~ m/^(cdrom|none)$/) &&
- ($drive->{file} !~ m|^/dev/.+|) &&
- ($drive->{file} !~ m/^([^:]+):(.+)$/) &&
- ($drive->{file} !~ m/^\d+$/)) {
- # try to convert path to volume id
- my ($vtype, $volid) = PVE::Storage::path_to_volume_id($storecfg, $drive->{file}) if $storecfg;
-
-
- raise_param_exc({ $opt => "unable to associate path '$drive->{file}' to any storage"}) if !$vtype;
- verify_media_type($opt, $vtype, $drive->{media});
- $drive->{file} = $volid;
- $v = print_drive ($vmid, $drive);
- }
- }
- $settings->{$opt} = $v;
- }
-
- return $settings;
-}
-
sub create_conf_nolock {
my ($vmid, $settings) = @_;
@@ -2436,6 +2410,7 @@
});
}
+# fixme: remove
sub vm_cdrom {
my ($self, $vmid, $dev, $volid) = @_;
Modified: qemu-server/pve2/nqm
===================================================================
--- qemu-server/pve2/nqm 2010-09-15 12:20:24 UTC (rev 5162)
+++ qemu-server/pve2/nqm 2010-09-16 11:45:00 UTC (rev 5163)
@@ -365,7 +365,6 @@
}});
# fixme: unlink
-# fixme: cdrom
my $cmddef = {
list => [ "PVE::API2::Qemu::Config", 'vmlist', [],
More information about the pve-devel
mailing list