]> git.proxmox.com Git - pve-network.git/blame - PVE/API2/Network/SDN/Vnets.pm
api: add running/pending zones/vnets/subnets/controllers
[pve-network.git] / PVE / API2 / Network / SDN / Vnets.pm
CommitLineData
4140be9e
AD
1package PVE::API2::Network::SDN::Vnets;
2
3use strict;
4use warnings;
5
6use PVE::SafeSyslog;
7use PVE::Tools qw(extract_param);
8use PVE::Cluster qw(cfs_read_file cfs_write_file);
f9bc9640 9use PVE::Network::SDN;
1d44ce70
AD
10use PVE::Network::SDN::Zones;
11use PVE::Network::SDN::Zones::Plugin;
4140be9e
AD
12use PVE::Network::SDN::Vnets;
13use PVE::Network::SDN::VnetPlugin;
58a7773a 14use PVE::Network::SDN::Subnets;
3926d9a7 15use PVE::API2::Network::SDN::Subnets;
4140be9e
AD
16
17use Storable qw(dclone);
18use PVE::JSONSchema qw(get_standard_option);
19use PVE::RPCEnvironment;
20
21use PVE::RESTHandler;
22
23use base qw(PVE::RESTHandler);
24
3926d9a7
AD
25__PACKAGE__->register_method ({
26 subclass => "PVE::API2::Network::SDN::Subnets",
27 path => '{vnet}/subnets',
28});
29
4140be9e
AD
30my $api_sdn_vnets_config = sub {
31 my ($cfg, $id) = @_;
32
33 my $scfg = dclone(PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id));
34 $scfg->{vnet} = $id;
35 $scfg->{digest} = $cfg->{digest};
6f5f42e4 36
4140be9e
AD
37 return $scfg;
38};
39
6f5f42e4
AD
40my $api_sdn_vnets_deleted_config = sub {
41 my ($cfg, $running_cfg, $id) = @_;
42
43 if (!$cfg->{ids}->{$id}) {
44
45 my $vnet_cfg = dclone(PVE::Network::SDN::Vnets::sdn_vnets_config($running_cfg->{vnets}, $id));
46 $vnet_cfg->{state} = "deleted";
47 $vnet_cfg->{vnet} = $id;
48 return $vnet_cfg;
49 }
50};
51
4140be9e
AD
52__PACKAGE__->register_method ({
53 name => 'index',
54 path => '',
55 method => 'GET',
56 description => "SDN vnets index.",
57 permissions => {
2bd2787a
TL
58 description => "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate'"
59 ." permissions on '/sdn/vnets/<vnet>'",
4140be9e
AD
60 user => 'all',
61 },
62 parameters => {
2bd2787a 63 additionalProperties => 0,
6f5f42e4
AD
64 properties => {
65 running => {
66 type => 'boolean',
67 optional => 1,
68 description => "Display running config.",
69 },
70 pending => {
71 type => 'boolean',
72 optional => 1,
73 description => "Display pending config.",
74 },
75 },
4140be9e
AD
76 },
77 returns => {
78 type => 'array',
79 items => {
80 type => "object",
81 properties => {},
82 },
83 links => [ { rel => 'child', href => "{vnet}" } ],
84 },
85 code => sub {
86 my ($param) = @_;
87
88 my $rpcenv = PVE::RPCEnvironment::get();
89 my $authuser = $rpcenv->get_user();
90
6f5f42e4
AD
91 my $cfg = {};
92 if($param->{pending}) {
93 my $running_cfg = PVE::Network::SDN::config();
94 my $config = PVE::Network::SDN::Vnets::config();
95 $cfg = PVE::Network::SDN::pending_config($running_cfg, $config, 'vnets');
96 } elsif ($param->{running}) {
97 my $running_cfg = PVE::Network::SDN::config();
98 $cfg = $running_cfg->{vnets};
99 } else {
100 $cfg = PVE::Network::SDN::Vnets::config();
101 }
4140be9e
AD
102
103 my @sids = PVE::Network::SDN::Vnets::sdn_vnets_ids($cfg);
104 my $res = [];
105 foreach my $id (@sids) {
3551b612
AD
106 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
107 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$id", $privs, 1);
4140be9e
AD
108
109 my $scfg = &$api_sdn_vnets_config($cfg, $id);
110 push @$res, $scfg;
111 }
112
113 return $res;
114 }});
115
116__PACKAGE__->register_method ({
117 name => 'read',
118 path => '{vnet}',
119 method => 'GET',
120 description => "Read sdn vnet configuration.",
3551b612
AD
121 permissions => {
122 check => ['perm', '/sdn/vnets/{vnet}', ['SDN.Allocate']],
123 },
4140be9e 124 parameters => {
2bd2787a
TL
125 additionalProperties => 0,
126 properties => {
127 vnet => get_standard_option('pve-sdn-vnet-id', {
128 completion => \&PVE::Network::SDN::Vnets::complete_sdn_vnets,
129 }),
6f5f42e4
AD
130 running => {
131 type => 'boolean',
132 optional => 1,
133 description => "Display running config.",
134 },
135 pending => {
136 type => 'boolean',
137 optional => 1,
138 description => "Display pending config.",
139 },
2bd2787a 140 },
4140be9e
AD
141 },
142 returns => { type => 'object' },
143 code => sub {
144 my ($param) = @_;
145
6f5f42e4
AD
146 my $cfg = {};
147 if($param->{pending}) {
148 my $running_cfg = PVE::Network::SDN::config();
149 my $config = PVE::Network::SDN::Vnets::config();
150 $cfg = PVE::Network::SDN::pending_config($running_cfg, $config, 'vnets');
151 } elsif ($param->{running}) {
152 my $running_cfg = PVE::Network::SDN::config();
153 $cfg = $running_cfg->{vnets};
154 } else {
155 $cfg = PVE::Network::SDN::Vnets::config();
156 }
4140be9e 157
2bd2787a 158 return $api_sdn_vnets_config->($cfg, $param->{vnet});
4140be9e
AD
159 }});
160
161__PACKAGE__->register_method ({
162 name => 'create',
163 protected => 1,
164 path => '',
165 method => 'POST',
166 description => "Create a new sdn vnet object.",
3551b612
AD
167 permissions => {
168 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
169 },
4140be9e
AD
170 parameters => PVE::Network::SDN::VnetPlugin->createSchema(),
171 returns => { type => 'null' },
172 code => sub {
173 my ($param) = @_;
174
175 my $type = extract_param($param, 'type');
176 my $id = extract_param($param, 'vnet');
177
2bd2787a
TL
178 PVE::Cluster::check_cfs_quorum();
179 mkdir("/etc/pve/sdn");
4140be9e 180
2bd2787a
TL
181 PVE::Network::SDN::lock_sdn_config(sub {
182 my $cfg = PVE::Network::SDN::Vnets::config();
183 my $opts = PVE::Network::SDN::VnetPlugin->check_config($id, $param, 1, 1);
1d44ce70 184
2bd2787a
TL
185 if (PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id, 1)) {
186 die "sdn vnet object ID '$id' already defined\n";
187 }
188 $cfg->{ids}->{$id} = $opts;
4140be9e 189
2bd2787a
TL
190 my $zone_cfg = PVE::Network::SDN::Zones::config();
191 my $zoneid = $cfg->{ids}->{$id}->{zone};
192 my $plugin_config = $zone_cfg->{ids}->{$zoneid};
193 my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
5ca07ed9 194 $plugin->vnet_update_hook($cfg->{ids}->{$id});
4140be9e 195
58a7773a
AD
196 my $subnet_cfg = PVE::Network::SDN::Subnets::config();
197
198 PVE::Network::SDN::VnetPlugin->on_update_hook($id, $cfg, $subnet_cfg);
f9bc9640 199
2bd2787a 200 PVE::Network::SDN::Vnets::write_config($cfg);
f9bc9640 201
2bd2787a 202 }, "create sdn vnet object failed");
4140be9e
AD
203
204 return undef;
205 }});
206
207__PACKAGE__->register_method ({
208 name => 'update',
209 protected => 1,
210 path => '{vnet}',
211 method => 'PUT',
212 description => "Update sdn vnet object configuration.",
3551b612
AD
213 permissions => {
214 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
215 },
4140be9e
AD
216 parameters => PVE::Network::SDN::VnetPlugin->updateSchema(),
217 returns => { type => 'null' },
218 code => sub {
219 my ($param) = @_;
220
221 my $id = extract_param($param, 'vnet');
222 my $digest = extract_param($param, 'digest');
223
2bd2787a 224 PVE::Network::SDN::lock_sdn_config(sub {
4140be9e
AD
225 my $cfg = PVE::Network::SDN::Vnets::config();
226
227 PVE::SectionConfig::assert_if_modified($cfg, $digest);
228
4140be9e 229 my $opts = PVE::Network::SDN::VnetPlugin->check_config($id, $param, 0, 1);
3834801f 230 $cfg->{ids}->{$id} = $opts;
4140be9e 231
1d44ce70
AD
232 my $zone_cfg = PVE::Network::SDN::Zones::config();
233 my $zoneid = $cfg->{ids}->{$id}->{zone};
2bd2787a
TL
234 my $plugin_config = $zone_cfg->{ids}->{$zoneid};
235 my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
5ca07ed9 236 $plugin->vnet_update_hook($cfg->{ids}->{$id});
2bd2787a 237
58a7773a
AD
238 my $subnet_cfg = PVE::Network::SDN::Subnets::config();
239
240 PVE::Network::SDN::VnetPlugin->on_update_hook($id, $cfg, $subnet_cfg);
4140be9e
AD
241
242 PVE::Network::SDN::Vnets::write_config($cfg);
f9bc9640 243
2bd2787a 244 }, "update sdn vnet object failed");
4140be9e
AD
245
246 return undef;
2bd2787a
TL
247 }
248});
4140be9e
AD
249
250__PACKAGE__->register_method ({
251 name => 'delete',
252 protected => 1,
253 path => '{vnet}',
254 method => 'DELETE',
255 description => "Delete sdn vnet object configuration.",
3551b612
AD
256 permissions => {
257 check => ['perm', '/sdn/vnets', ['SDN.Allocate']],
258 },
4140be9e 259 parameters => {
2bd2787a 260 additionalProperties => 0,
4140be9e
AD
261 properties => {
262 vnet => get_standard_option('pve-sdn-vnet-id', {
2bd2787a
TL
263 completion => \&PVE::Network::SDN::Vnets::complete_sdn_vnets,
264 }),
4140be9e
AD
265 },
266 },
267 returns => { type => 'null' },
268 code => sub {
269 my ($param) = @_;
270
271 my $id = extract_param($param, 'vnet');
272
2bd2787a
TL
273 PVE::Network::SDN::lock_sdn_config(sub {
274 my $cfg = PVE::Network::SDN::Vnets::config();
275 my $scfg = PVE::Network::SDN::Vnets::sdn_vnets_config($cfg, $id); # check if exists
276 my $vnet_cfg = PVE::Network::SDN::Vnets::config();
4140be9e 277
2bd2787a 278 PVE::Network::SDN::VnetPlugin->on_delete_hook($id, $vnet_cfg);
4140be9e 279
2bd2787a
TL
280 delete $cfg->{ids}->{$id};
281 PVE::Network::SDN::Vnets::write_config($cfg);
f9bc9640 282
2bd2787a 283 }, "delete sdn vnet object failed");
4140be9e
AD
284
285
286 return undef;
2bd2787a
TL
287 }
288});
4140be9e
AD
289
2901;