]>
Commit | Line | Data |
---|---|---|
32602a38 AD |
1 | package PVE::Network::SDN::FrrPlugin; |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | use PVE::Network::SDN::Plugin; | |
6 | use PVE::Tools; | |
7 | ||
8 | use base('PVE::Network::SDN::Plugin'); | |
9 | ||
10 | sub type { | |
11 | return 'frr'; | |
12 | } | |
13 | ||
14 | sub properties { | |
15 | return { | |
16 | 'asn' => { | |
17 | type => 'integer', | |
18 | description => "autonomous system number", | |
19 | }, | |
20 | 'peers' => { | |
21 | description => "peers address list.", | |
22 | type => 'string', #fixme: format | |
23 | }, | |
24 | }; | |
25 | } | |
26 | ||
27 | sub options { | |
28 | ||
29 | return { | |
30 | 'uplink-id' => { optional => 0 }, | |
31 | 'asn' => { optional => 0 }, | |
32 | 'peers' => { optional => 0 }, | |
33 | }; | |
34 | } | |
35 | ||
36 | # Plugin implementation | |
37 | sub generate_frr_config { | |
38 | my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks) = @_; | |
39 | ||
40 | my $asn = $plugin_config->{'asn'}; | |
41 | my @peers = split(',', $plugin_config->{'peers'}) if $plugin_config->{'peers'}; | |
42 | ||
43 | my $uplink = $plugin_config->{'uplink-id'}; | |
44 | ||
45 | die "missing peers" if !$plugin_config->{'peers'}; | |
46 | ||
47 | my $iface = "uplink$uplink"; | |
48 | my $ifaceip = ""; | |
49 | ||
50 | if($uplinks->{$uplink}->{name}) { | |
51 | $iface = $uplinks->{$uplink}->{name}; | |
52 | $ifaceip = get_first_local_ipv4_from_interface($iface); | |
53 | } | |
54 | ||
55 | my $config = "\n"; | |
56 | $config .= "router bgp $asn\n"; | |
57 | $config .= "bgp router-id $ifaceip\n"; | |
58 | $config .= "no bgp default ipv4-unicast\n"; | |
59 | $config .= "coalesce-time 1000\n"; | |
60 | ||
61 | foreach my $address (@peers) { | |
62 | next if $address eq $ifaceip; | |
63 | $config .= "neighbor $address remote-as $asn\n"; | |
64 | } | |
65 | $config .= "!\n"; | |
66 | $config .= "address-family l2vpn evpn\n"; | |
67 | foreach my $address (@peers) { | |
68 | next if $address eq $ifaceip; | |
69 | $config .= " neighbor $address activate\n"; | |
70 | } | |
71 | $config .= " advertise-all-vni\n"; | |
72 | $config .= "exit-address-family\n"; | |
73 | $config .= "!\n"; | |
74 | $config .= "line vty\n"; | |
75 | $config .= "!\n"; | |
76 | ||
77 | ||
78 | return $config; | |
79 | } | |
80 | ||
81 | sub on_delete_hook { | |
82 | my ($class, $transportid, $sdn_cfg) = @_; | |
83 | ||
84 | } | |
85 | ||
86 | sub on_update_hook { | |
87 | my ($class, $transportid, $sdn_cfg) = @_; | |
88 | ||
89 | } | |
90 | ||
91 | 1; | |
92 | ||
93 |