On Thu, 2022-04-07 at 12:27 +0200, Patryk Ściborek wrote: > Hi Guys! > > I'm using Terraform to manage VMs running on Proxmox. I need to be > able to > upload snippets with custom cloud-init configuration. Right now I > have to > use scp/sftp to upload snippets so I have to use a system account. It > looks > that I'm not the only one having this issue: > https://bugzilla.proxmox.com/show_bug.cgi?id=2208 > > So I thought that I could implement a new API endpoint which would > allow to > create, read, update and delete snippets so other tools like > Terraform > would be able to use it. > > What do you think about this idea? > > Best regards, > Patryk
Hi, I've tried to adapt the patch to current PVE 7.1-12 (see below) but I still get proxmoxer.core.ResourceException: 501 Not Implemented: upload failed - {'errors': b''} When I try to upload a snippet. My proxmoxer setup works for iso, the following succeeds: proxmox.nodes(h).storage(s).upload.post(content="iso",filename=f) But the following fails (f being read "rb" from some xxx.yaml) proxmox.nodes(h).storage(s).upload.post(content="snippets",filename=f) Not having snippet upload makes it impossible to use PVE auth realm tokens to control permissions, you have to give a priviledged system account to users *just* to be able to do cloud init with a yaml which is not great security wise (and not practical). I'm probably missing a few things to have a patch that works, I'm willing to put some time on it if someone gives me directions. Thanks! Sincerely, Laurent (paying PVE+PBS customer at work) root@test:/usr/share/perl5# diff -u PVE/Storage.pm{-orig,} --- PVE/Storage.pm-orig 2022-04-08 09:15:52.443943197 +0200 +++ PVE/Storage.pm 2022-04-08 09:17:23.457073570 +0200 @@ -412,6 +412,15 @@ return $plugin->get_subdir($scfg, 'iso'); } +sub get_snippet_dir { + my ($cfg, $storeid) = @_; + + my $scfg = storage_config($cfg, $storeid); + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); + + return $plugin->get_subdir($scfg, 'snippets'); +} + sub get_vztmpl_dir { my ($cfg, $storeid) = @_; root@test:/usr/share/perl5# diff -u ./PVE/API2/Storage/Status.pm{-orig,} --- ./PVE/API2/Storage/Status.pm-orig 2022-04-08 09:15:43.883836880 +0200 +++ ./PVE/API2/Storage/Status.pm 2022-04-08 10:23:43.914401204 +0200 @@ -381,7 +381,7 @@ content => { description => "Content type.", type => 'string', format => 'pve-storage-content', - enum => ['iso', 'vztmpl'], + enum => ['iso', 'vztmpl', 'snippets'], }, filename => { description => "The name of the file to create. Caution: This will be normalized!", @@ -446,8 +446,10 @@ raise_param_exc({ filename => "wrong file extension" }); } $path = PVE::Storage::get_vztmpl_dir($cfg, $param->{storage}); - } else { - raise_param_exc({ content => "upload content type '$content' not allowed" }); + } elsif ($content eq 'snippets') { + $path = PVE::Storage::get_snippet_dir($cfg, $param->{storage}); + } else { + raise_param_exc({ content => "upload content type '$content' not allowed" }); } die "storage '$param->{storage}' does not support '$content' content\n" @@ -564,7 +566,7 @@ content => { description => "Content type.", # TODO: could be optional & detected in most cases type => 'string', format => 'pve-storage-content', - enum => ['iso', 'vztmpl'], + enum => ['iso', 'vztmpl', 'snippets'], }, filename => { description => "The name of the file to create. Caution: This will be normalized!", @@ -627,6 +629,8 @@ raise_param_exc({ filename => "wrong file extension" }); } $path = PVE::Storage::get_vztmpl_dir($cfg, $storage); + } elsif ($content eq 'snippets') { + $path = PVE::Storage::get_snippet_dir($cfg, $storage); } else { raise_param_exc({ content => "upload content-type '$content' is not allowed" }); } _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel