X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=5beebd80139a1aacbb8ce6dfc34b9bfa50417eb2;hp=d900a69031539cbdcb81a5444022508b099d7677;hb=878fea8ef08496f4efd275e07c77bc55d90424b2;hpb=095b88fd51a73337dc19d2e43fa4cfe702605d80 diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index d900a69..5beebd8 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -101,6 +101,11 @@ sub register_format { $format_list->{$format} = $code; } +sub get_format { + my ($format) = @_; + return $format_list->{$format}; +} + # register some common type for pve register_format('string', sub {}); # allow format => 'string-list' @@ -396,8 +401,9 @@ PVE::JSONSchema::register_standard_option('pve-startup-order', { }); sub check_format { - my ($format, $value) = @_; + my ($format, $value, $path) = @_; + return parse_property_string($format, $value, $path) if ref($format) eq 'HASH'; return if $format eq 'regex'; if ($format =~ m/^(.*)-a?list$/) { @@ -427,10 +433,50 @@ sub check_format { die "undefined format '$format'\n" if !$code; + return parse_property_string($code, $value, $path) if ref($code) eq 'HASH'; &$code($value); } } +sub parse_size { + my ($value) = @_; + + return undef if $value !~ m/^(\d+(\.\d+)?)([KMGT])?$/; + my ($size, $unit) = ($1, $3); + if ($unit) { + if ($unit eq 'K') { + $size = $size * 1024; + } elsif ($unit eq 'M') { + $size = $size * 1024 * 1024; + } elsif ($unit eq 'G') { + $size = $size * 1024 * 1024 * 1024; + } elsif ($unit eq 'T') { + $size = $size * 1024 * 1024 * 1024 * 1024; + } + } + return int($size); +}; + +sub format_size { + my ($size) = @_; + + $size = int($size); + + my $kb = int($size/1024); + return $size if $kb*1024 != $size; + + my $mb = int($kb/1024); + return "${kb}K" if $mb*1024 != $kb; + + my $gb = int($mb/1024); + return "${mb}M" if $gb*1024 != $mb; + + my $tb = int($gb/1024); + return "${gb}G" if $tb*1024 != $gb; + + return "${tb}T"; +}; + sub parse_property_string { my ($format, $data, $path) = @_; @@ -728,7 +774,7 @@ sub check_prop { } else { if (my $format = $schema->{format}) { - eval { check_format($format, $value); }; + eval { check_format($format, $value, $path); }; if ($@) { add_error($errors, $path, "invalid format - $@"); return; @@ -915,7 +961,7 @@ my $default_schema_noref = { description => "indicates a required property or a schema that must be validated if this property is present", }, format => { - type => "string", + type => [ "string", "object" ], optional => 1, description => "This indicates what format the data is among some predefined formats which may include:\n\ndate - a string following the ISO format \naddress \nschema - a schema definition object \nperson \npage \nhtml - a string representing HTML", }, @@ -1339,41 +1385,4 @@ sub dump_config { return $data; } -sub generate_typetext { - my ($schema) = @_; - my $typetext = ''; - my (@optional, @required); - foreach my $key (sort keys %$schema) { - next if !$schema->{$key}->{format_description} && - !$schema->{$key}->{typetext}; - if ($schema->{$key}->{optional}) { - push @optional, $key; - } else { - push @required, $key; - } - } - my ($pre, $post) = ('', ''); - my $add = sub { - my ($key) = @_; - if (my $desc = $schema->{$key}->{format_description}) { - $typetext .= "$pre$key=<$desc>$post"; - } elsif (my $text = $schema->{$key}->{typetext}) { - $typetext .= "$pre$text$post"; - } else { - die "internal error: neither format_description nor typetext found"; - } - }; - foreach my $key (@required) { - &$add($key); - $pre = ', '; - } - $pre = $pre ? ' [,' : '['; - $post = ']'; - foreach my $key (@optional) { - &$add($key); - $pre = ' [,'; - } - return $typetext; -} - 1;