]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Vnets.pm
1 package PVE
::API2
::Network
::SDN
::Vnets
;
7 use PVE
::Tools
qw(extract_param);
8 use PVE
::Cluster
qw(cfs_read_file cfs_write_file);
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 use PVE
::Network
::SDN
::Subnets
;
15 use PVE
::API2
::Network
::SDN
::Subnets
;
17 use Storable
qw(dclone);
18 use PVE
::JSONSchema
qw(get_standard_option);
19 use PVE
::RPCEnvironment
;
20 use PVE
::Exception
qw(raise raise_param_exc);
24 use base
qw(PVE::RESTHandler);
26 __PACKAGE__-
>register_method ({
27 subclass
=> "PVE::API2::Network::SDN::Subnets",
28 path
=> '{vnet}/subnets',
31 my $api_sdn_vnets_config = sub {
34 my $scfg = dclone
(PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $id));
36 $scfg->{digest
} = $cfg->{digest
};
41 my $api_sdn_vnets_deleted_config = sub {
42 my ($cfg, $running_cfg, $id) = @_;
44 if (!$cfg->{ids
}->{$id}) {
46 my $vnet_cfg = dclone
(PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($running_cfg->{vnets
}, $id));
47 $vnet_cfg->{state} = "deleted";
48 $vnet_cfg->{vnet
} = $id;
53 __PACKAGE__-
>register_method ({
57 description
=> "SDN vnets index.",
59 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate'"
60 ." permissions on '/sdn/vnets/<vnet>'",
64 additionalProperties
=> 0,
69 description
=> "Display running config.",
74 description
=> "Display pending config.",
84 links
=> [ { rel
=> 'child', href
=> "{vnet}" } ],
89 my $rpcenv = PVE
::RPCEnvironment
::get
();
90 my $authuser = $rpcenv->get_user();
93 if($param->{pending
}) {
94 my $running_cfg = PVE
::Network
::SDN
::config
();
95 my $config = PVE
::Network
::SDN
::Vnets
::config
();
96 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'vnets');
97 } elsif ($param->{running
}) {
98 my $running_cfg = PVE
::Network
::SDN
::config
();
99 $cfg = $running_cfg->{vnets
};
101 $cfg = PVE
::Network
::SDN
::Vnets
::config
();
104 my @sids = PVE
::Network
::SDN
::Vnets
::sdn_vnets_ids
($cfg);
106 foreach my $id (@sids) {
107 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
108 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$id", $privs, 1);
110 my $scfg = &$api_sdn_vnets_config($cfg, $id);
117 __PACKAGE__-
>register_method ({
121 description
=> "Read sdn vnet configuration.",
123 check
=> ['perm', '/sdn/vnets/{vnet}', ['SDN.Allocate']],
126 additionalProperties
=> 0,
128 vnet
=> get_standard_option
('pve-sdn-vnet-id', {
129 completion
=> \
&PVE
::Network
::SDN
::Vnets
::complete_sdn_vnets
,
134 description
=> "Display running config.",
139 description
=> "Display pending config.",
143 returns
=> { type
=> 'object' },
148 if($param->{pending
}) {
149 my $running_cfg = PVE
::Network
::SDN
::config
();
150 my $config = PVE
::Network
::SDN
::Vnets
::config
();
151 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'vnets');
152 } elsif ($param->{running
}) {
153 my $running_cfg = PVE
::Network
::SDN
::config
();
154 $cfg = $running_cfg->{vnets
};
156 $cfg = PVE
::Network
::SDN
::Vnets
::config
();
159 return $api_sdn_vnets_config->($cfg, $param->{vnet
});
162 __PACKAGE__-
>register_method ({
167 description
=> "Create a new sdn vnet object.",
169 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
171 parameters
=> PVE
::Network
::SDN
::VnetPlugin-
>createSchema(),
172 returns
=> { type
=> 'null' },
176 my $type = extract_param
($param, 'type');
177 my $id = extract_param
($param, 'vnet');
179 PVE
::Cluster
::check_cfs_quorum
();
180 mkdir("/etc/pve/sdn");
182 PVE
::Network
::SDN
::lock_sdn_config
(sub {
183 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
184 my $opts = PVE
::Network
::SDN
::VnetPlugin-
>check_config($id, $param, 1, 1);
186 if (PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $id, 1)) {
187 die "sdn vnet object ID '$id' already defined\n";
189 $cfg->{ids
}->{$id} = $opts;
191 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
192 my $zoneid = $cfg->{ids
}->{$id}->{zone
};
193 my $plugin_config = $zone_cfg->{ids
}->{$zoneid};
194 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($plugin_config->{type
});
195 $plugin->vnet_update_hook($cfg, $id, $zone_cfg);
197 PVE
::Network
::SDN
::VnetPlugin-
>on_update_hook($id, $cfg);
199 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
201 }, "create sdn vnet object failed");
206 __PACKAGE__-
>register_method ({
211 description
=> "Update sdn vnet object configuration.",
213 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
215 parameters
=> PVE
::Network
::SDN
::VnetPlugin-
>updateSchema(),
216 returns
=> { type
=> 'null' },
220 my $id = extract_param
($param, 'vnet');
221 my $digest = extract_param
($param, 'digest');
223 PVE
::Network
::SDN
::lock_sdn_config
(sub {
224 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
226 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
229 my $opts = PVE
::Network
::SDN
::VnetPlugin-
>check_config($id, $param, 0, 1);
230 raise_param_exc
({ zone
=> "missing zone"}) if !$opts->{zone
};
231 my $subnets = PVE
::Network
::SDN
::Vnets
::get_subnets
($id);
232 raise_param_exc
({ zone
=> "can't change zone if subnets exists"}) if($subnets && $opts->{zone
} ne $cfg->{ids
}->{$id}->{zone
});
234 $cfg->{ids
}->{$id} = $opts;
236 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
237 my $zoneid = $cfg->{ids
}->{$id}->{zone
};
238 my $plugin_config = $zone_cfg->{ids
}->{$zoneid};
239 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($plugin_config->{type
});
240 $plugin->vnet_update_hook($cfg, $id, $zone_cfg);
242 PVE
::Network
::SDN
::VnetPlugin-
>on_update_hook($id, $cfg);
244 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
246 }, "update sdn vnet object failed");
252 __PACKAGE__-
>register_method ({
257 description
=> "Delete sdn vnet object configuration.",
259 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
262 additionalProperties
=> 0,
264 vnet
=> get_standard_option
('pve-sdn-vnet-id', {
265 completion
=> \
&PVE
::Network
::SDN
::Vnets
::complete_sdn_vnets
,
269 returns
=> { type
=> 'null' },
273 my $id = extract_param
($param, 'vnet');
275 PVE
::Network
::SDN
::lock_sdn_config
(sub {
276 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
277 my $scfg = PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $id); # check if exists
278 my $vnet_cfg = PVE
::Network
::SDN
::Vnets
::config
();
280 PVE
::Network
::SDN
::VnetPlugin-
>on_delete_hook($id, $vnet_cfg);
282 delete $cfg->{ids
}->{$id};
283 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
285 }, "delete sdn vnet object failed");