* [pve-devel] [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint
@ 2022-07-27 14:56 Stefan Sterz
2022-07-27 14:56 ` [pve-devel] [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" Stefan Sterz
2022-08-02 12:45 ` [pve-devel] applied: [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Fabian Grünbichler
0 siblings, 2 replies; 4+ messages in thread
From: Stefan Sterz @ 2022-07-27 14:56 UTC (permalink / raw)
To: pve-devel
since this was missing a proper return type definition the api viewer
couldn't display the endpoint (`retinfs.items` was undefined). also
the `pvesh` command would complain that it cannot properly format the
return type because the variable `$item_type` in `CLIFormatter.pm` was
not defined.
Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
---
PVE/API2/Nodes.pm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 655493a3..ef946301 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -438,8 +438,9 @@ __PACKAGE__->register_method({
},
returns => {
type => 'array',
- properties => {
-
+ items => {
+ type => "object",
+ properties => {},
},
},
code => sub {
--
2.30.2
^ permalink raw reply [flat|nested] 4+ messages in thread* [pve-devel] [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" 2022-07-27 14:56 [pve-devel] [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Stefan Sterz @ 2022-07-27 14:56 ` Stefan Sterz 2022-08-02 12:47 ` [pve-devel] applied+follow-up: " Fabian Grünbichler 2022-08-02 12:45 ` [pve-devel] applied: [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Fabian Grünbichler 1 sibling, 1 reply; 4+ messages in thread From: Stefan Sterz @ 2022-07-27 14:56 UTC (permalink / raw) To: pve-devel this also makes it more explicit what the different values should be Signed-off-by: Stefan Sterz <s.sterz@proxmox.com> --- not sure how sensible this is because most of the information here won't show up in the api viewer. i couldn't figure out how to make it show up and not make breaking changes to the endpoint or change how the api definition hash is handled. fabian gruenbichler and i also discussed off list that this is kind of redudant functionality as you can likely just call multiple api endpoints from whatever script/program/client you are using anyway instead of using this limited and flawed endpoint. perhaps the was a reason for this before tokens existed? so maybe we should either drop it in pve 8 or let it accept proper json not just "a string that when parsed as json needs to be of this format". i.e. accept an array of objects here instead of a string. it has also confused users in the past already, e.g. see: https://forum.proxmox.com/threads/execute-command-in-node-with-api.112290/ PVE/API2/Nodes.pm | 51 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm index ef946301..5cc9111d 100644 --- a/PVE/API2/Nodes.pm +++ b/PVE/API2/Nodes.pm @@ -66,6 +66,49 @@ eval { use base qw(PVE::RESTHandler); +PVE::JSONSchema::register_format('pve-command-batch', \&verify_command_batch); +sub verify_command_batch { + my ($value, $noerr) = @_; + my $commands = eval { decode_json($value); }; + + return undef if $noerr && $@; + die "commands param did not contain valid JSON: $@" if $@; + + eval { + PVE::JSONSchema::validate($commands, { + description => "An array of objects describing endpoints, methods and arguments.", + type => "array", + items => { + type => "object", + properties => { + path => { + description => "A relative path to an API endpoint on this node.", + type => "string", + optional => 0, + }, + method => { + description => "A method related to the API endpoint (GET, POST etc.).", + type => "string", + pattern => "(GET|POST|PUT|DELETE)", + optional => 0, + }, + args => { + description => "A set of parameter names and their values.", + type => "object", + optional => 1, + }, + }, + } + }); + }; + + return $commands if !$@; + + return undef if $noerr; + + die "commands is not a valid array of commands: $@"; +} + __PACKAGE__->register_method ({ subclass => "PVE::API2::Qemu", path => 'qemu', @@ -433,6 +476,7 @@ __PACKAGE__->register_method({ commands => { description => "JSON encoded array of commands.", type => "string", + format => "pve-command-batch", } }, }, @@ -449,16 +493,11 @@ __PACKAGE__->register_method({ my $rpcenv = PVE::RPCEnvironment::get(); my $user = $rpcenv->get_user(); - + # just parse the json again, it should already be validated my $commands = eval { decode_json($param->{commands}); }; - die "commands param did not contain valid JSON: $@" if $@; - die "commands is not an array" if ref($commands) ne "ARRAY"; - foreach my $cmd (@$commands) { eval { - die "$cmd is not a valid command" if (ref($cmd) ne "HASH" || !$cmd->{path} || !$cmd->{method}); - $cmd->{args} //= {}; my $path = "nodes/$param->{node}/$cmd->{path}"; -- 2.30.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [pve-devel] applied+follow-up: [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" 2022-07-27 14:56 ` [pve-devel] [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" Stefan Sterz @ 2022-08-02 12:47 ` Fabian Grünbichler 0 siblings, 0 replies; 4+ messages in thread From: Fabian Grünbichler @ 2022-08-02 12:47 UTC (permalink / raw) To: Proxmox VE development discussion by extracting the actual schema used in the validator into a varaible, and dumping the contained item properties into the verbose_description of the string API type we at least get a full description in the api viewer. On July 27, 2022 4:56 pm, Stefan Sterz wrote: > this also makes it more explicit what the different values should be > > Signed-off-by: Stefan Sterz <s.sterz@proxmox.com> > --- > not sure how sensible this is because most of the information here > won't show up in the api viewer. i couldn't figure out how to make it > show up and not make breaking changes to the endpoint or change how > the api definition hash is handled. > > fabian gruenbichler and i also discussed off list that this is kind of > redudant functionality as you can likely just call multiple api > endpoints from whatever script/program/client you are using anyway > instead of using this limited and flawed endpoint. perhaps the was a > reason for this before tokens existed? > > so maybe we should either drop it in pve 8 or let it accept proper > json not just "a string that when parsed as json needs to be of this > format". i.e. accept an array of objects here instead of a string. > > it has also confused users in the past already, e.g. see: > https://forum.proxmox.com/threads/execute-command-in-node-with-api.112290/ > > PVE/API2/Nodes.pm | 51 +++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 45 insertions(+), 6 deletions(-) > > diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm > index ef946301..5cc9111d 100644 > --- a/PVE/API2/Nodes.pm > +++ b/PVE/API2/Nodes.pm > @@ -66,6 +66,49 @@ eval { > > use base qw(PVE::RESTHandler); > > +PVE::JSONSchema::register_format('pve-command-batch', \&verify_command_batch); > +sub verify_command_batch { > + my ($value, $noerr) = @_; > + my $commands = eval { decode_json($value); }; > + > + return undef if $noerr && $@; > + die "commands param did not contain valid JSON: $@" if $@; > + > + eval { > + PVE::JSONSchema::validate($commands, { > + description => "An array of objects describing endpoints, methods and arguments.", > + type => "array", > + items => { > + type => "object", > + properties => { > + path => { > + description => "A relative path to an API endpoint on this node.", > + type => "string", > + optional => 0, > + }, > + method => { > + description => "A method related to the API endpoint (GET, POST etc.).", > + type => "string", > + pattern => "(GET|POST|PUT|DELETE)", > + optional => 0, > + }, > + args => { > + description => "A set of parameter names and their values.", > + type => "object", > + optional => 1, > + }, > + }, > + } > + }); > + }; > + > + return $commands if !$@; > + > + return undef if $noerr; > + > + die "commands is not a valid array of commands: $@"; > +} > + > __PACKAGE__->register_method ({ > subclass => "PVE::API2::Qemu", > path => 'qemu', > @@ -433,6 +476,7 @@ __PACKAGE__->register_method({ > commands => { > description => "JSON encoded array of commands.", > type => "string", > + format => "pve-command-batch", > } > }, > }, > @@ -449,16 +493,11 @@ __PACKAGE__->register_method({ > > my $rpcenv = PVE::RPCEnvironment::get(); > my $user = $rpcenv->get_user(); > - > + # just parse the json again, it should already be validated > my $commands = eval { decode_json($param->{commands}); }; > > - die "commands param did not contain valid JSON: $@" if $@; > - die "commands is not an array" if ref($commands) ne "ARRAY"; > - > foreach my $cmd (@$commands) { > eval { > - die "$cmd is not a valid command" if (ref($cmd) ne "HASH" || !$cmd->{path} || !$cmd->{method}); > - > $cmd->{args} //= {}; > > my $path = "nodes/$param->{node}/$cmd->{path}"; > -- > 2.30.2 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [pve-devel] applied: [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint 2022-07-27 14:56 [pve-devel] [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Stefan Sterz 2022-07-27 14:56 ` [pve-devel] [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" Stefan Sterz @ 2022-08-02 12:45 ` Fabian Grünbichler 1 sibling, 0 replies; 4+ messages in thread From: Fabian Grünbichler @ 2022-08-02 12:45 UTC (permalink / raw) To: Proxmox VE development discussion thanks! On July 27, 2022 4:56 pm, Stefan Sterz wrote: > since this was missing a proper return type definition the api viewer > couldn't display the endpoint (`retinfs.items` was undefined). also > the `pvesh` command would complain that it cannot properly format the > return type because the variable `$item_type` in `CLIFormatter.pm` was > not defined. > > Signed-off-by: Stefan Sterz <s.sterz@proxmox.com> > --- > PVE/API2/Nodes.pm | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm > index 655493a3..ef946301 100644 > --- a/PVE/API2/Nodes.pm > +++ b/PVE/API2/Nodes.pm > @@ -438,8 +438,9 @@ __PACKAGE__->register_method({ > }, > returns => { > type => 'array', > - properties => { > - > + items => { > + type => "object", > + properties => {}, > }, > }, > code => sub { > -- > 2.30.2 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-08-02 12:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-27 14:56 [pve-devel] [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Stefan Sterz
2022-07-27 14:56 ` [pve-devel] [PATCH manager 2/2] api2: use JSONSchema to validate commands for "nodes/{node}/execute" Stefan Sterz
2022-08-02 12:47 ` [pve-devel] applied+follow-up: " Fabian Grünbichler
2022-08-02 12:45 ` [pve-devel] applied: [PATCH manager 1/2] fix: api2: add return type to nodes/{node}/execute endpoint Fabian Grünbichler
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.