]>
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
::Ipams
;
15 use PVE
::Network
::SDN
::Ipams
::Plugin
;
17 use Storable
qw(dclone);
18 use PVE
::JSONSchema
qw(get_standard_option);
19 use PVE
::RPCEnvironment
;
23 use base
qw(PVE::RESTHandler);
25 my $api_sdn_subnets_config = sub {
28 my $scfg = dclone
(PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id));
29 $scfg->{subnet
} = $id;
30 $scfg->{cidr
} = $id =~ s/-/\//r
;
31 $scfg->{digest
} = $cfg->{digest
};
36 __PACKAGE__-
>register_method ({
40 description
=> "SDN subnets index.",
42 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/subnets/<subnet>'",
46 additionalProperties
=> 0,
48 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
52 description
=> "Display running config.",
57 description
=> "Display pending config.",
67 links
=> [ { rel
=> 'child', href
=> "{subnet}" } ],
72 my $rpcenv = PVE
::RPCEnvironment
::get
();
73 my $authuser = $rpcenv->get_user();
75 my $vnetid = $param->{vnet
};
78 if($param->{pending
}) {
79 my $running_cfg = PVE
::Network
::SDN
::config
();
80 my $config = PVE
::Network
::SDN
::Subnets
::config
();
81 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'subnets');
82 } elsif ($param->{running
}) {
83 my $running_cfg = PVE
::Network
::SDN
::config
();
84 $cfg = $running_cfg->{subnets
};
86 $cfg = PVE
::Network
::SDN
::Subnets
::config
();
89 my @sids = PVE
::Network
::SDN
::Subnets
::sdn_subnets_ids
($cfg);
91 foreach my $id (@sids) {
92 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
93 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$vnetid/subnets/$id", $privs, 1);
95 my $scfg = &$api_sdn_subnets_config($cfg, $id);
96 next if !$scfg->{vnet
} || $scfg->{vnet
} ne $vnetid;
103 __PACKAGE__-
>register_method ({
107 description
=> "Read sdn subnet configuration.",
109 check
=> ['perm', '/sdn/vnets/{vnet}/subnets/{subnet}', ['SDN.Allocate']],
113 additionalProperties
=> 0,
115 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
116 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
117 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
122 description
=> "Display running config.",
127 description
=> "Display pending config.",
131 returns
=> { type
=> 'object' },
136 if($param->{pending
}) {
137 my $running_cfg = PVE
::Network
::SDN
::config
();
138 my $config = PVE
::Network
::SDN
::Subnets
::config
();
139 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'subnets');
140 } elsif ($param->{running
}) {
141 my $running_cfg = PVE
::Network
::SDN
::config
();
142 $cfg = $running_cfg->{subnets
};
144 $cfg = PVE
::Network
::SDN
::Subnets
::config
();
147 my $scfg = &$api_sdn_subnets_config($cfg, $param->{subnet
});
149 raise_param_exc
({ vnet
=> "wrong vnet"}) if $param->{vnet
} ne $scfg->{vnet
};
154 __PACKAGE__-
>register_method ({
159 description
=> "Create a new sdn subnet object.",
161 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
163 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>createSchema(),
164 returns
=> { type
=> 'null' },
168 my $type = extract_param
($param, 'type');
169 my $cidr = extract_param
($param, 'subnet');
170 my $id = $cidr =~ s/\//-/r
;
172 # create /etc/pve/sdn directory
173 PVE
::Cluster
::check_cfs_quorum
();
174 mkdir("/etc/pve/sdn") if ! -d
'/etc/pve/sdn';
176 PVE
::Network
::SDN
::lock_sdn_config
(
179 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
180 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 1, 1);
183 if ($scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id, 1)) {
184 die "sdn subnet object ID '$id' already defined\n";
187 $cfg->{ids
}->{$id} = $opts;
188 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($id, $opts);
190 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
192 }, "create sdn subnet object failed");
197 __PACKAGE__-
>register_method ({
202 description
=> "Update sdn subnet object configuration.",
204 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
206 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>updateSchema(),
207 returns
=> { type
=> 'null' },
211 my $id = extract_param
($param, 'subnet');
212 my $digest = extract_param
($param, 'digest');
214 PVE
::Network
::SDN
::lock_sdn_config
(
217 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
218 my $scfg = &$api_sdn_subnets_config($cfg, $id);
220 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
222 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 0, 1);
223 $cfg->{ids
}->{$id} = $opts;
225 raise_param_exc
({ ipam
=> "you can't change ipam"}) if $opts->{ipam
} && $scfg->{ipam
} && $opts->{ipam
} ne $scfg->{ipam
};
227 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($id, $opts, $scfg);
229 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
231 }, "update sdn subnet object failed");
236 __PACKAGE__-
>register_method ({
241 description
=> "Delete sdn subnet object configuration.",
243 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
246 additionalProperties
=> 0,
248 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
249 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
250 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
254 returns
=> { type
=> 'null' },
258 my $id = extract_param
($param, 'subnet');
260 PVE
::Network
::SDN
::lock_sdn_config
(
262 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
264 my $scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id);
266 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
();
267 my $vnets_cfg = PVE
::Network
::SDN
::Vnets
::config
();
269 PVE
::Network
::SDN
::SubnetPlugin-
>on_delete_hook($id, $subnets_cfg, $vnets_cfg);
271 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
272 my $ipam = $cfg->{ids
}->{$id}->{ipam
};
274 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$ipam_cfg->{ids
}->{$ipam};
275 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
276 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
277 $plugin->del_subnet($plugin_config, $id, $scfg);
280 delete $cfg->{ids
}->{$id};
282 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
284 }, "delete sdn subnet object failed");