]>
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
;
15 use Storable
qw(dclone);
16 use PVE
::JSONSchema
qw(get_standard_option);
17 use PVE
::RPCEnvironment
;
21 use base
qw(PVE::RESTHandler);
23 my $api_sdn_vnets_config = sub {
26 my $scfg = dclone
(PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $id));
28 $scfg->{digest
} = $cfg->{digest
};
33 __PACKAGE__-
>register_method ({
37 description
=> "SDN vnets index.",
39 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate'"
40 ." permissions on '/sdn/vnets/<vnet>'",
44 additionalProperties
=> 0,
52 links
=> [ { rel
=> 'child', href
=> "{vnet}" } ],
57 my $rpcenv = PVE
::RPCEnvironment
::get
();
58 my $authuser = $rpcenv->get_user();
60 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
62 my @sids = PVE
::Network
::SDN
::Vnets
::sdn_vnets_ids
($cfg);
64 foreach my $id (@sids) {
65 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
66 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$id", $privs, 1);
68 my $scfg = &$api_sdn_vnets_config($cfg, $id);
75 __PACKAGE__-
>register_method ({
79 description
=> "Read sdn vnet configuration.",
81 check
=> ['perm', '/sdn/vnets/{vnet}', ['SDN.Allocate']],
84 additionalProperties
=> 0,
86 vnet
=> get_standard_option
('pve-sdn-vnet-id', {
87 completion
=> \
&PVE
::Network
::SDN
::Vnets
::complete_sdn_vnets
,
91 returns
=> { type
=> 'object' },
95 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
97 return $api_sdn_vnets_config->($cfg, $param->{vnet
});
100 __PACKAGE__-
>register_method ({
105 description
=> "Create a new sdn vnet object.",
107 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
109 parameters
=> PVE
::Network
::SDN
::VnetPlugin-
>createSchema(),
110 returns
=> { type
=> 'null' },
114 my $type = extract_param
($param, 'type');
115 my $id = extract_param
($param, 'vnet');
117 PVE
::Cluster
::check_cfs_quorum
();
118 mkdir("/etc/pve/sdn");
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);
124 if (PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($cfg, $id, 1)) {
125 die "sdn vnet object ID '$id' already defined\n";
127 $cfg->{ids
}->{$id} = $opts;
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
});
135 PVE
::Network
::SDN
::VnetPlugin-
>on_update_hook($id, $cfg);
137 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
138 PVE
::Network
::SDN
::increase_version
();
140 }, "create sdn vnet object failed");
145 __PACKAGE__-
>register_method ({
150 description
=> "Update sdn vnet object configuration.",
152 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
154 parameters
=> PVE
::Network
::SDN
::VnetPlugin-
>updateSchema(),
155 returns
=> { type
=> 'null' },
159 my $id = extract_param
($param, 'vnet');
160 my $digest = extract_param
($param, 'digest');
162 PVE
::Network
::SDN
::lock_sdn_config
(sub {
163 my $cfg = PVE
::Network
::SDN
::Vnets
::config
();
165 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
167 my $opts = PVE
::Network
::SDN
::VnetPlugin-
>check_config($id, $param, 0, 1);
168 $cfg->{ids
}->{$id} = $opts;
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
});
176 PVE
::Network
::SDN
::VnetPlugin-
>on_update_hook($id, $cfg);
178 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
179 PVE
::Network
::SDN
::increase_version
();
181 }, "update sdn vnet object failed");
187 __PACKAGE__-
>register_method ({
192 description
=> "Delete sdn vnet object configuration.",
194 check
=> ['perm', '/sdn/vnets', ['SDN.Allocate']],
197 additionalProperties
=> 0,
199 vnet
=> get_standard_option
('pve-sdn-vnet-id', {
200 completion
=> \
&PVE
::Network
::SDN
::Vnets
::complete_sdn_vnets
,
204 returns
=> { type
=> 'null' },
208 my $id = extract_param
($param, 'vnet');
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
();
215 PVE
::Network
::SDN
::VnetPlugin-
>on_delete_hook($id, $vnet_cfg);
217 delete $cfg->{ids
}->{$id};
218 PVE
::Network
::SDN
::Vnets
::write_config
($cfg);
219 PVE
::Network
::SDN
::increase_version
();
221 }, "delete sdn vnet object failed");