]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Subnets.pm
5899a1afe34eac14ef15bc01e754c748eab3ccf6
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'),
57 links
=> [ { rel
=> 'child', href
=> "{subnet}" } ],
62 my $rpcenv = PVE
::RPCEnvironment
::get
();
63 my $authuser = $rpcenv->get_user();
65 my $vnetid = $param->{vnet
};
67 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
69 my @sids = PVE
::Network
::SDN
::Subnets
::sdn_subnets_ids
($cfg);
71 foreach my $id (@sids) {
72 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
73 next if !$rpcenv->check_any($authuser, "/sdn/vnets/$vnetid/subnets/$id", $privs, 1);
75 my $scfg = &$api_sdn_subnets_config($cfg, $id);
76 next if !$scfg->{vnet
} || $scfg->{vnet
} ne $vnetid;
83 __PACKAGE__-
>register_method ({
87 description
=> "Read sdn subnet configuration.",
89 check
=> ['perm', '/sdn/vnets/{vnet}/subnets/{subnet}', ['SDN.Allocate']],
93 additionalProperties
=> 0,
95 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
96 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
97 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
101 returns
=> { type
=> 'object' },
105 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
106 my $scfg = &$api_sdn_subnets_config($cfg, $param->{subnet
});
108 raise_param_exc
({ vnet
=> "wrong vnet"}) if $param->{vnet
} ne $scfg->{vnet
};
113 __PACKAGE__-
>register_method ({
118 description
=> "Create a new sdn subnet object.",
120 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
122 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>createSchema(),
123 returns
=> { type
=> 'null' },
127 my $type = extract_param
($param, 'type');
128 my $cidr = extract_param
($param, 'subnet');
129 my $id = $cidr =~ s/\//-/r
;
131 # create /etc/pve/sdn directory
132 PVE
::Cluster
::check_cfs_quorum
();
133 mkdir("/etc/pve/sdn") if ! -d
'/etc/pve/sdn';
135 PVE
::Network
::SDN
::lock_sdn_config
(
138 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
139 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 1, 1);
142 if ($scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id, 1)) {
143 die "sdn subnet object ID '$id' already defined\n";
146 $cfg->{ids
}->{$id} = $opts;
147 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($id, $cfg);
149 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
150 my $ipam = $cfg->{ids
}->{$id}->{ipam
};
152 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$ipam_cfg->{ids
}->{$ipam};
153 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
154 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
155 $plugin->add_subnet($plugin_config, $id, $cfg->{ids
}->{$id});
156 $plugin->add_ip($plugin_config, $id, $opts->{gateway
}, 1) if $opts->{gateway
};
159 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
160 PVE
::Network
::SDN
::increase_version
();
162 }, "create sdn subnet object failed");
167 __PACKAGE__-
>register_method ({
172 description
=> "Update sdn subnet object configuration.",
174 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
176 parameters
=> PVE
::Network
::SDN
::SubnetPlugin-
>updateSchema(),
177 returns
=> { type
=> 'null' },
181 my $id = extract_param
($param, 'subnet');
182 my $digest = extract_param
($param, 'digest');
184 PVE
::Network
::SDN
::lock_sdn_config
(
187 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
188 my $scfg = &$api_sdn_subnets_config($cfg, $id);
190 PVE
::SectionConfig
::assert_if_modified
($cfg, $digest);
192 my $opts = PVE
::Network
::SDN
::SubnetPlugin-
>check_config($id, $param, 0, 1);
193 $cfg->{ids
}->{$id} = $opts;
195 PVE
::Network
::SDN
::SubnetPlugin-
>on_update_hook($id, $cfg);
197 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
198 my $ipam = $cfg->{ids
}->{$id}->{ipam
};
200 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$ipam_cfg->{ids
}->{$ipam};
201 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
202 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
203 $plugin->add_subnet($plugin_config, $id, $cfg->{ids
}->{$id});
205 if($opts->{gateway
} && $scfg->{gateway
} && $opts->{gateway
} ne $scfg->{gateway
}) {
206 $plugin->del_ip($plugin_config, $id, $scfg->{gateway
});
208 if (!defined($opts->{gateway
}) && $scfg->{gateway
}) {
209 $plugin->del_ip($plugin_config, $id, $scfg->{gateway
});
211 $plugin->add_ip($plugin_config, $id, $opts->{gateway
}, 1) if $opts->{gateway
};
214 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
215 PVE
::Network
::SDN
::increase_version
();
217 }, "update sdn subnet object failed");
222 __PACKAGE__-
>register_method ({
227 description
=> "Delete sdn subnet object configuration.",
229 check
=> ['perm', '/sdn/vnets/{vnet}/subnets', ['SDN.Allocate']],
232 additionalProperties
=> 0,
234 vnet
=> get_standard_option
('pve-sdn-vnet-id'),
235 subnet
=> get_standard_option
('pve-sdn-subnet-id', {
236 completion
=> \
&PVE
::Network
::SDN
::Subnets
::complete_sdn_subnets
,
240 returns
=> { type
=> 'null' },
244 my $id = extract_param
($param, 'subnet');
246 PVE
::Network
::SDN
::lock_sdn_config
(
248 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
250 my $scfg = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $id);
252 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
();
253 my $vnets_cfg = PVE
::Network
::SDN
::Vnets
::config
();
255 PVE
::Network
::SDN
::SubnetPlugin-
>on_delete_hook($id, $subnets_cfg, $vnets_cfg);
257 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
258 my $ipam = $cfg->{ids
}->{$id}->{ipam
};
260 raise_param_exc
({ ipam
=> "$ipam not existing"}) if !$ipam_cfg->{ids
}->{$ipam};
261 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
262 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
263 $plugin->del_subnet($plugin_config, $id, $scfg);
266 delete $cfg->{ids
}->{$id};
268 PVE
::Network
::SDN
::Subnets
::write_config
($cfg);
269 PVE
::Network
::SDN
::increase_version
();
271 }, "delete sdn subnet object failed");