]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Subnets.pm
1 package PVE
::API2
::Network
::SDN
::Subnets
;
7 use PVE
::Tools
qw(extract_param);
8 use PVE
::Cluster
qw(cfs_read_file cfs_write_file);
9 use PVE
::Exception
qw(raise raise_param_exc);
10 use PVE
::Network
::SDN
;
11 use PVE
::Network
::SDN
::Subnets
;
12 use PVE
::Network
::SDN
::SubnetPlugin
;
13 use PVE
::Network
::SDN
::Vnets
;
14 use PVE
::Network
::SDN
::Zones
;
15 use PVE
::Network
::SDN
::Ipams
;
16 use PVE
::Network
::SDN
::Ipams
::Plugin
;
18 use Storable
qw(dclone);
19 use PVE
::JSONSchema
qw(get_standard_option);
20 use PVE
::RPCEnvironment
;
24 use base
qw(PVE::RESTHandler);
26 my $api_sdn_subnets_config = sub {
29 my $scfg = dclone
(PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id));
30 $scfg->{subnet
} = $id;
31 $scfg->{cidr
} = $id =~ s/-/\//r
;
32 $scfg->{digest
} = $cfg->{digest
};
37 __PACKAGE__-
>register_method ({
41 description
=> "SDN subnets index.",
43 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/subnets/<subnet>'",
47 additionalProperties
=> 0,
49 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
53 description
=> "Display running config.",
58 description
=> "Display pending config.",
68 links
=> [ { rel
=> 'child', href
=> "{subnet}" } ],
73 my $rpcenv = PVE
::RPCEnvironment
::get
();
74 my $authuser = $rpcenv->get_user();
76 my $vnetid = $param->{vnet
};
79 if($param->{pending
}) {
80 my $running_cfg = PVE
::Network
::SDN
::config
();
81 my $config = PVE
::Network
::SDN
::Subnets
::config
();
82 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'subnets');
83 } elsif ($param->{running
}) {
84 my $running_cfg = PVE
::Network
::SDN
::config
();
85 $cfg = $running_cfg->{subnets
};
87 $cfg = PVE
::Network
::SDN
::Subnets
::config
();
90 my @sids = PVE
::Network
::SDN
::Subnets
::sdn_subnets_ids
($cfg);
92 foreach my $id (@sids) {
93 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
94 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$vnetid/subnets/$id", $privs, 1);
96 my $scfg = &$api_sdn_subnets_config($cfg, $id);
97 next if !$scfg->{vnet
} || $scfg->{vnet
} ne $vnetid;
104 __PACKAGE__-
>register_method ({
108 description
=> "Read sdn subnet configuration.",
110 check
=> ['perm', '/sdn/vnets/{vnet}/subnets/{subnet}', ['SDN.Allocate']],
114 additionalProperties
=> 0,
116 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
117 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
118 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
123 description
=> "Display running config.",
128 description
=> "Display pending config.",
132 returns
=> { type
=> 'object' },
137 if($param->{pending
}) {
138 my $running_cfg = PVE
::Network
::SDN
::config
();
139 my $config = PVE
::Network
::SDN
::Subnets
::config
();
140 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'subnets');
141 } elsif ($param->{running
}) {
142 my $running_cfg = PVE
::Network
::SDN
::config
();
143 $cfg = $running_cfg->{subnets
};
145 $cfg = PVE
::Network
::SDN
::Subnets
::config
();
148 my $scfg = &$api_sdn_subnets_config($cfg, $param->{subnet
});
150 raise_param_exc
({ vnet
=> "wrong vnet"}) if $param->{vnet
} ne $scfg->{vnet
};
155 __PACKAGE__-
>register_method ({
160 description
=> "Create a new sdn subnet object.",
162 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
164 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>createSchema(),
165 returns
=> { type
=> 'null' },
169 my $type = extract_param
($param, 'type');
170 my $cidr = extract_param
($param, 'subnet');
171 my $id = $cidr =~ s/\//-/r
;
173 # create /etc/pve/sdn directory
174 PVE
::Cluster
::check_cfs_quorum
();
175 mkdir("/etc/pve/sdn") if ! -d
'/etc/pve/sdn';
177 PVE
::Network
::SDN
::lock_sdn_config
(
180 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
181 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
182 my $vnet_cfg = PVE
::Network
::SDN
::Vnets
::config
();
183 my $vnet = $param->{vnet
};
184 my $zoneid = $vnet_cfg->{ids
}->{$vnet}->{zone
};
185 my $zone = $zone_cfg->{ids
}->{$zoneid};
187 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 1, 1);
190 if ($scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id, 1)) {
191 die "sdn subnet object ID '$id' already defined\n";
194 $cfg->{ids
}->{$id} = $opts;
195 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($zone, $id, $opts);
197 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
199 }, "create sdn subnet object failed");
204 __PACKAGE__-
>register_method ({
209 description
=> "Update sdn subnet object configuration.",
211 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
213 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>updateSchema(),
214 returns
=> { type
=> 'null' },
218 my $id = extract_param
($param, 'subnet');
219 my $digest = extract_param
($param, 'digest');
221 PVE
::Network
::SDN
::lock_sdn_config
(
224 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
225 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
226 my $vnet_cfg = PVE
::Network
::SDN
::Vnets
::config
();
227 my $vnet = $param->{vnet
};
228 my $zoneid = $vnet_cfg->{ids
}->{$vnet}->{zone
};
229 my $zone = $zone_cfg->{ids
}->{$zoneid};
231 my $scfg = &$api_sdn_subnets_config($cfg, $id);
233 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
235 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 0, 1);
236 $cfg->{ids
}->{$id} = $opts;
238 raise_param_exc
({ ipam
=> "you can't change ipam"}) if $opts->{ipam
} && $scfg->{ipam
} && $opts->{ipam
} ne $scfg->{ipam
};
240 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($zone, $id, $opts, $scfg);
242 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
244 }, "update sdn subnet object failed");
249 __PACKAGE__-
>register_method ({
254 description
=> "Delete sdn subnet object configuration.",
256 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
259 additionalProperties
=> 0,
261 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
262 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
263 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
267 returns
=> { type
=> 'null' },
271 my $id = extract_param
($param, 'subnet');
273 PVE
::Network
::SDN
::lock_sdn_config
(
275 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
277 my $scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id);
279 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
();
280 my $vnets_cfg = PVE
::Network
::SDN
::Vnets
::config
();
282 PVE
::Network
::SDN
::SubnetPlugin-
>on_delete_hook($id, $subnets_cfg, $vnets_cfg);
284 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
285 my $ipam = $cfg->{ids
}->{$id}->{ipam
};
287 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$ipam_cfg->{ids
}->{$ipam};
288 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
289 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
290 $plugin->del_subnet($plugin_config, $id, $scfg);
293 delete $cfg->{ids
}->{$id};
295 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
297 }, "delete sdn subnet object failed");