]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Controllers.pm
1 package PVE
::API2
::Network
::SDN
::Controllers
;
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
::Controllers
;
12 use PVE
::Network
::SDN
::Controllers
::Plugin
;
13 use PVE
::Network
::SDN
::Controllers
::EvpnPlugin
;
14 use PVE
::Network
::SDN
::Controllers
::BgpPlugin
;
15 use PVE
::Network
::SDN
::Controllers
::FaucetPlugin
;
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 $sdn_controllers_type_enum = PVE
::Network
::SDN
::Controllers
::Plugin-
>lookup_types();
27 my $api_sdn_controllers_config = sub {
30 my $scfg = dclone
(PVE
::Network
::SDN
::Controllers
::sdn_controllers_config
($cfg, $id));
31 $scfg->{controller
} = $id;
32 $scfg->{digest
} = $cfg->{digest
};
37 __PACKAGE__-
>register_method ({
41 description
=> "SDN controllers index.",
43 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/controllers/<controller>'",
47 additionalProperties
=> 0,
50 description
=> "Only list sdn controllers of specific type",
52 enum
=> $sdn_controllers_type_enum,
58 description
=> "Display running config.",
63 description
=> "Display pending config.",
71 properties
=> { controller
=> { type
=> 'string' },
72 type
=> { type
=> 'string' },
73 state => { type
=> 'string', optional
=> 1 },
74 pending
=> { optional
=> 1},
77 links
=> [ { rel
=> 'child', href
=> "{controller}" } ],
82 my $rpcenv = PVE
::RPCEnvironment
::get
();
83 my $authuser = $rpcenv->get_user();
86 if($param->{pending
}) {
87 my $running_cfg = PVE
::Network
::SDN
::config
();
88 my $config = PVE
::Network
::SDN
::Controllers
::config
();
89 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'controllers');
90 } elsif ($param->{running
}) {
91 my $running_cfg = PVE
::Network
::SDN
::config
();
92 $cfg = $running_cfg->{controllers
};
94 $cfg = PVE
::Network
::SDN
::Controllers
::config
();
97 my @sids = PVE
::Network
::SDN
::Controllers
::sdn_controllers_ids
($cfg);
99 foreach my $id (@sids) {
100 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
101 next if !$rpcenv->check_any($authuser, "/sdn/controllers/$id", $privs, 1);
103 my $scfg = &$api_sdn_controllers_config($cfg, $id);
104 next if $param->{type
} && $param->{type
} ne $scfg->{type
};
106 my $plugin_config = $cfg->{ids
}->{$id};
107 my $plugin = PVE
::Network
::SDN
::Controllers
::Plugin-
>lookup($plugin_config->{type
});
114 __PACKAGE__-
>register_method ({
116 path
=> '{controller}',
118 description
=> "Read sdn controller configuration.",
120 check
=> ['perm', '/sdn/controllers/{controller}', ['SDN.Allocate']],
124 additionalProperties
=> 0,
126 controller
=> get_standard_option
('pve-sdn-controller-id'),
130 description
=> "Display running config.",
135 description
=> "Display pending config.",
139 returns
=> { type
=> 'object' },
144 if($param->{pending
}) {
145 my $running_cfg = PVE
::Network
::SDN
::config
();
146 my $config = PVE
::Network
::SDN
::Controllers
::config
();
147 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'controllers');
148 } elsif ($param->{running
}) {
149 my $running_cfg = PVE
::Network
::SDN
::config
();
150 $cfg = $running_cfg->{controllers
};
152 $cfg = PVE
::Network
::SDN
::Controllers
::config
();
155 return &$api_sdn_controllers_config($cfg, $param->{controller
});
158 __PACKAGE__-
>register_method ({
163 description
=> "Create a new sdn controller object.",
165 check
=> ['perm', '/sdn/controllers', ['SDN.Allocate']],
167 parameters
=> PVE
::Network
::SDN
::Controllers
::Plugin-
>createSchema(),
168 returns
=> { type
=> 'null' },
172 my $type = extract_param
($param, 'type');
173 my $id = extract_param
($param, 'controller');
175 my $plugin = PVE
::Network
::SDN
::Controllers
::Plugin-
>lookup($type);
176 my $opts = $plugin->check_config($id, $param, 1, 1);
178 # create /etc/pve/sdn directory
179 PVE
::Cluster
::check_cfs_quorum
();
180 mkdir("/etc/pve/sdn");
182 PVE
::Network
::SDN
::lock_sdn_config
(
185 my $controller_cfg = PVE
::Network
::SDN
::Controllers
::config
();
188 if ($scfg = PVE
::Network
::SDN
::Controllers
::sdn_controllers_config
($controller_cfg, $id, 1)) {
189 die "sdn controller object ID '$id' already defined\n";
192 $controller_cfg->{ids
}->{$id} = $opts;
193 $plugin->on_update_hook($id, $controller_cfg);
195 PVE
::Network
::SDN
::Controllers
::write_config
($controller_cfg);
197 }, "create sdn controller object failed");
202 __PACKAGE__-
>register_method ({
205 path
=> '{controller}',
207 description
=> "Update sdn controller object configuration.",
209 check
=> ['perm', '/sdn/controllers', ['SDN.Allocate']],
211 parameters
=> PVE
::Network
::SDN
::Controllers
::Plugin-
>updateSchema(),
212 returns
=> { type
=> 'null' },
216 my $id = extract_param
($param, 'controller');
217 my $digest = extract_param
($param, 'digest');
219 PVE
::Network
::SDN
::lock_sdn_config
(
222 my $controller_cfg = PVE
::Network
::SDN
::Controllers
::config
();
224 PVE
::SectionConfig
::assert_if_modified
($controller_cfg, $digest);
226 my $scfg = PVE
::Network
::SDN
::Controllers
::sdn_controllers_config
($controller_cfg, $id);
228 my $plugin = PVE
::Network
::SDN
::Controllers
::Plugin-
>lookup($scfg->{type
});
229 my $opts = $plugin->check_config($id, $param, 0, 1);
231 foreach my $k (%$opts) {
232 $scfg->{$k} = $opts->{$k};
235 $plugin->on_update_hook($id, $controller_cfg);
237 PVE
::Network
::SDN
::Controllers
::write_config
($controller_cfg);
240 }, "update sdn controller object failed");
245 __PACKAGE__-
>register_method ({
248 path
=> '{controller}',
250 description
=> "Delete sdn controller object configuration.",
252 check
=> ['perm', '/sdn/controllers', ['SDN.Allocate']],
255 additionalProperties
=> 0,
257 controller
=> get_standard_option
('pve-sdn-controller-id', {
258 completion
=> \
&PVE
::Network
::SDN
::Controllers
::complete_sdn_controllers
,
262 returns
=> { type
=> 'null' },
266 my $id = extract_param
($param, 'controller');
268 PVE
::Network
::SDN
::lock_sdn_config
(
271 my $cfg = PVE
::Network
::SDN
::Controllers
::config
();
273 my $scfg = PVE
::Network
::SDN
::Controllers
::sdn_controllers_config
($cfg, $id);
275 my $plugin = PVE
::Network
::SDN
::Controllers
::Plugin-
>lookup($scfg->{type
});
277 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
279 $plugin->on_delete_hook($id, $zone_cfg);
281 delete $cfg->{ids
}->{$id};
282 PVE
::Network
::SDN
::Controllers
::write_config
($cfg);
284 }, "delete sdn controller object failed");