Right now, the only supported hint is guest-ostype, via which qemu-server provides the guest's OS type from the VM configuration.
Signed-off-by: Friedrich Weber <[email protected]> --- src/PVE/Storage.pm | 34 ++++++++++++++++++++++++++++++---- src/PVE/Storage/Plugin.pm | 17 +++++++++++++++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm index 1dde2b7..709d9ca 100755 --- a/src/PVE/Storage.pm +++ b/src/PVE/Storage.pm @@ -771,6 +771,7 @@ sub abs_filesystem_path { my $path; if (parse_volume_id($volid, 1)) { + # TODO: in order to pass $hints, abs_filesystem_path needs to accept it too activate_volumes($cfg, [$volid]); $path = PVE::Storage::path($cfg, $volid); } else { @@ -905,6 +906,7 @@ my $volume_export_prepare = sub { volume_snapshot($cfg, $volid, $snapshot) if $migration_snapshot; + # TODO: in order to pass $hints, $volume_export_prepare would need to accept it too if (defined($snapshot)) { activate_volumes($cfg, [$volid], $snapshot); } else { @@ -1122,7 +1124,9 @@ sub vdisk_create_base { } sub map_volume { - my ($cfg, $volid, $snapname) = @_; + my ($cfg, $volid, $snapname, $hints) = @_; + + verify_hints($hints); my ($storeid, $volname) = parse_volume_id($volid); @@ -1130,7 +1134,7 @@ sub map_volume { my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); - return $plugin->map_volume($storeid, $scfg, $volname, $snapname); + return $plugin->map_volume($storeid, $scfg, $volname, $snapname, $hints); } sub unmap_volume { @@ -1385,11 +1389,33 @@ sub deactivate_storage { $plugin->deactivate_storage($storeid, $scfg, $cache); } +sub is_hint_supported { + my ($hint) = @_; + + return defined($PVE::Storage::Plugin::hints_properties->{$hint}); +} + +sub verify_hints { + my ($hints, $noerr) = @_; + + return if !defined($hints); + + eval { PVE::JSONSchema::validate($hints, $PVE::Storage::Plugin::hints_format); }; + my $err = $@; + + return $hints if !$err; + return if $noerr; + + die "hints are not valid: $@"; +} + sub activate_volumes { - my ($cfg, $vollist, $snapname) = @_; + my ($cfg, $vollist, $snapname, $hints) = @_; return if !($vollist && scalar(@$vollist)); + verify_hints($hints); + my $storagehash = {}; foreach my $volid (@$vollist) { my ($storeid, undef) = parse_volume_id($volid); @@ -1404,7 +1430,7 @@ sub activate_volumes { my ($storeid, $volname) = parse_volume_id($volid); my $scfg = storage_config($cfg, $storeid); my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); - $plugin->activate_volume($storeid, $scfg, $volname, $snapname, $cache); + $plugin->activate_volume($storeid, $scfg, $volname, $snapname, $cache, $hints); } } diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index 8acd214..2c72179 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -59,6 +59,19 @@ cfs_register_file( sub { __PACKAGE__->write_config(@_); }, ); +our $hints_properties = { + 'guest-ostype' => { + type => 'string', + optional => 1, + }, +}; + +our $hints_format = { + type => 'object', + additionalProperties => 0, + properties => $hints_properties, +}; + my %prune_option = ( optional => 1, type => 'integer', @@ -1871,7 +1884,7 @@ sub deactivate_storage { } sub map_volume { - my ($class, $storeid, $scfg, $volname, $snapname) = @_; + my ($class, $storeid, $scfg, $volname, $snapname, $hints) = @_; my ($path) = $class->path($scfg, $volname, $storeid, $snapname); return $path; @@ -1884,7 +1897,7 @@ sub unmap_volume { } sub activate_volume { - my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_; + my ($class, $storeid, $scfg, $volname, $snapname, $cache, $hints) = @_; my $path = $class->filesystem_path($scfg, $volname, $snapname); -- 2.47.3 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
