]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/VlanPlugin.pm
api2 : sdn : add role and type to index
[pve-network.git] / PVE / Network / SDN / VlanPlugin.pm
CommitLineData
86d22462 1package PVE::Network::SDN::VlanPlugin;
f8140d53
AD
2
3use strict;
4use warnings;
86d22462 5use PVE::Network::SDN::Plugin;
f8140d53 6
86d22462 7use base('PVE::Network::SDN::Plugin');
f8140d53
AD
8
9sub type {
10 return 'vlan';
11}
12
8fb1ee7f
AD
13sub plugindata {
14 return {
15 role => 'transport',
16 };
17}
18
6bffe819
AD
19PVE::JSONSchema::register_format('pve-sdn-vlanrange', \&pve_verify_sdn_vlanrange);
20sub 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
28sub 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
42sub 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 51sub 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 82sub 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 93sub 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
1201;
121
122