[pve-devel] [PATCH common v2] schema: only check for cycles during build
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon Nov 25 11:33:36 CET 2019
On 11/25/19 11:21 AM, Fabian Grünbichler wrote:
> On November 22, 2019 7:37 pm, Thomas Lamprecht wrote:
>> Do not check for cycles or for self-validation if not in a build
>> environment.
>>
>> The slight drawback is that we also avoid this cycle checks when we
>> do (development) testing through the API and don't remeber to set the
>> PROXMOX_FORCE_SCHEMA_VALIDATION environment variable.
>>
>> But honestyl, I never had a cycle in the API and got noticed by
>> *this* check, as then to_json and the behavior were all the pointers
>> needed to get this.
>>
>> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
>> ---
>>
>> This time a bit more thought out (thanks Stoiko!)
>>
>> src/PVE/JSONSchema.pm | 38 +++++++++++++++++++++++++-------------
>> 1 file changed, 25 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
>> index 51c3881..916f703 100644
>> --- a/src/PVE/JSONSchema.pm
>> +++ b/src/PVE/JSONSchema.pm
>> @@ -6,13 +6,21 @@ use Storable; # for dclone
>> use Getopt::Long;
>> use Encode::Locale;
>> use Encode;
>> -use Devel::Cycle -quiet; # todo: remove?
>> use PVE::Tools qw(split_list $IPV6RE $IPV4RE);
>> use PVE::Exception qw(raise);
>> use HTTP::Status qw(:constants);
>> use Net::IP qw(:PROC);
>> use Data::Dumper;
>>
>> +my $do_build_checks;
>> +BEGIN {
>> + $do_build_checks = $ENV{DEB_BUILD_ARCH} || $ENV{PROXMOX_FORCE_SCHEMA_VALIDATION};
>
> couldn't we set 'PROXMOX_FORCE_SCHEMA_VALIDATION' in pve-doc-generator's
> *api-verified targets and drop DEB_BUILD_ARCH here? seems a bit
> arbitrary, and who knows what exports DEB_BUILD_ARCH into production
> environments..
Not really realistic on a PVE machine, especially if not DEB, and in
the "worst" case you're as good as we're now - i.e., do some additional
checks and get taught to not system wide or (for root) export
DEB_BUILD_ARCH ;)
I don't want another versioned dependency bump over the whole three,
just to ensure that the cycle checks and initial self-tests are done..
This was re-using something existing.
>
>> + if ($do_build_checks) {
>> + require Devel::Cycle;
>> + import Devel::Cycle -quiet;
>> + }
>> +}
>> +
>> use base 'Exporter';
>>
>> our @EXPORT_OK = qw(
>> @@ -1035,14 +1043,16 @@ sub validate {
>> my $errors = {};
>> $errmsg = "Parameter verification failed.\n" if !$errmsg;
>>
>> - # todo: cycle detection is only needed for debugging, I guess
>> - # we can disable that in the final release
>> - # todo: is there a better/faster way to detect cycles?
>> - my $cycles = 0;
>> - find_cycle($instance, sub { $cycles = 1 });
>> - if ($cycles) {
>> - add_error($errors, undef, "data structure contains recursive cycles");
>> - } elsif ($schema) {
>> + # only check when building a package or told to do so, this is costly
>> + if ($do_build_checks) {
>> + my $cycles = 0;
>> + find_cycle($instance, sub { $cycles = 1 });
>> + if ($cycles) {
>> + add_error($errors, undef, "data structure contains recursive cycles");
>> + }
>> + }
>> +
>> + if ($schema) {
>> check_prop($instance, $schema, '', $errors);
>> }
>>
>> @@ -1400,10 +1410,12 @@ sub validate_method_info {
>> validate_schema($info->{returns}) if $info->{returns};
>> }
>>
>> -# run a self test on load
>> -# make sure we can verify the default schema
>> -validate_schema($default_schema_noref);
>> -validate_schema($method_schema);
>> +if ($do_build_checks) {
>> + # run a self test on load when building
>> + # make sure we can verify the default schema
>> + validate_schema($default_schema_noref);
>> + validate_schema($method_schema);
>> +}
>>
>> # and now some utility methods (used by pve api)
>> sub method_get_child_link {
>> --
>> 2.20.1
More information about the pve-devel
mailing list