]>
git.proxmox.com Git - pve-network.git/blob - PVE/API2/Network/SDN/Zones.pm
1 package PVE
::API2
::Network
::SDN
::Zones
;
7 use PVE
::Tools
qw(extract_param);
8 use PVE
::Cluster
qw(cfs_read_file cfs_write_file);
10 use PVE
::Network
::SDN
::Vnets
;
11 use PVE
::Network
::SDN
::Zones
;
12 use PVE
::Network
::SDN
::Dns
;
13 use PVE
::Network
::SDN
::Zones
::Plugin
;
14 use PVE
::Network
::SDN
::Zones
::VlanPlugin
;
15 use PVE
::Network
::SDN
::Zones
::QinQPlugin
;
16 use PVE
::Network
::SDN
::Zones
::VxlanPlugin
;
17 use PVE
::Network
::SDN
::Zones
::EvpnPlugin
;
18 use PVE
::Network
::SDN
::Zones
::FaucetPlugin
;
19 use PVE
::Network
::SDN
::Zones
::SimplePlugin
;
21 use Storable
qw(dclone);
22 use PVE
::JSONSchema
qw(get_standard_option);
23 use PVE
::RPCEnvironment
;
24 use PVE
::Exception
qw(raise raise_param_exc);
28 use base
qw(PVE::RESTHandler);
30 my $sdn_zones_type_enum = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup_types();
32 my $api_sdn_zones_config = sub {
35 my $scfg = dclone
(PVE
::Network
::SDN
::Zones
::sdn_zones_config
($cfg, $id));
37 $scfg->{digest
} = $cfg->{digest
};
40 $scfg->{nodes
} = PVE
::Network
::SDN
::Zones
::Plugin-
>encode_value($scfg->{type
}, 'nodes', $scfg->{nodes
});
43 my $pending = $scfg->{pending
};
44 if ($pending->{nodes
}) {
45 $pending->{nodes
} = PVE
::Network
::SDN
::Zones
::Plugin-
>encode_value($scfg->{type
}, 'nodes', $pending->{nodes
});
51 __PACKAGE__-
>register_method ({
55 description
=> "SDN zones index.",
57 description
=> "Only list entries where you have 'SDN.Audit' or 'SDN.Allocate' permissions on '/sdn/zones/<zone>'",
61 additionalProperties
=> 0,
64 description
=> "Only list sdn zones of specific type",
66 enum
=> $sdn_zones_type_enum,
72 description
=> "Display running config.",
77 description
=> "Display pending config.",
85 properties
=> { zone
=> { type
=> 'string'},
86 type
=> { type
=> 'string'},
87 mtu
=> { type
=> 'integer', optional
=> 1 },
88 dns
=> { type
=> 'string', optional
=> 1},
89 reversedns
=> { type
=> 'string', optional
=> 1},
90 dnszone
=> { type
=> 'string', optional
=> 1},
91 pending
=> { optional
=> 1},
92 state => { type
=> 'string', optional
=> 1},
93 nodes
=> { type
=> 'string', optional
=> 1},
96 links
=> [ { rel
=> 'child', href
=> "{zone}" } ],
101 my $rpcenv = PVE
::RPCEnvironment
::get
();
102 my $authuser = $rpcenv->get_user();
105 if($param->{pending
}) {
106 my $running_cfg = PVE
::Network
::SDN
::config
();
107 my $config = PVE
::Network
::SDN
::Zones
::config
();
108 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'zones');
109 } elsif ($param->{running
}) {
110 my $running_cfg = PVE
::Network
::SDN
::config
();
111 $cfg = $running_cfg->{zones
};
113 $cfg = PVE
::Network
::SDN
::Zones
::config
();
116 my @sids = PVE
::Network
::SDN
::Zones
::sdn_zones_ids
($cfg);
118 foreach my $id (@sids) {
119 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
120 next if !$rpcenv->check_any($authuser, "/sdn/zones/$id", $privs, 1);
122 my $scfg = &$api_sdn_zones_config($cfg, $id);
123 next if $param->{type
} && $param->{type
} ne $scfg->{type
};
125 my $plugin_config = $cfg->{ids
}->{$id};
126 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($plugin_config->{type
});
133 __PACKAGE__-
>register_method ({
137 description
=> "Read sdn zone configuration.",
139 check
=> ['perm', '/sdn/zones/{zone}', ['SDN.Allocate']],
143 additionalProperties
=> 0,
145 zone
=> get_standard_option
('pve-sdn-zone-id'),
149 description
=> "Display running config.",
154 description
=> "Display pending config.",
158 returns
=> { type
=> 'object' },
163 if($param->{pending
}) {
164 my $running_cfg = PVE
::Network
::SDN
::config
();
165 my $config = PVE
::Network
::SDN
::Zones
::config
();
166 $cfg = PVE
::Network
::SDN
::pending_config
($running_cfg, $config, 'zones');
167 } elsif ($param->{running
}) {
168 my $running_cfg = PVE
::Network
::SDN
::config
();
169 $cfg = $running_cfg->{zones
};
171 $cfg = PVE
::Network
::SDN
::Zones
::config
();
174 return &$api_sdn_zones_config($cfg, $param->{zone
});
177 __PACKAGE__-
>register_method ({
182 description
=> "Create a new sdn zone object.",
184 check
=> ['perm', '/sdn/zones', ['SDN.Allocate']],
186 parameters
=> PVE
::Network
::SDN
::Zones
::Plugin-
>createSchema(),
187 returns
=> { type
=> 'null' },
191 my $type = extract_param
($param, 'type');
192 my $id = extract_param
($param, 'zone');
194 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($type);
195 my $opts = $plugin->check_config($id, $param, 1, 1);
197 # create /etc/pve/sdn directory
198 PVE
::Cluster
::check_cfs_quorum
();
199 mkdir("/etc/pve/sdn");
201 PVE
::Network
::SDN
::lock_sdn_config
(
204 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
205 my $controller_cfg = PVE
::Network
::SDN
::Controllers
::config
();
206 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
209 if ($scfg = PVE
::Network
::SDN
::Zones
::sdn_zones_config
($zone_cfg, $id, 1)) {
210 die "sdn zone object ID '$id' already defined\n";
213 my $dnsserver = $opts->{dns
};
214 my $reversednsserver = $opts->{reversedns
};
215 my $dnszone = $opts->{dnszone
};
216 raise_param_exc
({ dns
=> "$dnsserver don't exist"}) if $dnsserver && !$dns_cfg->{ids
}->{$dnsserver};
217 raise_param_exc
({ reversedns
=> "$reversednsserver don't exist"}) if $reversednsserver && !$dns_cfg->{ids
}->{$reversednsserver};
218 raise_param_exc
({ dnszone
=> "missing dns server"}) if $dnszone && !$dnsserver;
220 $zone_cfg->{ids
}->{$id} = $opts;
221 $plugin->on_update_hook($id, $zone_cfg, $controller_cfg);
223 PVE
::Network
::SDN
::Zones
::write_config
($zone_cfg);
225 }, "create sdn zone object failed");
230 __PACKAGE__-
>register_method ({
235 description
=> "Update sdn zone object configuration.",
237 check
=> ['perm', '/sdn/zones', ['SDN.Allocate']],
239 parameters
=> PVE
::Network
::SDN
::Zones
::Plugin-
>updateSchema(),
240 returns
=> { type
=> 'null' },
244 my $id = extract_param
($param, 'zone');
245 my $digest = extract_param
($param, 'digest');
247 PVE
::Network
::SDN
::lock_sdn_config
(
250 my $zone_cfg = PVE
::Network
::SDN
::Zones
::config
();
251 my $controller_cfg = PVE
::Network
::SDN
::Controllers
::config
();
252 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
254 PVE
::SectionConfig
::assert_if_modified
($zone_cfg, $digest);
256 my $scfg = PVE
::Network
::SDN
::Zones
::sdn_zones_config
($zone_cfg, $id);
258 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($scfg->{type
});
259 my $opts = $plugin->check_config($id, $param, 0, 1);
261 foreach my $k (%$opts) {
262 $scfg->{$k} = $opts->{$k};
265 my $dnsserver = $opts->{dns
};
266 my $reversednsserver = $opts->{reversedns
};
267 my $dnszone = $opts->{dnszone
};
268 raise_param_exc
({ dns
=> "$dnsserver don't exist"}) if $dnsserver && !$dns_cfg->{ids
}->{$dnsserver};
269 raise_param_exc
({ reversedns
=> "$reversednsserver don't exist"}) if $reversednsserver && !$dns_cfg->{ids
}->{$reversednsserver};
270 raise_param_exc
({ dnszone
=> "missing dns server"}) if $dnszone && !$dnsserver;
272 $plugin->on_update_hook($id, $zone_cfg, $controller_cfg);
274 PVE
::Network
::SDN
::Zones
::write_config
($zone_cfg);
276 }, "update sdn zone object failed");
281 __PACKAGE__-
>register_method ({
286 description
=> "Delete sdn zone object configuration.",
288 check
=> ['perm', '/sdn/zones', ['SDN.Allocate']],
291 additionalProperties
=> 0,
293 zone
=> get_standard_option
('pve-sdn-zone-id', {
294 completion
=> \
&PVE
::Network
::SDN
::Zones
::complete_sdn_zones
,
298 returns
=> { type
=> 'null' },
302 my $id = extract_param
($param, 'zone');
304 PVE
::Network
::SDN
::lock_sdn_config
(
307 my $cfg = PVE
::Network
::SDN
::Zones
::config
();
309 my $scfg = PVE
::Network
::SDN
::Zones
::sdn_zones_config
($cfg, $id);
311 my $plugin = PVE
::Network
::SDN
::Zones
::Plugin-
>lookup($scfg->{type
});
313 my $vnet_cfg = PVE
::Network
::SDN
::Vnets
::config
();
315 $plugin->on_delete_hook($id, $vnet_cfg);
317 delete $cfg->{ids
}->{$id};
318 PVE
::Network
::SDN
::Zones
::write_config
($cfg);
320 }, "delete sdn zone object failed");