description => "Format identifier ('raw', 'qcow2', 'subvol', 'iso', 'tgz' ...)",
type => 'string',
},
+ notes => {
+ description => "Optional notes.",
+ optional => 1,
+ type => 'string',
+ }
},
},
code => sub {
my ($size, $format, $used, $parent) = PVE::Storage::volume_size_info($cfg, $volid);
die "volume_size_info on '$volid' failed\n" if !($format && $size);
- # fixme: return more attributes?
- return {
+ my $entry = {
path => $path,
size => $size,
used => $used,
format => $format,
};
+
+ # not all storages/types support notes, so ignore errors here
+ eval {
+ my $notes = PVE::Storage::get_volume_notes($cfg, $volid);
+ $entry->{notes} = $notes if defined($notes);
+ };
+
+ return $entry;
+ }});
+
+__PACKAGE__->register_method ({
+ name => 'updateattributes',
+ path => '{volume}',
+ method => 'PUT',
+ description => "Update volume attributes",
+ permissions => {
+ description => "You need read access for the volume.",
+ user => 'all',
+ },
+ protected => 1,
+ proxyto => 'node',
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ storage => get_standard_option('pve-storage-id', { optional => 1 }),
+ volume => {
+ description => "Volume identifier",
+ type => 'string',
+ },
+ notes => {
+ description => "The new notes.",
+ type => 'string',
+ optional => 1,
+ },
+ },
+ },
+ returns => { type => 'null' },
+ code => sub {
+ my ($param) = @_;
+
+ my $rpcenv = PVE::RPCEnvironment::get();
+ my $authuser = $rpcenv->get_user();
+
+ my ($volid, $storeid) = &$real_volume_id($param->{storage}, $param->{volume});
+
+ my $cfg = PVE::Storage::config();
+
+ PVE::Storage::check_volume_access($rpcenv, $authuser, $cfg, undef, $volid);
+
+ if (my $notes = $param->{notes}) {
+ PVE::Storage::update_volume_notes($cfg, $volid, $notes);
+ }
+
+ return undef;
}});
__PACKAGE__->register_method ({
return PVE::Storage::Plugin::file_size_info($filename, $timeout);
}
+sub get_volume_notes {
+ my ($cfg, $volid, $timeout) = @_;
+
+ my ($storeid, $volname) = parse_volume_id($volid);
+ my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ return $plugin->get_volume_notes($scfg, $storeid, $volname, $timeout);
+}
+
+sub update_volume_notes {
+ my ($cfg, $volid, $notes, $timeout) = @_;
+
+ my ($storeid, $volname) = parse_volume_id($volid);
+ my $scfg = storage_config($cfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+ $plugin->update_volume_notes($scfg, $storeid, $volname, $notes, $timeout);
+}
+
sub volume_size_info {
my ($cfg, $volid, $timeout) = @_;
return $is_mp; # contains a path
}
+sub get_volume_notes {
+ my ($class, $scfg, $storeid, $volname, $timeout) = @_;
+ my $path = $class->filesystem_path($scfg, $volname);
+ $path .= $class->SUPER::NOTES_EXT;
+
+ my $notes = "";
+
+ if (-f $path) {
+ $notes = PVE::Tools::file_get_contents($path);
+ }
+
+ return $notes;
+}
+
+sub update_volume_notes {
+ my ($class, $scfg, $storeid, $volname, $notes, $timeout) = @_;
+ my $path = $class->filesystem_path($scfg, $volname);
+ my ($vtype, undef, undef, undef, undef, undef, undef) = $class->parse_volname($volname);
+
+ if ($vtype ne 'backup') {
+ die "only backups can have notes\n";
+ }
+
+ $path .= $class->SUPER::NOTES_EXT;
+
+ PVE::Tools::file_set_contents($path, $notes);
+
+ return undef;
+}
+
sub status {
my ($class, $storeid, $scfg, $cache) = @_;
return wantarray ? ($size, $format, $used, $parent, $st->ctime) : $size;
}
+sub get_volume_notes {
+ my ($class, $scfg, $storeid, $volname, $timeout) = @_;
+
+ die "volume notes are not supported for $class";
+}
+
+sub update_volume_notes {
+ my ($class, $scfg, $storeid, $volname, $notes, $timeout) = @_;
+
+ die "volume notes are not supported for $class";
+}
+
sub volume_size_info {
my ($class, $scfg, $storeid, $volname, $timeout) = @_;
my $path = $class->filesystem_path($scfg, $volname);