]> git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Vnets.pm
api sdn/vnets: cleanups
[pve-network.git] / PVE / API2 / Network / SDN / Vnets.pm
1 package PVE::API2::Network::SDN::Vnets;
2
3 use strict;
4 use warnings;
5
6 use PVE::SafeSyslog;
7 use PVE::Tools qw(extract_param);
8 use PVE::Cluster qw(cfs_read_file cfs_write_file);
9 use PVE::Network::SDN;
10 use PVE::Network::SDN::Zones;
11 use PVE::Network::SDN::Zones::Plugin;
12 use PVE::Network::SDN::Vnets;
13 use PVE::Network::SDN::VnetPlugin;
14
15 use Storable qw(dclone);
16 use PVE::JSONSchema qw(get_standard_option);
17 use PVE::RPCEnvironment;
18
19 use PVE::RESTHandler;
20
21 use base qw(PVE::RESTHandler);
22
23 my $api_sdn_vnets_config = sub {
24 my ($cfg, $id) = @_;
25
26 my $scfg = dclone(PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id));
27 $scfg->{vnet} = $id;
28 $scfg->{digest} = $cfg->{digest};
29
30 return $scfg;
31 };
32
33 __PACKAGE__->register_method ({
34 name => 'index',
35 path => '',
36 method => 'GET',
37 description => "SDN vnets index.",
38 permissions => {
39 description => "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate'"
40 ." permissions on '/sdn/vnets/<vnet>'",
41 user => 'all',
42 },
43 parameters => {
44 additionalProperties => 0,
45 },
46 returns => {
47 type => 'array',
48 items => {
49 type => "object",
50 properties => {},
51 },
52 links => [ { rel => 'child', href => "{vnet}" } ],
53 },
54 code => sub {
55 my ($param) = @_;
56
57 my $rpcenv = PVE::RPCEnvironment::get();
58 my $authuser = $rpcenv->get_user();
59
60 my $cfg = PVE::Network::SDN::Vnets::config();
61
62 my @sids = PVE::Network::SDN::Vnets::sdn_vnets_ids($cfg);
63 my $res = [];
64 foreach my $id (@sids) {
65 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
66 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$id", $privs, 1);
67
68 my $scfg = &$api_sdn_vnets_config($cfg, $id);
69 push @$res, $scfg;
70 }
71
72 return $res;
73 }});
74
75 __PACKAGE__->register_method ({
76 name => 'read',
77 path => '{vnet}',
78 method => 'GET',
79 description => "Read sdn vnet configuration.",
80 permissions => {
81 check => ['perm', '/sdn/vnets/{vnet}', ['SDN.Allocate']],
82 },
83 parameters => {
84 additionalProperties => 0,
85 properties => {
86 vnet => get_standard_option('pve-sdn-vnet-id', {
87 completion => \&PVE::Network::SDN::Vnets::complete_sdn_vnets,
88 }),
89 },
90 },
91 returns => { type => 'object' },
92 code => sub {
93 my ($param) = @_;
94
95 my $cfg = PVE::Network::SDN::Vnets::config();
96
97 return $api_sdn_vnets_config->($cfg, $param->{vnet});
98 }});
99
100 __PACKAGE__->register_method ({
101 name => 'create',
102 protected => 1,
103 path => '',
104 method => 'POST',
105 description => "Create a new sdn vnet object.",
106 permissions => {
107 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
108 },
109 parameters => PVE::Network::SDN::VnetPlugin->createSchema(),
110 returns => { type => 'null' },
111 code => sub {
112 my ($param) = @_;
113
114 my $type = extract_param($param, 'type');
115 my $id = extract_param($param, 'vnet');
116
117 PVE::Cluster::check_cfs_quorum();
118 mkdir("/etc/pve/sdn");
119
120 PVE::Network::SDN::lock_sdn_config(sub {
121 my $cfg = PVE::Network::SDN::Vnets::config();
122 my $opts = PVE::Network::SDN::VnetPlugin->check_config($id, $param, 1, 1);
123
124 if (PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id, 1)) {
125 die "sdn vnet object ID '$id' already defined\n";
126 }
127 $cfg->{ids}->{$id} = $opts;
128
129 my $zone_cfg = PVE::Network::SDN::Zones::config();
130 my $zoneid = $cfg->{ids}->{$id}->{zone};
131 my $plugin_config = $zone_cfg->{ids}->{$zoneid};
132 my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
133 $plugin->verify_tag($opts->{tag});
134
135 PVE::Network::SDN::VnetPlugin->on_update_hook($id, $cfg);
136
137 PVE::Network::SDN::Vnets::write_config($cfg);
138 PVE::Network::SDN::increase_version();
139
140 }, "create sdn vnet object failed");
141
142 return undef;
143 }});
144
145 __PACKAGE__->register_method ({
146 name => 'update',
147 protected => 1,
148 path => '{vnet}',
149 method => 'PUT',
150 description => "Update sdn vnet object configuration.",
151 permissions => {
152 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
153 },
154 parameters => PVE::Network::SDN::VnetPlugin->updateSchema(),
155 returns => { type => 'null' },
156 code => sub {
157 my ($param) = @_;
158
159 my $id = extract_param($param, 'vnet');
160 my $digest = extract_param($param, 'digest');
161
162 PVE::Network::SDN::lock_sdn_config(sub {
163 my $cfg = PVE::Network::SDN::Vnets::config();
164
165 PVE::SectionConfig::assert_if_modified($cfg, $digest);
166
167 my $opts = PVE::Network::SDN::VnetPlugin->check_config($id, $param, 0, 1);
168 $cfg->{ids}->{$id} = $opts;
169
170 my $zone_cfg = PVE::Network::SDN::Zones::config();
171 my $zoneid = $cfg->{ids}->{$id}->{zone};
172 my $plugin_config = $zone_cfg->{ids}->{$zoneid};
173 my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
174 $plugin->verify_tag($opts->{tag});
175
176 PVE::Network::SDN::VnetPlugin->on_update_hook($id, $cfg);
177
178 PVE::Network::SDN::Vnets::write_config($cfg);
179 PVE::Network::SDN::increase_version();
180
181 }, "update sdn vnet object failed");
182
183 return undef;
184 }
185 });
186
187 __PACKAGE__->register_method ({
188 name => 'delete',
189 protected => 1,
190 path => '{vnet}',
191 method => 'DELETE',
192 description => "Delete sdn vnet object configuration.",
193 permissions => {
194 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
195 },
196 parameters => {
197 additionalProperties => 0,
198 properties => {
199 vnet => get_standard_option('pve-sdn-vnet-id', {
200 completion => \&PVE::Network::SDN::Vnets::complete_sdn_vnets,
201 }),
202 },
203 },
204 returns => { type => 'null' },
205 code => sub {
206 my ($param) = @_;
207
208 my $id = extract_param($param, 'vnet');
209
210 PVE::Network::SDN::lock_sdn_config(sub {
211 my $cfg = PVE::Network::SDN::Vnets::config();
212 my $scfg = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id); # check if exists
213 my $vnet_cfg = PVE::Network::SDN::Vnets::config();
214
215 PVE::Network::SDN::VnetPlugin->on_delete_hook($id, $vnet_cfg);
216
217 delete $cfg->{ids}->{$id};
218 PVE::Network::SDN::Vnets::write_config($cfg);
219 PVE::Network::SDN::increase_version();
220
221 }, "delete sdn vnet object failed");
222
223
224 return undef;
225 }
226 });
227
228 1;