]> git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Zones/VlanPlugin.pm
add tap|veth create|plug
[pve-network.git] / PVE / Network / SDN / Zones / VlanPlugin.pm
1 package PVE::Network::SDN::Zones::VlanPlugin;
2
3 use strict;
4 use warnings;
5 use PVE::Network::SDN::Zones::Plugin;
6
7 use base('PVE::Network::SDN::Zones::Plugin');
8
9 sub type {
10 return 'vlan';
11 }
12
13 PVE::JSONSchema::register_format('pve-sdn-vlanrange', \&pve_verify_sdn_vlanrange);
14 sub pve_verify_sdn_vlanrange {
15 my ($vlanstr) = @_;
16
17 PVE::Network::SDN::Zones::Plugin::parse_tag_number_or_range($vlanstr, '4096');
18
19 return $vlanstr;
20 }
21
22 sub properties {
23 return {
24 'bridge' => {
25 type => 'string',
26 },
27 };
28 }
29
30 sub options {
31
32 return {
33 nodes => { optional => 1},
34 'bridge' => { optional => 0 },
35 };
36 }
37
38 # Plugin implementation
39 sub generate_sdn_config {
40 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
41 return "";
42 }
43
44 sub status {
45 my ($class, $plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status) = @_;
46
47 my $bridge = $plugin_config->{bridge};
48 $vnet_status->{$id}->{zone} = $zone;
49 $zone_status->{$zone}->{status} = 'available' if !defined($zone_status->{$zone}->{status});
50
51 if($err_config) {
52 $vnet_status->{$id}->{status} = 'pending';
53 $vnet_status->{$id}->{statusmsg} = $err_config;
54 $zone_status->{$zone}->{status} = 'pending';
55 } elsif ($status->{$bridge}->{status} && $status->{$bridge}->{status} eq 'pass') {
56 $vnet_status->{$id}->{status} = 'available';
57 } else {
58 $vnet_status->{$id}->{status} = 'error';
59 $vnet_status->{$id}->{statusmsg} = 'missing bridge';
60 $zone_status->{$zone}->{status} = 'error';
61 }
62 }
63
64 sub get_bridge_vlan {
65 my ($class, $plugin_config, $vnetid, $tag) = @_;
66
67 my $bridge = $plugin_config->{bridge};
68
69 die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
70
71 my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
72 my $is_ovs = 1 if !-d "/sys/class/net/$bridge/brif";
73
74 die "bridge $bridge is not vlan aware" if !$is_ovs && !$vlan_aware;
75
76 return ($bridge, $tag);
77 }
78
79 1;
80
81