]>
Commit | Line | Data |
---|---|---|
86d22462 | 1 | package PVE::Network::SDN::VlanPlugin; |
f8140d53 AD |
2 | |
3 | use strict; | |
4 | use warnings; | |
86d22462 | 5 | use PVE::Network::SDN::Plugin; |
f8140d53 | 6 | |
86d22462 | 7 | use base('PVE::Network::SDN::Plugin'); |
f8140d53 AD |
8 | |
9 | sub type { | |
10 | return 'vlan'; | |
11 | } | |
12 | ||
8fb1ee7f AD |
13 | sub plugindata { |
14 | return { | |
15 | role => 'transport', | |
16 | }; | |
17 | } | |
18 | ||
6bffe819 AD |
19 | PVE::JSONSchema::register_format('pve-sdn-vlanrange', \&pve_verify_sdn_vlanrange); |
20 | sub pve_verify_sdn_vlanrange { | |
f8140d53 AD |
21 | my ($vlanstr) = @_; |
22 | ||
86d22462 | 23 | PVE::Network::SDN::Plugin::parse_tag_number_or_range($vlanstr, '4096'); |
f8140d53 AD |
24 | |
25 | return $vlanstr; | |
26 | } | |
27 | ||
28 | sub properties { | |
29 | return { | |
eec580bf AD |
30 | 'uplink-id' => { |
31 | type => 'integer', | |
32 | minimum => 1, maximum => 4096, | |
33 | description => 'Uplink interface', | |
34 | }, | |
f8140d53 | 35 | 'vlan-allowed' => { |
6bffe819 | 36 | type => 'string', format => 'pve-sdn-vlanrange', |
f8140d53 AD |
37 | description => "Allowed vlan range", |
38 | }, | |
f8140d53 AD |
39 | }; |
40 | } | |
41 | ||
42 | sub options { | |
43 | ||
44 | return { | |
41eec961 | 45 | 'uplink-id' => { optional => 0 }, |
f8140d53 | 46 | 'vlan-allowed' => { optional => 1 }, |
f8140d53 AD |
47 | }; |
48 | } | |
49 | ||
50 | # Plugin implementation | |
6bffe819 | 51 | sub generate_sdn_config { |
93dea3aa | 52 | my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $config) = @_; |
f8140d53 AD |
53 | |
54 | my $tag = $vnet->{tag}; | |
55 | my $mtu = $vnet->{mtu}; | |
dc7e431e | 56 | my $alias = $vnet->{alias}; |
f8140d53 | 57 | my $uplink = $plugin_config->{'uplink-id'}; |
f8140d53 AD |
58 | |
59 | die "missing vlan tag" if !$tag; | |
f8140d53 | 60 | |
83d209f5 TL |
61 | my $iface = $uplinks->{$uplink}->{name}; |
62 | $iface = "uplink${uplink}" if !$iface; | |
f8140d53 | 63 | $iface .= ".$tag"; |
93dea3aa AD |
64 | |
65 | #tagged interface | |
66 | my @iface_config = (); | |
93dea3aa | 67 | push @iface_config, "mtu $mtu" if $mtu; |
87d8b623 | 68 | push(@{$config->{$iface}}, @iface_config) if !$config->{$iface}; |
93dea3aa AD |
69 | |
70 | #vnet bridge | |
71 | @iface_config = (); | |
72 | push @iface_config, "bridge_ports $iface"; | |
73 | push @iface_config, "bridge_stp off"; | |
74 | push @iface_config, "bridge_fd 0"; | |
93dea3aa AD |
75 | push @iface_config, "mtu $mtu" if $mtu; |
76 | push @iface_config, "alias $alias" if $alias; | |
87d8b623 | 77 | push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid}; |
f8140d53 AD |
78 | |
79 | return $config; | |
80 | } | |
81 | ||
fe0c6b9e | 82 | sub on_delete_hook { |
6bffe819 | 83 | my ($class, $transportid, $sdn_cfg) = @_; |
fe0c6b9e | 84 | |
a8ad2789 | 85 | # verify that no vnet are associated to this transport |
6bffe819 AD |
86 | foreach my $id (keys %{$sdn_cfg->{ids}}) { |
87 | my $sdn = $sdn_cfg->{ids}->{$id}; | |
a8ad2789 | 88 | die "transport $transportid is used by vnet $id" |
6bffe819 | 89 | if ($sdn->{type} eq 'vnet' && defined($sdn->{transportzone}) && $sdn->{transportzone} eq $transportid); |
a8ad2789 | 90 | } |
fe0c6b9e AD |
91 | } |
92 | ||
e8d5906e | 93 | sub on_update_hook { |
6bffe819 | 94 | my ($class, $transportid, $sdn_cfg) = @_; |
da07e2b1 | 95 | |
6bffe819 | 96 | my $transport = $sdn_cfg->{ids}->{$transportid}; |
e8d5906e AD |
97 | |
98 | # verify that vlan-allowed don't conflict with another vlan-allowed transport | |
99 | ||
100 | # verify that vlan-allowed is matching currently vnet tag in this transport | |
da07e2b1 AD |
101 | my $vlanallowed = $transport->{'vlan-allowed'}; |
102 | if ($vlanallowed) { | |
6bffe819 AD |
103 | foreach my $id (keys %{$sdn_cfg->{ids}}) { |
104 | my $sdn = $sdn_cfg->{ids}->{$id}; | |
105 | if ($sdn->{type} eq 'vnet' && defined($sdn->{tag})) { | |
106 | if(defined($sdn->{transportzone}) && $sdn->{transportzone} eq $transportid) { | |
107 | my $tag = $sdn->{tag}; | |
da07e2b1 | 108 | eval { |
86d22462 | 109 | PVE::Network::SDN::Plugin::parse_tag_number_or_range($vlanallowed, '4096', $tag); |
da07e2b1 AD |
110 | }; |
111 | if($@) { | |
112 | die "vlan $tag is not allowed in transport $transportid"; | |
113 | } | |
114 | } | |
115 | } | |
116 | } | |
117 | } | |
e8d5906e AD |
118 | } |
119 | ||
f8140d53 AD |
120 | 1; |
121 | ||
122 |